Merge "Move Settings preferenceCategory style into SettingsTheme"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9b8327c..c946122 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2742,6 +2742,19 @@
</activity>
<activity
+ android:name="Settings$PremiumSmsAccessActivity"
+ android:label="@string/premium_sms_access"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.settings.PREMIUM_SMS_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="package" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.applications.specialaccess.premiumsms.PremiumSmsAccess" />
+ </activity>
+
+ <activity
android:name="Settings$SoundSettingsActivity"
android:label="@string/sound_settings"
android:icon="@drawable/ic_homepage_sound"
@@ -3446,21 +3459,6 @@
</intent-filter>
</activity>
- <activity-alias
- android:name="MediaOutputSlice"
- android:label="@string/media_output_panel_title"
- android:exported="true"
- android:targetActivity=".panel.SettingsPanelActivity">
- <intent-filter>
- <action android:name="com.android.settings.panel.action.MEDIA_OUTPUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.android.settings.panel.action.MEDIA_OUTPUT_GROUP" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity-alias>
-
<provider android:name=".slices.SettingsSliceProvider"
android:authorities="com.android.settings.slices;android.settings.slices"
android:exported="true"
diff --git a/res/drawable/ic_airplane_safe_networks_24dp.xml b/res/drawable/ic_airplane_safe_networks_24dp.xml
new file mode 100644
index 0000000..6c0d9f7
--- /dev/null
+++ b/res/drawable/ic_airplane_safe_networks_24dp.xml
@@ -0,0 +1,35 @@
+<!--
+ 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
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16,17.5V16l-5.89,-3.75V8.12C10.11,7.5 9.61,7 9,7S7.89,7.5 7.89,8.12v4.12L2,16v1.5l5.89,-1.88v4.12l-1.47,1.12V22L9,21.25L11.58,22v-1.12l-1.47,-1.12v-4.12L16,17.5z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M18.05,9.59C17.69,9.22 17.19,9 16.64,9c-0.55,0 -1.05,0.22 -1.41,0.59L16.64,11L18.05,9.59z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.64,7.5c0.96,0 1.84,0.39 2.47,1.03l1.42,-1.42c-1,-1 -2.37,-1.61 -3.89,-1.61s-2.89,0.62 -3.89,1.61l1.42,1.42C14.8,7.89 15.67,7.5 16.64,7.5z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.64,4c1.93,0 3.68,0.79 4.95,2.05L23,4.64C21.37,3.01 19.12,2 16.64,2c-2.49,0 -4.74,1.01 -6.36,2.64l1.42,1.42C12.96,4.79 14.71,4 16.64,4z"/>
+</vector>
diff --git a/res/drawable/ic_signal_strength_zero_bar_no_internet.xml b/res/drawable/ic_signal_strength_zero_bar_no_internet.xml
new file mode 100644
index 0000000..f38a368
--- /dev/null
+++ b/res/drawable/ic_signal_strength_zero_bar_no_internet.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0"
+ android:tint="?android:attr/colorControlNormal">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M2,22l16,0l0,-2l-11,0l13,-13l0,1l2,0l0,-6z"
+ android:strokeAlpha="0.3"
+ android:fillAlpha="0.3"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M20,10h2v8h-2z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M20,20h2v2h-2z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout-land/choose_lock_pattern.xml b/res/layout-land/choose_lock_pattern.xml
index df40ed4..29c3350 100644
--- a/res/layout-land/choose_lock_pattern.xml
+++ b/res/layout-land/choose_lock_pattern.xml
@@ -37,7 +37,7 @@
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1.0"
- android:layout_marginStart="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
android:layout_marginBottom="@dimen/sud_content_frame_padding_bottom"
android:clipChildren="false"
android:clipToPadding="false"
diff --git a/res/layout-land/confirm_lock_password.xml b/res/layout-land/confirm_lock_password.xml
index 7872585..775f9ad 100644
--- a/res/layout-land/confirm_lock_password.xml
+++ b/res/layout-land/confirm_lock_password.xml
@@ -33,16 +33,16 @@
style="@style/SudDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
<Button
android:id="@+id/forgotButton"
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_gravity="center"
android:visibility="gone" />
@@ -75,8 +75,8 @@
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="80dp"
android:layout_gravity="center_horizontal"
android:text="@string/cancel" />
diff --git a/res/layout-land/confirm_lock_pattern.xml b/res/layout-land/confirm_lock_pattern.xml
index 861c00a..1fd6824 100644
--- a/res/layout-land/confirm_lock_pattern.xml
+++ b/res/layout-land/confirm_lock_pattern.xml
@@ -58,16 +58,16 @@
style="@style/SudDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
<Button
android:id="@+id/cancelButton"
style="@style/SetupWizardButton.Negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:text="@string/cancel" />
<Button
@@ -75,8 +75,8 @@
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_gravity="center"
android:visibility="gone" />
@@ -91,8 +91,8 @@
android:id="@+id/errorText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="24dp"
android:gravity="center_vertical"/>
diff --git a/res/layout-land/confirm_lock_pattern_normal.xml b/res/layout-land/confirm_lock_pattern_normal.xml
index ded8d1a..7a59894 100644
--- a/res/layout-land/confirm_lock_pattern_normal.xml
+++ b/res/layout-land/confirm_lock_pattern_normal.xml
@@ -58,16 +58,16 @@
android:id="@+id/sud_layout_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
<Button
android:id="@+id/cancelButton"
style="@style/SetupWizardButton.Negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:text="@string/cancel" />
<Space
@@ -81,8 +81,8 @@
android:id="@+id/errorText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="24dp"
android:gravity="center_vertical"/>
</LinearLayout>
diff --git a/res/layout-land/fingerprint_enroll_enrolling.xml b/res/layout-land/fingerprint_enroll_enrolling.xml
index 3b77b84..184c9c6 100644
--- a/res/layout-land/fingerprint_enroll_enrolling.xml
+++ b/res/layout-land/fingerprint_enroll_enrolling.xml
@@ -42,7 +42,7 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
- android:layout_marginStart="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
android:layout_marginBottom="@dimen/sud_content_frame_padding_bottom"
android:clipChildren="false"
android:clipToPadding="false"
diff --git a/res/layout-land/fingerprint_enroll_find_sensor.xml b/res/layout-land/fingerprint_enroll_find_sensor.xml
index fe9b3d7..5d3e851 100644
--- a/res/layout-land/fingerprint_enroll_find_sensor.xml
+++ b/res/layout-land/fingerprint_enroll_find_sensor.xml
@@ -34,7 +34,7 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
- android:layout_marginStart="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
android:layout_marginBottom="@dimen/sud_content_frame_padding_bottom"
android:clipChildren="false"
android:clipToPadding="false"
diff --git a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
index 240dbb5..95fef90 100644
--- a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
@@ -33,8 +33,8 @@
style="@style/TextAppearance.SudGlifBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"/>
<LinearLayout
@@ -63,8 +63,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:visibility="invisible"/>
diff --git a/res/layout/adb_qrcode_scanner_fragment.xml b/res/layout/adb_qrcode_scanner_fragment.xml
index 9a337d9..5b83cb2 100644
--- a/res/layout/adb_qrcode_scanner_fragment.xml
+++ b/res/layout/adb_qrcode_scanner_fragment.xml
@@ -41,8 +41,8 @@
style="@style/TextAppearance.SudGlifBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:accessibilityLiveRegion="polite"/>
@@ -72,8 +72,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:visibility="invisible"/>
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 0a2294f..556bdd0 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -74,7 +74,8 @@
style="@style/SudDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginHorizontal="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:minLines="2" />
<TextView android:id="@+id/headerText"
@@ -82,7 +83,8 @@
android:layout_height="wrap_content"
android:minLines="2"
android:gravity="center"
- android:paddingHorizontal="?attr/sudMarginSides"
+ android:paddingStart="?attr/sudMarginStart"
+ android:paddingEnd="?attr/sudMarginEnd"
android:textSize="12sp" />
<com.google.android.setupdesign.view.FillContentLayout
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
index a0935bf..a1525b7 100644
--- a/res/layout/confirm_lock_password_base.xml
+++ b/res/layout/confirm_lock_password_base.xml
@@ -51,16 +51,16 @@
style="@style/SudDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
<Button
android:id="@+id/forgotButton"
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_gravity="center"
android:visibility="gone" />
</LinearLayout>
@@ -108,8 +108,8 @@
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="80dp"
android:layout_gravity="center_horizontal"
android:text="@string/cancel" />
diff --git a/res/layout/confirm_lock_password_normal.xml b/res/layout/confirm_lock_password_normal.xml
index 9021f24..089ecdc 100644
--- a/res/layout/confirm_lock_password_normal.xml
+++ b/res/layout/confirm_lock_password_normal.xml
@@ -32,8 +32,8 @@
style="@style/SudDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
<Space
android:layout_width="match_parent"
@@ -78,8 +78,8 @@
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="80dp"
android:layout_gravity="center_horizontal"
android:text="@string/cancel" />
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
index 9a37eaa..895bb8a 100644
--- a/res/layout/confirm_lock_pattern_base.xml
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -52,16 +52,16 @@
style="@style/SudDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
<Button
android:id="@+id/cancelButton"
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="80dp"
android:text="@string/cancel" />
@@ -70,8 +70,8 @@
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_gravity="center"
android:visibility="gone" />
@@ -107,7 +107,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:layout_marginHorizontal="?attr/sudMarginSides"
+ android:paddingStart="?attr/sudMarginStart"
+ android:paddingEnd="?attr/sudMarginEnd"
android:layout_marginTop="12dp"
android:gravity="center_vertical"/>
diff --git a/res/layout/confirm_lock_pattern_normal_base.xml b/res/layout/confirm_lock_pattern_normal_base.xml
index 7e2cf8e..7c1502d 100644
--- a/res/layout/confirm_lock_pattern_normal_base.xml
+++ b/res/layout/confirm_lock_pattern_normal_base.xml
@@ -51,8 +51,8 @@
android:id="@+id/sud_layout_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides" />
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd" />
</LinearLayout>
@@ -86,7 +86,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:layout_marginHorizontal="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginTop="12dp"
android:gravity="center_vertical"/>
@@ -95,8 +96,8 @@
style="@style/SudGlifButton.Secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:layout_marginBottom="80dp"
android:text="@string/cancel" />
diff --git a/res/layout/emergency_gesture_number_override_dialog.xml b/res/layout/emergency_gesture_number_override_dialog.xml
index 6ac8ad0..429cff8 100644
--- a/res/layout/emergency_gesture_number_override_dialog.xml
+++ b/res/layout/emergency_gesture_number_override_dialog.xml
@@ -32,7 +32,8 @@
android:imeOptions="actionDone"
android:inputType="numberSigned"
android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/min_tap_target_size"/>
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/layout/emergency_gesture_switch_bar.xml b/res/layout/emergency_gesture_switch_bar.xml
index 30c32f5..2524601 100644
--- a/res/layout/emergency_gesture_switch_bar.xml
+++ b/res/layout/emergency_gesture_switch_bar.xml
@@ -20,7 +20,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:importantForAccessibility="no">
<com.android.settings.widget.SwitchBar
android:id="@+id/switch_bar"
diff --git a/res/layout/panel_slice_slider_row_large_icon.xml b/res/layout/panel_slice_slider_row_large_icon.xml
deleted file mode 100644
index fa5c4cd..0000000
--- a/res/layout/panel_slice_slider_row_large_icon.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/slice_slider_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <androidx.slice.widget.SliceView
- android:id="@+id/slice_view"
- style="@style/Widget.SliceView.Panel.Slider.LargeIcon"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="0dp"
- android:paddingEnd="0dp"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/settings_homepage_container.xml b/res/layout/settings_homepage_container.xml
index f210c54..fe119c6 100644
--- a/res/layout/settings_homepage_container.xml
+++ b/res/layout/settings_homepage_container.xml
@@ -57,6 +57,41 @@
android:layout_height="wrap_content"
android:touchscreenBlocksFocus="false"
android:keyboardNavigationCluster="false">
- <include layout="@layout/search_bar"/>
+ <LinearLayout
+ android:id="@+id/app_bar_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">
+
+ <LinearLayout
+ android:id="@+id/contextual_suggestion_content"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/suggestion_height"
+ android:paddingHorizontal="@dimen/suggestion_padding_horizontal"
+ android:paddingBottom="@dimen/suggestion_padding_bottom"
+ android:orientation="vertical"
+ android:gravity="bottom"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/suggestion_title"
+ android:text="@string/settings_label"
+ style="@style/ContextualSuggestionText"/>
+
+ <Button
+ android:id="@+id/suggestion_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/suggestion_button_margin_top"
+ android:paddingHorizontal="@dimen/suggestion_button_padding_horizontal"
+ android:visibility="gone"
+ style="@style/ActionPrimaryButton"/>
+
+ </LinearLayout>
+
+ <include layout="@layout/search_bar"/>
+
+ </LinearLayout>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/layout/storage_wizard_init.xml b/res/layout/storage_wizard_init.xml
index 8d9870f..e1e78331 100644
--- a/res/layout/storage_wizard_init.xml
+++ b/res/layout/storage_wizard_init.xml
@@ -41,7 +41,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:layout_marginStart="@dimen/sud_glif_margin_sides"
+ android:layout_marginStart="@dimen/sud_glif_margin_start"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
@@ -108,7 +108,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:layout_marginStart="@dimen/sud_glif_margin_sides"
+ android:layout_marginStart="@dimen/sud_glif_margin_start"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
diff --git a/res/layout/wifi_dpp_add_device_fragment.xml b/res/layout/wifi_dpp_add_device_fragment.xml
index 8ad6391..3eef1ab 100644
--- a/res/layout/wifi_dpp_add_device_fragment.xml
+++ b/res/layout/wifi_dpp_add_device_fragment.xml
@@ -33,8 +33,8 @@
style="@style/TextAppearance.SudGlifBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:accessibilityLiveRegion="polite"/>
diff --git a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml
index 534f32e..10b4702 100644
--- a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml
+++ b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml
@@ -33,8 +33,8 @@
style="@style/TextAppearance.SudGlifBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:accessibilityLiveRegion="polite"/>
diff --git a/res/layout/wifi_dpp_qrcode_generator_fragment.xml b/res/layout/wifi_dpp_qrcode_generator_fragment.xml
index 1d9656c..d283bfd 100644
--- a/res/layout/wifi_dpp_qrcode_generator_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_generator_fragment.xml
@@ -33,8 +33,8 @@
style="@style/TextAppearance.SudGlifBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:accessibilityLiveRegion="polite"/>
diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
index 3d1e99b..209619c 100644
--- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
@@ -33,8 +33,8 @@
style="@style/TextAppearance.SudGlifBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:accessibilityLiveRegion="polite"/>
@@ -64,8 +64,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
- android:layout_marginStart="?attr/sudMarginSides"
- android:layout_marginEnd="?attr/sudMarginSides"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
android:textAlignment="center"
android:visibility="invisible"/>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 65d11a9..77afb05 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-adresse"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Gestoorde netwerke"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Intekeninge"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Ander netwerke"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-instellings"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi se gevorderde instellngs is nie vir hierdie gebruiker beskikbaar nie"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Stoor"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Vee toegangspunt uit"</string>
<string name="menu_new" msgid="6571230342655509006">"Nuwe toegangspunt"</string>
<string name="menu_save" msgid="6611465355127483100">"Stoor"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Gooi weg"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Kanselleer"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Die naamveld kan nie leeg wees nie."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Die APN kan nie leeg wees nie."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Programme kan teruggestel word"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Stel terug: Wi-Fi, mobiel en Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Dit sal alle netwerkinstellings terugstel, insluitend:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobiele data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Vee uit"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Vee afgelaaide SIM-kaarte uit"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Kontak jou diensverskaffer om plaasvervanger-SIM-kaarte af te laai. Dit sal nie enige mobieletoestel-diensplanne kanselleer nie."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Dit sal geen mobielediensplanne kanselleer nie. Kontak jou diensverskaffer om vervanging-SIM\'s af te laai."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Stel instellings terug"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Stel alle netwerkinstellings terug? Jy kan nie hierdie handeling ontdoen nie."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Stel alle netwerkinstellings terug en vee afgelaaide SIM-kaarte uit? Jy kan nie hierdie handeling ontdoen nie."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet is meer as gewoonlik gebruik"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Toestel is meer as gewoonlik gebruik"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Battery kan gouer as gewoonlik afloop"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Bewaar tans batterygesondheid"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimeer tans vir batterygesondheid"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Battery word tydelik beperk. Tik om meer te wete te kom."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Jou foon is meer as normaalweg gebruik. Jou battery kan gouer as verwag afloop.\n\nTopprogramme volgens batterygebruik:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Jou tablet is meer as normaalweg gebruik. Jou battery kan gouer as verwag afloop.\n\nTopprogramme volgens batterygebruik:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimum aantal sigbare datastelle"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Stel terug na verstekwaardes"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Outovul-ontwikkelaaropsies is teruggestel"</string>
+ <string name="location_category" msgid="3496759112306219062">"Ligging"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Statusbalkligging-aanduier"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Wys vir alle liggings, insluitend netwerk en konnektiwiteit"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Dwing vol GNSS-metings af"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spoor alle GNSS-konstellasies en -frekwensies na sonder enige dienssiklussering"</string>
<string name="device_theme" msgid="5027604586494772471">"Toesteltema"</string>
<string name="default_theme" msgid="4815428567082263639">"Verstek"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Netwerknaam"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Onderbreek kennisgewings om gefokus te bly"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Kenmerk is nie beskikbaar nie"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Hierdie kenmerk is afgeskakel omdat dit jou foon stadiger maak"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Dwing vol GNSS-metings af"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spoor alle GNSS-konstellasies en -frekwensies na sonder enige dienssiklussering"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Wys altyd omvaldialoog"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Wys dialoog elke keer as \'n program omval"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Kies ANGLE-geaktiveerde program"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Met Wi-fi-oproepe kan jy oproepe oor niediensverskaffer-netwerke soos sommige wi-fi-netwerke maak en ontvang."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Oproepe"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"voorkeur"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"verkies oproepe"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"verkies SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nie beskikbaar nie"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Geen SIM nie"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Voorkeure"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Koppel aan publieke netwerke"</string>
<string name="keywords_internet" msgid="7674082764898690310">"netwerkverbinding, internet, draadloos, data, wifi, wi-fi, wi fi, sellulêr, mobiel, selfoondiensverskaffer, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nie beskikbaar nie omdat slaaptydmodus aan is"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Terugstelling van kennisgewingbelangrikheid is voltooi."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Programme"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Onvertroude toestel wil toegang tot jou boodskappe hê. Tik vir besonderhede."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Gee toegang tot boodskappe?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"\'n Onvertroude Bluetooth-toestel, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wil toegang tot jou boodskappe hê.\n\nJy het nog nooit aan [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] gekoppel nie."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Onvertroude toestel wil toegang tot jou kontakte en oproeprekord hê. Tik vir besonderhede."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Gee toegang tot kontakte en oproeprekord?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"\'n Onvertroude Bluetooth-toestel, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wil toegang tot jou kontakte en oproeprekord hê. Dit sluit in data oor inkomende en uitgaande oproepe.\n\nJy het nog nooit aan [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] gekoppel nie."</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 9d01312..b6a1d67 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"የIPv6 አድራሻዎች"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"የተቀመጡ አውታረ መረቦች"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"የደንበኝነት ምዝገባዎች"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"ሌሎች አውታረ መረቦች"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ቅንብሮች"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"የላቁ የWi‑Fi ቅንብሮች ለዚህ ተጠቃሚ አይገኙም"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"አስቀምጥ"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ሰርዝ"</string>
<string name="menu_new" msgid="6571230342655509006">"አዲስ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"አስቀምጥ"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ጣለው"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ይቅር"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"የስም መስክ ባዶ ሊሆን አይችልም"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ባዶ መሆን አይችልም።"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"መተግበሪያዎች ዳግም ሊጀመሩ ይችላሉ"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi፣ ተንቀሳቃሽ ስልክ እና ብሉቱዝን ዳግም አስጀምር"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"የሚከተሉትን ጨምሮ ይህ ሁሉንም የአውታረ መረብ ቅንብሮችን ዳግም ያቀናብራል፦\n\n"<li>"Wi‑Fi"</li>\n<li>"የተንቀሳቃሽ ስልክ ውሂብ"</li>\n<li>"ብሉቱዝ"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ደምስስ"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"የወረዱ ሲሞችን ይደምስሱ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ምትክ ሲሞችን ለማውረድ፣ የእርስዎን አገልግሎት አቅራቢ ያነጋግሩ። ይህ ማናቸውም የተንቀሳቃሽ ስልክ አገልግሎት ዕቅዶችን አይሰርዝም።"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ይህ ማናቸውም የተንቀሳቃሽ ስልክ አገልግሎት ዕቅዶችን አይሰርዝም። ተተኪ ሲሞችን ለማውረድ፣ የአገልግሎት አቅራቢዎን ያነጋግሩ።"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ቅንብሮችን ዳግም ያቀናብሩ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ሁሉም አውታረ መረብ ቅንብሮች ዳግም ይጀምሩ? ይህን እርምጃ መቀልበስ አይችሉም።"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ሁሉም የአውታረ መረብ ቅንብሮች ዳግም ይቀናበሩ እና የወረዱ ሲሞች ይደምሰሱ? ይህን ተግባር መቀልበስ አይችሉም።"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ጡባዊው ከተለመደው በላይ ስራ ላይ ውሏል"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"መሣሪያው ከተለመደው በላይ ስራ ላይ ውሏል"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ባትሪ ከተጠበቀው ጊዜ ቀድሞ ሊያልቅ ይችላል"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"የባትሪ ጤናን መጠበቅ"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"ለባትሪ ጤና ማመቻቸት"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ባትሪ ለጊዜው ተገድቧል። የበለጠ ለመረዳት መታ ያድርጉ።"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"የእርስዎ ስልክ ከመደበኛው በላይ ሥራ ላይ ውሏል። የእርስዎ ባትሪ ከተጠበቀው ቀድሞ ሊያልቅ ይችል ይሆናል።\n\nበባትሪ አጠቃቀም ረገድ ከፍተኛ መተግበሪያዎች፦"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"የእርስዎ ጡባዊ ከመደበኛው በላይ ሥራ ላይ ውሏል። የእርስዎ ባትሪ ከተጠበቀው ቀድሞ ሊያልቅ ይችል ይሆናል።\n\nበባትሪ አጠቃቀም ረገድ ከፍተኛ መተግበሪያዎች፦"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"ከፍተኛ የሚታዩ የውሂብ ስብስቦች"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ወደ ነባሪ እሴቶች ዳግም አስጀምር"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"የራስ-ሙላ ገንቢ አማራጮች ዳግም ተጀምረዋል"</string>
+ <string name="location_category" msgid="3496759112306219062">"አካባቢ"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"የሁኔታ አሞሌ አከባቢ አመልካች"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"አውታረመረብ እና ግንኙነትን ጨምሮ ለሁሉም አካባቢዎች አሳይ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ሙሉ የGNSS መለኪያዎች አስገድድ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ሁሉንም የGNSS ህብረ ፎቶዎችን እና ድግምግሞሾችን ያለምንም የሥራ ብስክሌት ግልቢያ ዱካቸውን ይከታተሉ"</string>
<string name="device_theme" msgid="5027604586494772471">"የመሣሪያ ገጽታ"</string>
<string name="default_theme" msgid="4815428567082263639">"ነባሪ"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"የአውታረ መረብ ስም"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ትኩረት እንደሰጡ ለመቆየት ማሳወቂያዎችን ባሉበት አቁም"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ባህሪ አይገኝም"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"የእርስዎን ስልክ ፍጥነት ስለሚቀንስ ይህ ባህሪ ጠፍቷል"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ሙሉ የGNSS መለኪያዎች አስገድድ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ሁሉንም የGNSS ህብረ ፎቶዎችን እና ድግምግሞሾችን ያለምንም የሥራ ብስክሌት ግልቢያ ዱካቸውን ይከታተሉ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"የስንክል ንግግር ሳጥንን ሁልጊዜ አሳይ"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"መተግበሪያ በሚሰናከልበት እያንዳንዱ ጊዜ የንግግር ሳጥን አሳይ"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"በANGLE የነቃ መተግበሪያ ይምረጡ"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"የWi‑Fi ጥሪ እንደ አንዳንድ የWi-Fi አውታረ መረቦች ያሉ የአገልግሎት አቅራቢ ባልሆኑ አውታረ መረቦች ላይ ጥሪዎችን እንዲያደርጉ እና እንዲቀበሉ ያስችልዎታል።"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ጥሪዎች"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"ኤስኤምኤስ"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"የተመረጡ"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ጥሪዎች ተመርጠዋል"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"ኤስኤምኤስ ተመርጧል"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"አይገኝም"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM የለም"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ምርጫዎች"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ከይፋዊ አውታረ መረቦች ጋር አገናኝ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"የአውታረ መረብ ግንኙነት በይነመረብ፣ ገመድ-አልባ፣ ውሂብ፣ wifi፣ wi-fi፣ wi fi፣ ተንቀሳቃሽ ስልክ፣ ሞባይል፣ የተንቀሳቃሽ ስልክ አገልግሎት አቅራቢ፣ 4ጂ፣ 3ጂ፣ 2ጂ፣ lte፣ ኤልቲኢ"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"የመኝታ ሰዓት ሁነታ ስለበራ የማይገኝ"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"የማሳወቂያ አስፈላጊነት ዳግም አስጀምር ተጠናቅቋል።"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"መተግበሪያዎች"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"እምነት የማይጣልበት መሣሪያ መልዕክቶችዎን መድረስ ይፈልጋል። ዝርዝሮችን ለማግኘት መታ ያድርጉ"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"የመልዕክቶች መዳረሻ ይፈቀድ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"እምነት የማይጣልበት የብሉቱዝ መሣሪ፣ [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]፣ መልዕክቶችዎን መድረስ ይፈልጋል።\n\nከዚህ በፊት ከ[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ጋር አልተገናኙም።"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"እምነት የማይጣልበት መሣሪያ እውቂያዎችዎን እና የጥሪ ምዝግብ ማስታወሻውን መድረስ ይፈልጋል። ዝርዝሮችን ለማግኘት መታ ያድርጉ"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"የእውቂያዎች እና የጥሪ ምዝግብ ማስታወሻ መዳረሻ ይፈቀድ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"እምነት የማይጣልበት የብሉቱዝ መሣሪያ፣ [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]፣ እውቂያዎችዎን እና የጥሪ ምዝግብ ማስታወሻን መድረስ ይፈልጋል። ይህ ስለ ገቢ እና ወጪ ጥሪዎች ውሂብን ያካትታል።\n\n ከዚህ በፊት ከ[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ጋር አልተገናኙም።"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 563c3e0..4b41b76 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -1102,8 +1102,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"عناوين IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"الشبكات المحفوظة"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"الاشتراكات"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"الشبكات الأخرى"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"إعدادات IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"إعدادات Wi‑Fi المتقدمة ليست متاحة لهذا المستخدم."</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"حفظ"</string>
@@ -1681,7 +1680,7 @@
<string name="menu_delete" msgid="9199740901584348273">"حذف APN"</string>
<string name="menu_new" msgid="6571230342655509006">"اسم نقطة وصول جديد"</string>
<string name="menu_save" msgid="6611465355127483100">"حفظ"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"إلغاء"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"إلغاء"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"لا يمكن أن يكون حقل الاسم فارغًا."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"لا يمكن أن يكون APN فارغًا."</string>
@@ -1696,8 +1695,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"يمكن إعادة ضبط التطبيقات."</string>
<string name="reset_network_title" msgid="1395494440355807616">"إعادة ضبط شبكة Wi-Fi والجوّال والبلوتوث"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"سيؤدي هذا إلى إعادة ضبط كل إعدادات الشبكة، بما فيها:\n\n"<li>"شبكة Wi‑Fi"</li>\n<li>"بيانات الجوّال"</li>\n<li>"البلوتوث"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"محو البيانات"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"محو بيانات شرائح SIM التي تم تنزيلها"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"لتنزيل شرائح SIM بديلة، يمكنك التواصل مع مشغّل شبكة الجوّال. لن يؤدي ذلك إلى إلغاء أيّ خطة من خطط خدمة الجوّال."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"لن يؤدي هذا إلى إلغاء أيّ خطة من خطط خدمة الجوّال. لتنزيل شرائح SIM بديلة، يمكنك التواصل مع مشغّل شبكة الجوّال."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"إعادة ضبط الإعدادات"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"هل تريد إعادة ضبط جميع إعدادات الشبكة؟ لا يمكنك التراجع عن هذا الإجراء."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"هل تريد إعادة ضبط كل إعدادات الشبكة ومحو بيانات شريحة SIM التي تم تنزيلها؟ لا يمكنك التراجع عن هذا الإجراء."</string>
@@ -2580,7 +2580,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"الجهاز اللوحي المستخدَم أكثر من المعتاد"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"الجهاز المستخدَم أكثر من المعتاد"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"قد تنفد البطارية قبل الوقت المعتاد."</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"الحفاظ على سلامة البطارية"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"التحسين لسلامة البطارية"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"تأثير محدود على البطارية مؤقتًا، انقر لمعرفة مزيد من المعلومات."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"تم استخدام هاتفك أكثر من المعتاد. قد ينفذ شحن البطارية قبل الوقت المتوقَّع.\n\nالتطبيقات الأكثر استخدامًا للبطارية:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"تم استخدام جهازك اللوحي أكثر من المعتاد. قد ينفذ شحن البطارية قبل الوقت المتوقَّع.\n\nالتطبيقات الأكثر استخدامًا للبطارية:"</string>
@@ -4971,6 +4971,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"الحد الأقصى لعدد مجموعات البيانات المرئية"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"إعادة الضبط على القيم التلقائية"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"تمّت إعادة ضبط الملء التلقائي لخيارات مطوّري البرامج"</string>
+ <string name="location_category" msgid="3496759112306219062">"الموقع الجغرافي"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"مؤشر الموقع الجغرافي في شريط الحالة"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"إظهار المؤشر لكل المواقع الجغرافية، وأيضًا من خلال الشبكة وإمكانية الاتصال"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"فرض كامل لقياسات GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"تتبّع جميع مجموعات وفترات تكرار GNSS التي لا تحتوي على دورات عمل"</string>
<string name="device_theme" msgid="5027604586494772471">"مظهر الجهاز"</string>
<string name="default_theme" msgid="4815428567082263639">"تلقائي"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"اسم الشبكة"</string>
@@ -4987,8 +4992,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"إيقاف الإشعارات مؤقتًا للحفاظ على التركيز"</string>
<string name="disabled_feature" msgid="7151433782819744211">"الميزة غير متوفرة"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"تم إيقاف هذه الميزة لأنها تبطئ هاتفك."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"فرض كامل لقياسات GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"تتبّع جميع مجموعات وفترات تكرار GNSS التي لا تحتوي على دورات عمل"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"عرض مربع حوار الأعطال دائمًا"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"عرض مربع الحوار في كل مرة يتعطل فيها تطبيق"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"اختيار التطبيق الذي يستخدم ANGLE"</string>
@@ -5384,6 +5387,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"تسمح لك ميزة \"الاتصال عبر Wi-Fi\" بإجراء مكالمات وتلقّيها عبر شبكات غير تابعة لمشغّلي شبكات الجوّال."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"المكالمات"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"مفضّلة"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"المكالمات مفضّلة"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"الرسائل القصيرة مفضّلة"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"غير متاحة"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"بلا شريحة SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"التفضيلات"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"الاتصال بشبكات Wi-Fi عامة"</string>
<string name="keywords_internet" msgid="7674082764898690310">"الاتصال بالشبكة، الإنترنت، لاسلكي، بيانات، wifi، wi-fi، wi fi، خلوي، جهاز جوّال، مشغل شبكة الجوال، جيل رابع، جيل ثالث، جيل ثاني، lte"</string>
@@ -5392,4 +5400,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"الميزة غير متاحة لأن وضع \"وقت النوم\" مفعّل."</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"اكتملت عملية إعادة ضبط درجة الأهمية الخاصة بالإشعارات."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"التطبيقات"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"يريد جهاز غير موثوق الوصول إلى رسائلك. انقر للحصول على التفاصيل."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"هل تريد السماح بالوصول إلى الرسائل؟"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"يريد جهاز غير موثوق يتضمّن بلوتوث، [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]، الوصول إلى رسائلك.\n\nلم يتم ربطك بالجهاز [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] في السابق."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"يريد جهاز غير موثوق الوصول إلى جهات الاتصال وسجلّ المكالمات. انقر للحصول على التفاصيل."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"هل تريد السماح بالوصول إلى جهات الاتصال وسجلّ المكالمات؟"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"يريد جهاز غير موثوق يتضمّن بلوتوث، [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]، الوصول إلى جهات الاتصال وسجلّ المكالمات. يتضمن ذلك الوصول إلى بيانات عن المكالمات الواردة والصادرة.\n\nلم يتم ربطك بالجهاز [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] في السابق."</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 1e14342..2b52ef1 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ঠিকনাবোৰ"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"ছেভ কৰি ৰখা নেটৱৰ্কসমূহ"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"গ্ৰাহকভুক্তি"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"অন্য নেটৱৰ্ক"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"আইপি ছেটিংসমূহ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"এই ব্যৱহাৰকাৰীৰ বাবে ৱাই-ফাইৰ উচ্চখাপৰ ছেটিংসমূহ উপলব্ধ নহয়"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ছেভ কৰক"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"এপিএন মচক"</string>
<string name="menu_new" msgid="6571230342655509006">"নতুন এপিএন"</string>
<string name="menu_save" msgid="6611465355127483100">"ছেভ কৰক"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"অগ্ৰাহ্য কৰক"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"বাতিল কৰক"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"নামৰ ঠাইখন খালী থাকিব নোৱাৰে"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"এপিএন খালী থাকিব নোৱাৰে।"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"এপ্সমূহ ৰিছেট কৰিব পাৰি"</string>
<string name="reset_network_title" msgid="1395494440355807616">"ৱাই-ফাই, ম’বাইল আৰু ব্লুটুথ ৰিছেট কৰক"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ইয়ে :\n\n"<li>"ৱাই-ফাই"</li>\n<li>"ম\'বাইল ডেটা"</li>\n<li>"ব্লুটুথ"</li>"কে আদি কৰি সকলো নেটৱৰ্ক ছেটিং ৰিছেট কৰিব"</string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"মচক"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ডাউনল’ড কৰা ছিমবোৰ মচক"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"বিকল্প ছিম ডাউনল’ড কৰিবলৈ আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰক। ই কোনো ম’বাইল সেৱাৰ আঁচনি বাতিল নকৰে।"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ই কোনো ম’বাইল সেৱাৰ আঁচনি বাতিল নকৰে। সলনি কৰা ছিম ডাউনল’ড কৰিবলৈ আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰক।"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ছেটিংসমূহ ৰিছেট কৰক"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"সকলো নেটৱৰ্কৰ ছেটিংসমূহ ৰিছেট কৰিবনে? আপুনি এই কাৰ্যটো আনডু কৰিব নোৱাৰিব।"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"সকলো নেটৱৰ্ক ছেটিং ৰিছেট কৰিবনে আৰু সকলো ডাউনল’ড কৰা ছিম মচিবনে? আপুনি এই কাৰ্য আনডু কৰিব নোৱাৰিব।"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"টেবলেট সামান্য অৱস্থাতকৈ বেছি ব্যৱহাৰ কৰা হ’ল"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ডিভাইচ সামান্য অৱস্থাতকৈ বেছি ব্যৱহাৰ কৰা হ’ল"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"বেটাৰি আনদিনাতকৈ আগতেই শেষ হ’ব পাৰে"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"বেটাৰীৰ অৱস্থাৰ সংৰক্ষণ"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"বেটাৰীৰ অৱস্থা অপ্টিমাইজ কৰি থকা হৈছে"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"বেটাৰী সাময়িকভাৱে সীমিত কৰা হৈছে। অধিক জানিবলৈ টিপক।"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"আপোনাৰ ফ’নটো স্বাভাৱিকতকৈ বেছি ব্যৱহাৰ কৰা হৈছে। আপোনাৰ বেটাৰি আশা কৰাতকৈ আগতেই শেষ হ’ব পাৰে।\n\nআটাইতকৈ বেছি বেটাৰি ব্যৱহাৰ কৰা এপ্সমূহ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"আপোনাৰ টেবলেটটো স্বাভাৱিকতকৈ বেছি ব্যৱহাৰ কৰা হৈছে। আপোনাৰ বেটাৰি আশা কৰাতকৈ আগতেই শেষ হ’ব পাৰে।\n\nআটাইতকৈ বেছি বেটাৰি ব্যৱহাৰ কৰা এপ্সমূহ:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"দেখিব পৰা অধিকতম ডেটাছেট"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ডিফ’ল্ট মানলৈ ৰিছেট কৰক"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"বিকাশকৰ্তাৰ স্বয়ংপূৰ্তি হোৱা বিকল্পসমূহ ৰিছেট কৰা হৈছে"</string>
+ <string name="location_category" msgid="3496759112306219062">"অৱস্থান"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"স্থিতি দণ্ডত অৱস্থানৰ সূচক"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"নেটৱৰ্ক আৰু সংযোগকে ধৰি আটাইবোৰ অৱস্থানৰ বাবে দেখুৱাওক"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"সম্পূৰ্ণ জিএনএছএছ পৰিমাপ প্ৰয়োগ কৰক"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"কোনো উপযোগীতা অনুপাতৰ সহায় নোলোৱাকৈ GNSS কনষ্টেলেশ্বন আৰু ফ্ৰিকুৱেন্সী নিৰীক্ষণ কৰক"</string>
<string name="device_theme" msgid="5027604586494772471">"ডিভাইচৰ থিম"</string>
<string name="default_theme" msgid="4815428567082263639">"ডিফ\'ল্ট"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"নেটৱৰ্কৰ নাম"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"মনোযোগ বৰ্তাই ৰাখিবলৈ জাননী বন্ধ কৰক"</string>
<string name="disabled_feature" msgid="7151433782819744211">"সুবিধাসমূহ উপলব্ধ নহয়"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"এই সুবিধাটোৱে আপোনাৰ ফ\'নটোৰ কার্যকলাপ লেহেমীয়া কৰে বাবে ইয়াক অফ কৰা হৈছে"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"সম্পূৰ্ণ জিএনএছএছ পৰিমাপ প্ৰয়োগ কৰক"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"কোনো উপযোগীতা অনুপাতৰ সহায় নোলোৱাকৈ GNSS কনষ্টেলেশ্বন আৰু ফ্ৰিকুৱেন্সী নিৰীক্ষণ কৰক"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"সদায় ক্ৰেশ্ব ডায়ল\'গ দেখুৱাওক"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"কোনো এপ্ ক্ৰেশ্ব হ\'লে প্ৰতিবাৰতে ডায়ল\'গ দেখুৱাওক"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE সক্ষম কৰি ৰখা এপ্লিকেশ্বন বাছনি কৰক"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ৱাই-ফাই কলিঙৰ সুবিধাটোৱে আপোনাক কিছুমান ৱাই-ফাই নেটৱৰ্কৰ দৰে বাহক বহিৰ্ভূত নেটৱৰ্কৰ জৰিয়তে কল কৰিবলৈ আৰু লাভ কৰিবলৈ সুবিধা দিয়ে।"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"কল"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"এছএমএছ"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"অগ্ৰাধিকাৰ দিয়া"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"কলক অগ্ৰাধিকাৰ দিয়া হৈছে"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"এছএমএছক অগ্ৰাধিকাৰ দিয়া হৈছে"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"উপলব্ধ নহয়"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"ছিম নাই"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"অগ্ৰাধিকাৰ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ৰাজহুৱা নেটৱৰ্কসমূহৰ সৈতে সংযোগ কৰক"</string>
<string name="keywords_internet" msgid="7674082764898690310">"নেটৱৰ্ক সংযোগ, ইণ্টাৰনেট, বেতাঁৰ, ডেটা, ৱাইফাই, ৱাই-ফাই, ৱাই ফাই, চেলুলাৰ, ম’বাইল, চেল কেৰিয়াৰ, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"শোৱাৰ সময়ৰ ম’ড অন হৈ থকাৰ বাবে উপলব্ধ নহয়"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"জাননীৰ গুৰুত্ব ৰিছেট কৰাটো সম্পূৰ্ণ হৈছে।"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"এপ্"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"অবিশ্বস্ত ডিভাইচে আপোনাৰ বাৰ্তাসমূহ এক্সেছ কৰিব বিচাৰিছে। সবিশেষ জানিবলৈ টিপক।"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"বাৰ্তাৰ এক্সেছ দিবনে?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"এটা অবিশ্বস্ত ব্লুটুথ ডিভাইচ, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]এ, আপোনাৰ বাৰ্তাসমূহ এক্সেছ কৰিব বিচাৰিছে।\n\nআপুনি আগতে [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]ৰ সৈতে সংযোগ কৰা নাই।"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"অবিশ্বস্ত ডিভাইচে আপোনাৰ সম্পৰ্কসূচী আৰু কল লগ এক্সেছ কৰিব বিচাৰিছে। সবিশেষ জানিবলৈ টিপক।"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"সম্পৰ্কসূচী আৰু কল লগ এক্সেছ কৰিবলৈ দিবনে?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"এটা অবিশ্বস্ত ব্লুটুথ ডিভাইচ, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]এ, আপোনাৰ সম্পৰ্কসূচী আৰু কল লগ এক্সেছ কৰিব বিচাৰিছে। ইয়াত অন্তৰ্গামী আৰু বহিৰ্গামী কল সম্পৰ্কীয় ডেটা অন্তৰ্ভুক্ত।\n\nআপুনি আগতে [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]ৰ সৈতে সংযোগ কৰা নাই।"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 676d958..3e10a02 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ünvanları"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saxlanmış şəbəkələr"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abunəliklər"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Digər şəbəkələr"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ayarları"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Təkmilləşmiş Wi‑Fi ayarları bu istifadəçi üçün əlçatmazdır"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Yadda saxlayın"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN silin"</string>
<string name="menu_new" msgid="6571230342655509006">"Yeni APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Yadda saxla"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Kənarlaşdır"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Ləğv edin"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Ad sahəsi boş ola bilməz."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN boş ola bilməz."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Tətbiqlər sıfırlana bilər"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, mobil və Bluetooth\'u sıfırlayın"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Bununla bütün şəbəkə ayarları sıfırlanacaq, bura daxildir:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobil data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Silin"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Endirilən SIM-ləri silin"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Yedək SIM-i endirmək üçün operatorla əlaqə saxlayın. Bu, hər hansı mobil xidmət planını ləğv etməyəcək."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Bununla hər hansı mobil xidmət planı ləğv edilməyəcək. Əvəzedici SIM\'ləri endirmək üçün operatorunuzla əlaqə saxlayın."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Ayarları sıfırlayın"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Bütün şəbəkə ayarları sıfırlansın? Bu əməliyyatı geri qaytara bilməzsiniz."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Bütün şəbəkə ayarları sıfırlanıb, endirilən SIM-lər silinsin? Bu əməliyyatı geri qaytara bilməzsiniz."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Planşet hədindən çox istifadə etdi"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Cihaz həddindən çox istifadə etdi"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batareya həmişə olduğundan daha tez bitə bilər"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Batareyanın vəziyyəti saxlanılır"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Enerjiyə qənaət üçün optimallaşdırma"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batareya müvəqqəti məhdudlaşdırılıb. Ətraflı məlumat üçün toxunun."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefon həddindən artıq çox işlədilib. Batareya gözləniləndən tez bitə bilər.\n\nƏn çox batareya işlədən tətbiqlər:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Planşet həddindən artıq çox işlədilib. Batareya gözləniləndən tez bitə bilər.\n\nƏn çox batareya işlədən tətbiqlər:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimum görünən datasetlər"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Defolt dəyərlərə sıfırlayın"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Avto doldurma developer seçimləri sıfırlanıb"</string>
+ <string name="location_category" msgid="3496759112306219062">"Məkan"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bölməsi məkan göstəricisi"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Şəbəkə və bağlantı daxil olmaqla bütün məkanlar üçün göstərin"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Tam GNSS ölçülərini icra edin"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"İş sistemi olmadan bütün GNSS qruplaşmaları və tezliklərini izləyin"</string>
<string name="device_theme" msgid="5027604586494772471">"Cihaz teması"</string>
<string name="default_theme" msgid="4815428567082263639">"Defolt"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Şəbəkə adı"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Foksulanmağa davam etmək üçün bildirişləri dayandırın"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funksiya əlçatan deyil"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Bu funksiya telefonu yavaşlatdığı üçün deaktiv edilib"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Tam GNSS ölçülərini icra edin"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"İş sistemi olmadan bütün GNSS qruplaşmaları və tezliklərini izləyin"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Xəta dialoqunu həmişə göstərin"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Tətbiqdə xəta baş verdiyi zaman dialoqu göstərin"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE aktiv olan tətbiq seçin"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi zəngi bəzi Wi‑Fi şəbəkələri kimi operator olmayan şəbəkələr üzərindən zəng etmək və qəbul etməyinizə imkan verir."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Zənglər"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"tərcih edilənlər"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"tərcih edilən zənglər"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS tərcih edilir"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"əlçatmazdır"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM yoxdur"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Tərcihlər"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"İctimai şəbəkələrə qoşulun"</string>
<string name="keywords_internet" msgid="7674082764898690310">"şəbəkə bağlantısı, internet, simsiz, data, wifi, wi-fi, wi fi, mobil şəbəkə, mobil, mobil operator, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Yuxu vaxtı rejimi aktiv olduğuna görə əlçatan deyil"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Bildiriş əhəmiyyətinin sıfırlanması tamamlandı."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Tətbiqlər"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Güvənsiz cihaz mesajlarınıza giriş etmək istəyir. Detallar üçün toxunun."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Mesajlara girişə icazə verilsin?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Güvənsiz Bluetooth cihazı [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] mesajlarınıza giriş etmək istəyir.\n\nDaha öncə [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] cihazına qoşulmamısınız."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Güvənsiz cihaz kontaktlarınıza və zəng siyahınıza giriş etmək istəyir. Detallar üçün toxunun."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Kontaktlara və zəng siyahısına girişə icazə verilsin?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Güvənsiz Bluetooth cihazı [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] kontaktlarınıza və zəng siyahınıza giriş etmək istəyir. Gələn və gedən zənglər barədə data buna daxildir.\n\nDaha öncə [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] cihazına qoşulmamısınız."</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 2a5d957..11c8bce 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -1042,8 +1042,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 adrese"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Sačuvane mreže"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Pretplate"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Ostale mreže"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP podešavanja"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Napredna podešavanja Wi‑Fi mreže nisu dostupna za ovog korisnika"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Sačuvaj"</string>
@@ -1618,7 +1617,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Izbriši naziv pristupne tačke"</string>
<string name="menu_new" msgid="6571230342655509006">"Nov naziv pristupne tačke"</string>
<string name="menu_save" msgid="6611465355127483100">"Sačuvaj"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Odbaci"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Otkaži"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Polje Naziv ne sme da bude prazno."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Polje Naziv pristupne tačke ne sme da bude prazno."</string>
@@ -1633,8 +1632,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikacije mogu da se resetuju"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Resetuj WiFi, mobilnu mrežu i Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Ovim resetujete sva podešavanja mreže, uključujući:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobilne podatke"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Obriši"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Obriši preuzete SIM kartice"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Da biste preuzeli zamenske SIM kartice, kontaktirajte mobilnog operatera. Time se neće otkazati nijedan tarifni paket."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Ovim ne otkazujete nijedan tarifni paket. Da biste preuzimali rezervne SIM kartice, obratite se mobilnom operateru."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Resetuj podešavanja"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Želite li da resetujete sva podešavanja mreže? Ova radnja ne može da se opozove."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Želite li da resetujete podešavanja mreže i obrišete preuzete SIM kartice? Ova radnja ne može da se opozove."</string>
@@ -2487,7 +2487,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet ste koristili duže nego obično"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Uređaj ste koristili duže nego obično"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baterija može da se isprazni ranije nego obično"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Održava se stanje baterije"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimizuje se radi dobrog stanja baterije"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Baterija je trenutno ograničena. Dodirnite da biste saznali više."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Uređaj ste koristili duže nego obično. Baterija može da se isprazni ranije od očekivanog.\n\nAplikacije sa najvećom potrošnjom baterije:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablet ste koristili duže nego obično. Baterija može da se isprazni ranije od očekivanog.\n\nAplikacije sa najvećom potrošnjom baterije:"</string>
@@ -4731,6 +4731,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimalan broj vidljivih skupova podataka"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Resetuj na podrazumevane vrednosti"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Opcije za programera za automatsko popunjavanje su resetovane"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokacija"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indikator lokacije statusne trake"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Prikaži sve lokacije, uključujući mrežu i povezivanje"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Prinudno pokreni puna GNSS merenja"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Prati sve GNSS konstalacije i frekvencije bez ciklusa rada"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema uređaja"</string>
<string name="default_theme" msgid="4815428567082263639">"Podrazumevana"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Naziv mreže"</string>
@@ -4747,8 +4752,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pauzirajte obaveštenja radi bolje koncentracije"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcija nije dostupna"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ova funkcija je isključena jer usporava telefon"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Prinudno pokreni puna GNSS merenja"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Prati sve GNSS konstalacije i frekvencije bez ciklusa rada"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Uvek prikazuj dijalog o otkazivanju"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Prikaži dijalog svaki put kada aplikacija otkaže"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Izaberi aplikaciju omogućenu za ANGLE"</string>
@@ -5135,6 +5138,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Pozivanje preko WiFi-ja vam omogućava da primate i upućujete pozive preko mreža koje ne pripadaju mobilnom operateru, na primer, nekih WiFi mreža."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Pozivi"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"prednost"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"prednost imaju pozivi"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"prednost ima SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nedostupno"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nema SIM kartice"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Podešavanja"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Povežite se sa javnim mrežama"</string>
<string name="keywords_internet" msgid="7674082764898690310">"mrežna veza, internet, bežično, podaci, wifi, wi-fi, wi fi, mobilni telefon, mobilni, mobilni operater, 4g, 3g, 2g, lte"</string>
@@ -5143,4 +5151,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nedostupno je jer je noćni režim uključen"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Resetovanje važnosti obaveštenja je dovršeno."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikacije"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Nepouzdani uređaj želi da pristupa porukama. Dodirnite za detalje."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Želite li da dozvolite pristup porukama?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Nepouzdani Bluetooth uređaj, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], želi da pristupa porukama.\n\nRanije se niste povezivali sa uređajem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Nepouzdani uređaj želi da pristupa kontaktima i evidenciji poziva. Dodirnite za detalje."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Želite li da dozvolite pristup kontaktima i evidenciji poziva?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Nepouzdani Bluetooth uređaj, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], želi da pristupa kontaktima i evidenciji poziva. To obuhvata podatke o dolaznim i odlaznim pozivima.\n\nRanije se niste povezivali sa uređajem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index e2fdbff..875967b 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-адрасы"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Захаваныя сеткі"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Падпіскі"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Іншыя сеткі"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Налады IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Пашыраныя налады Wi-Fi не даступныя для гэтага карыстальніка"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Захаваць"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Выдаліць APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Новы APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Захаваць"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Адхіліць"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Скасаваць"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Поле «Імя» не можа быць пустым."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Значэнне APN не можа быць пустым."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Праграмы могуць быць скінуты"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Скінуць налады Wi-Fi, мабільнай перадачы даных і Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Гэта прывядзе да скіду ўсіх налад сеткі, у тым ліку:\n\n"<li>"Wi‑Fi"</li>\n<li>"мабільнай перадачы даных"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Сцерці даныя"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Сцерці даныя спампаваных SIM"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Каб спампаваць SIM на замену, звярніцеся да аператара. Гэта не прывядзе да скасавання тарыфных планаў."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Гэта дзеянне не прывядзе да скасавання тарыфных планаў. Каб спампаваць новыя SIM-карты, звярніцеся да аператара."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Скід налад"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Скінуць усе налады сеткі? Гэта дзеянне нельга адрабіць."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Скінуць усе налады сеткі і сцерці ўсе даныя смампаваных SIM? Гэта дзеянне нельга адрабіць."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Планшэт выкарыстоўваецца больш, чым звычайна"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Прылада выкарыстоўваецца больш, чым звычайна"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Акумулятар можа разрадзіцца хутчэй, чым звычайна"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Павелічэнне тэрміну службы акумулятара"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Аптымізацыя стану акумулятара"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Зарад акумулятара часова абмежаваны. Націсніце, каб даведацца больш."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Тэлефон выкарыстоўваецца больш, чым звычайна. Акумулятар хутка разрадзіцца.\n\nПраграмы з самым высокім спажываннем энергіі:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Планшэт выкарыстоўваецца больш, чым звычайна. Акумулятар хутка разрадзіцца.\n\nПраграмы з самым высокім спажываннем энергіі:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Максімальная колькасць бачных набораў даных"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Скінуць значэнні да стандартных"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Аўтазапаўненне параметраў распрацоўшчыка было скінута"</string>
+ <string name="location_category" msgid="3496759112306219062">"Месцазнаходжанне"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Індыкатар месцазнаходжання на панэлі стану"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Паказваць для ўсіх месцазнаходжанняў, у тым ліку для месцазнаходжання ў сетцы і месцаў падключэння"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Прымусова правесці поўныя вымярэнні GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Адсочваць усе групы і частоты GNSS з выключаным працоўным цыклам"</string>
<string name="device_theme" msgid="5027604586494772471">"Тэма прылады"</string>
<string name="default_theme" msgid="4815428567082263639">"Стандартная"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Назва сеткі"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Прыпыніце апавяшчэнні, каб яны не адцягвалі ўвагу"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функцыя недаступная"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Гэта функцыя выключана, таму што яна запавольвае працу вашага тэлефона"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Прымусова правесці поўныя вымярэнні GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Адсочваць усе групы і частоты GNSS з выключаным працоўным цыклам"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Заўсёды паказваць дыялогавыя вокны з памылкамі"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Паказваць дыялогавае акно кожны раз, калі адбываецца збой праграмы"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Выбраць праграму з падтрымкай ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi-тэлефанія дазваляе рабіць і прымаць выклікі праз сеткі, якія не належаць аператарам, напрыклад праз некаторыя сеткі Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Выклікі"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"прыярытэтны"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"прыярытэтныя выклікі"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"прыярытэтныя SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"недаступны"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Няма SIM-карты"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Параметры"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Падключацца да агульнадаступных сетак"</string>
<string name="keywords_internet" msgid="7674082764898690310">"падключэнне да сеткі, інтэрнэт, бесправадны, даныя, wifi, wi-fi, wi fi, сотавая сетка, мабільны, аператар сотавай сувязі, 4g, 3g, 2g, lte"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Недаступна, бо ўключаны начны рэжым"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Скід налад важнасці апавяшчэнняў завершаны."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Праграмы"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Падазроная прылада запытвае доступ да вашых паведамленняў. Націсніце, каб убачыць больш інфармацыі."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Дазволіць доступ да паведамленняў?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Падазроная прылада з Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], запытвае доступ да вашых паведамленняў.\n\nРаней вы не падключаліся да прылады [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Падазроная прылада запытвае доступ да кантактаў і журнала выклікаў. Націсніце, каб убачыць больш інфармацыі."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Дазволіць доступ да кантактаў і журнала выклікаў?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Падазроная прылада з Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], запытвае доступ да кантактаў і журнала выклікаў, у тым ліку да даных пра ўваходныя і выходныя выклікі.\n\nРаней вы не падключаліся да прылады [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 9af67f9..08f6d6f 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 адреси"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Запазени мрежи"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Абонаменти"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Други мрежи"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Настройки за IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Разширените настройки за Wi-Fi не са налице за този потребител"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Запазване"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Изтриване на името на точката за достъп (APN)"</string>
<string name="menu_new" msgid="6571230342655509006">"Ново име на точка за достъп (APN)"</string>
<string name="menu_save" msgid="6611465355127483100">"Запазване"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Отхвърляне"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Отказ"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Полето за име трябва да се попълни."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Името на точката за достъп (APN) трябва да се попълни."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Приложенията могат да бъдат нулирани"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Нулиране на настройките за Wi-Fi, мобилни данни и Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Така ще нулирате всички мрежови настройки, включително тези за:\n\n"<li>"Wi‑Fi;"</li>\n<li>"мобилни данни;"</li>\n<li>"Bluetooth."</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Изтриване на данните"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Изтеглени SIM карти: Изтриване"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"За да изтеглите SIM карти за замяна, свържете се с оператора си. Плановете за мобилни услуги няма да бъдат анулирани."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Плановете за мобилни услуги няма да бъдат анулирани. Обърнете се към оператора си, за да изтеглите резервни SIM карти."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Нулиране на настройките"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Да се нулират ли всички настройки за мрежата? Не можете да отмените това действие."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Да се нулират ли всички мрежови настройки и да се изтрият изтеглените SIM карти? Не можете да отмените това действие."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Таблетът е използван повече от обикновено"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Устройството е използвано повече от обикновено"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Батерията може да се изтощи по-рано от обикновено"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Запазване на състоянието на батерията"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Оптимизиране за състоянието на батерията"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Батерията е временно ограничена. Докоснете, за да научите повече."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Телефонът ви е използван повече от обикновено. Батерията може да се изтощи по-рано от очакваното.\n\nПриложения с най-висок разход на батерията:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Таблетът ви е използван повече от обикновено. Батерията може да се изтощи по-рано от очакваното.\n\nПриложения с най-висок разход на батерията:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Максимален брой видими набори от данни"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Възстановяване на стандартните стойности"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Опциите за автоматично попълване за програмисти са нулирани"</string>
+ <string name="location_category" msgid="3496759112306219062">"Местоположение"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Индикатор за местоположението в лентата на състоянието"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Показване за всички местоположения, включително от мрежата и други връзки"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Налагане на пълно проследяване на измерванията с GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Проследяване на всички констелации и честоти на GNSS без използване на коефициент на запълване"</string>
<string name="device_theme" msgid="5027604586494772471">"Тема на устройството"</string>
<string name="default_theme" msgid="4815428567082263639">"Стандартно"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Име на мрежата"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Поставете известията на пауза, за да не ви разсейват"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функцията не е налице"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Тази функция бе изключена, защото забавя телефона ви"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Налагане на пълно проследяване на измерванията с GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Проследяване на всички констелации и честоти на GNSS без използване на коефициент на запълване"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Диалоговият прозорец за сривове да се показва винаги"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Диалоговият прозорец да се показва всеки път, когато дадено приложение претърпи срив"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Избиране на активирано за ANGLE приложение"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Функцията за обаждания през Wi-Fi ви дава възможност да извършвате и получавате обаждания през мрежи, които не са на мобилни оператори, като например някои Wi-Fi мрежи."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Обаждания"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"предпочитани"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"предпочитат се обаждания"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"предпочитат се SMS съобщения"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"не е налице"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Няма SIM карта"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Предпочитания"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Свързване с обществени мрежи"</string>
<string name="keywords_internet" msgid="7674082764898690310">"връзка с мрежата, интернет, безжична мрежа, данни, Wi-Fi, мобилни данни, мобилна мрежа, мобилен оператор, 4G, 3G, 2G, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Не е налице, тъй като режимът „Време за сън“ е включен"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Нулирането на настройките за важност на известията завърши."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Приложения"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Ненадеждно устройство иска достъп до съобщенията ви. Докоснете за подробности."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Да се разреши ли достъпът до съобщенията?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Ненадеждно устройство с Bluetooth (<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>) иска достъп до съобщенията ви.\n\nДосега не сте се свързвали с(ъс) <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Ненадеждно устройство иска достъп до контактите и списъка с обажданията ви. Докоснете за подробности."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Да се разреши ли достъпът до контактите и списъка с обажданията?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Ненадеждно устройство с Bluetooth (<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>) иска достъп до контактите и списъка с обажданията ви. Това включва данни за входящите и изходящите обаждания.\n\nДосега не сте се свързвали с(ъс) <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>."</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index f803e6d..a307ea8 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 অ্যাড্রেসগুলি"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"সেভ করা নেটওয়ার্ক"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"সাবস্ক্রিপশন"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"অন্য নেটওয়ার্ক"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP সেটিংস"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"এই ব্যবহারকারীর জন্য ওয়াই-ফাই এর উন্নত সেটিংস উপলব্ধ নয়"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"সেভ করুন"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN মুছে দিন"</string>
<string name="menu_new" msgid="6571230342655509006">"নতুন APN"</string>
<string name="menu_save" msgid="6611465355127483100">"সেভ করুন"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"খারিজ করুন"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"বাতিল করুন"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"নাম ফিল্ডটি খালি থাকতে পারে না।"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN খালি থাকতে পারে না।"</string>
@@ -1612,8 +1611,11 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"অ্যাপ রিসেট করা যেতে পারে"</string>
<string name="reset_network_title" msgid="1395494440355807616">"ওয়াই-ফাই, মোবাইল ও ব্লুটুথ রিসেট"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"এগুলি সহ সমস্ত নেটওয়ার্ক সেটিংস আবার সেট করবে:\n\n"<li>"ওয়াই ফাই "</li>\n<li>"সেলুলার ডেটা "</li>\n<li>"ব্লুটুথ"</li></string>
+ <!-- no translation found for erase_euicc_data_button (728078969563311737) -->
+ <skip />
<string name="reset_esim_title" msgid="6152167073280852849">"ডাউনলোড করা সিম মুছে ফেলা"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"পরিবর্ত সিম ডাউনলোড করতে আপনার পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন। এটি মোবাইল পরিষেবার কোনও প্ল্যান বাতিল করবে না।"</string>
+ <!-- no translation found for reset_esim_desc (3662444090563399131) -->
+ <skip />
<string name="reset_network_button_text" msgid="2281476496459610071">"সেটিংস রিসেট করুন"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"সব নেটওয়ার্ক সেটিংস রিসেট করবেন? আগের সেটিংসে আর ফিরে যেতে পারবেন না।"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"সব নেটওয়ার্ক সেটিংস রিসেট করতে ও ডাউনলোড করা সিম মুছে ফেলতে চান? এটি আগের অবস্থায় আর ফিরিয়ে আনা যাবে না।"</string>
@@ -2456,7 +2458,8 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ট্যাবলেট স্বাভাবিকের চেয়ে বেশি ব্যবহৃত হয়েছে"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ডিভাইস স্বাভাবিকের চেয়ে বেশি ব্যবহৃত হয়েছে"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"প্রত্যাশিত সময়ের আগেই চার্জ শেষ হয়ে যেতে পারে"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ব্যাটারির চার্জ সাশ্রয় করা হচ্ছে"</string>
+ <!-- no translation found for battery_tip_limited_temporarily_title (7152799456221596915) -->
+ <skip />
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ব্যাটারির ব্যবহার কিছুক্ষণের জন্য সীমিত করা হয়েছে। আরও জানতে ট্যাপ করুন।"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"আপনার ফোন স্বাভাবিকের চেয়ে বেশি ব্যবহার হয়েছে। প্রত্যাশিত সময়ের আগেই ব্যাটারির চার্জ শেষ হয়ে যেতে পারে।\n\nব্যাটারি বেশি ব্যবহার করে এমন অ্যাপ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"আপনার ট্যাবলেট স্বাভাবিকের চেয়ে বেশি ব্যবহার হয়েছে। প্রত্যাশিত সময়ের আগেই ব্যাটারির চার্জ শেষ হয়ে যেতে পারে।\n\nব্যাটারি বেশি ব্যবহার করে এমন অ্যাপ:"</string>
@@ -4651,6 +4654,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"সবচেয়ে বেশিবার দেখা ডেটাসেট"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ডিফল্ট মানে রিসেট করুন"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"অটো-ফিল ডেভেলপার বিকল্প রিসেট করা হয়েছে"</string>
+ <string name="location_category" msgid="3496759112306219062">"লোকেশন"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"স্ট্যাটাস বার লোকেশন সূচক"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"নেটওয়ার্ক ও কানেক্টিভিটি সমেত সব লোকেশন দেখুন"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GnssMeasurement সম্পূর্ণভাবে ট্র্যাক করুন"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ডিউটি-সাইক্লিং বাদে সমস্ত কন্সটেলেশন এবং ফ্রিকোয়েন্সি ট্র্যাক করুন"</string>
<string name="device_theme" msgid="5027604586494772471">"ডিভাইসের থিম"</string>
<string name="default_theme" msgid="4815428567082263639">"ডিফল্ট"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"নেটওয়ার্কের নাম"</string>
@@ -4667,8 +4675,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"যাতে বিরক্ত হতে না হয় তার জন্য বিজ্ঞপ্তি পজ করুন"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ফিচারটি উপলভ্য নেই"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"এই ফিচারটি বন্ধ করা হয়েছে কারণ এটি আপনার ফোনের স্পিড কমিয়ে দেয়"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GnssMeasurement সম্পূর্ণভাবে ট্র্যাক করুন"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ডিউটি-সাইক্লিং বাদে সমস্ত কন্সটেলেশন এবং ফ্রিকোয়েন্সি ট্র্যাক করুন"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"প্রত্যেকবার ক্র্যাশ ডায়ালগ দেখাতে দিন"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"কোনও অ্যাপ ক্র্যাশ করলে প্রত্যেকবার ডায়ালগ দেখাতে দিন"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE চালু আছে এমন অ্যাপ বেছে নিন"</string>
@@ -4896,14 +4902,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"সিম চালু করা যাচ্ছে না"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"সিম কার্ডটি বের করে আবার ইনসার্ট করুন। এতেও সমস্যা ঠিক না হলে, ডিভাইস রিস্টার্ট করুন।"</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"সিমটি আবার চালু করার চেষ্টা করুন। এতেও সমস্যা ঠিক না হলে, ডিভাইস রিস্টার্ট করুন।"</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"নেটওয়ার্ক চালু করা"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> চালু আছে"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"সিম সেটিংস আপডেট করতে ট্যাপ করুন"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"সিম কার্ড"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"এই ডাউনলোড করা সিম মুছে ফেলতে চান?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"এই সিম মুছে দিলে এই ডিভাইসে <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> পরিষেবা আর পাওয়া যাবে না।\n\n<xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> পরিষেবা কিন্তু বাতিল হবে না।"</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"মুছুন"</string>
@@ -5056,14 +5058,29 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ওয়াই-ফাই কলিংয়ের সাহায্যে ওয়াই-ফাই নেটওয়ার্কের মতো কিছু পরিষেবা প্রদানকারী নয় এমন নেটওয়ার্ক ব্যবহার করে কল করতে এবং কল রিসিভ করতে পারবেন।"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"কল"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"এসএমএস"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"পছন্দসই"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"কল করা যেতে পারে"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"এসএমএস করা যেতে পারে"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"উপলভ্য নেই"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"কোনও সিম নেই"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"অভিরুচি"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"সর্বজনীন নেটওয়ার্কে কানেক্ট করুন"</string>
<string name="keywords_internet" msgid="7674082764898690310">"নেটওয়ার্ক কানেকশন, ইন্টারনেট, ওয়্যারলেস, ডেটা, ওয়াই-ফাই, ওয়াই-ফাই, ওয়াই-ফাই, মোবাইল ডেটা, মোবাইল, মোবাইল পরিষেবা প্রদানকারী, 4g, 3g, 2g, lte"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"বিমানে ব্যবহার করার মতো নেটওয়ার্ক দেখুন"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"বিমান মোড বন্ধ করুন"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"বেডটাইম মোড চালু থাকায় এই সুবিধা উপলভ্য নয়"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"বিজ্ঞপ্তির দেখানোর অগ্রাধিকার রিসেট করার প্রক্রিয়া সম্পূর্ণ হয়েছে।"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"অ্যাপ"</string>
+ <!-- no translation found for bluetooth_message_access_notification_content (2986108412562309009) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_title (9009836130395061579) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_content (6004506637437582983) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_notification_content (4280361621526852063) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_title (7624607995928968721) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_content (2235876209172857819) -->
+ <skip />
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index fae1b16..ab26f46 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -1042,8 +1042,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 adrese"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Sačuvane mreže"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Pretplate"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Druge mreže"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP postavke"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Napredne WiFi postavke nisu dostupne za ovog korisnika"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Sačuvaj"</string>
@@ -1618,7 +1617,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Izbriši APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Novi APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Sačuvaj"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Odbaci"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Otkaži"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Polje Ime ne može ostati prazno."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Naziv pristupne tačke ne može biti prazan."</string>
@@ -1633,8 +1632,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikacije se mogu vratiti na zadano"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Vrati WiFi, mobilnu i Bluetooth vezu na zadano"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Sve postavke mreže vratit će se na zadano, uključujući:\n\n"<li>"WiFi"</li>\n<li>"Prijenos podataka na mobilnoj mreži"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Izbriši"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Izbriši preuzete SIM-ove"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Za preuzimanje zamjenskih SIM-ova, obratite se svom mobilnom operateru. Ovim se neće otkazati nijedan paket mobilne usluge."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Ovim se neće otkazati paketi mobilnih usluga. Da preuzmete zamjenske SIM-ove, kontaktirajte svog mobilnog operatera."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Vrati postavke na zadano"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Vratiti sve postavke mreže na zadano? Ovu radnju ne možete poništiti."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Vratiti sve postavke mreže na zadano i izbrisati preuzete SIM-ove? Ovu radnju ne možete poništiti."</string>
@@ -2487,7 +2487,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Koristili ste tablet više nego obično"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Koristili ste uređaj više nego obično"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baterija bi vam se mogla isprazniti brže nego obično"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Očuvanje stanja baterije"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimiziranje radi očuvanja baterije"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Baterija je privremeno ograničena. Dodirnite da saznate više."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Vaš telefon je korišten više nego obično. Baterija se može istrošiti brže nego što je predviđeno.\n\nAplikacije koje najviše troše bateriju:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Vaš tablet je korišten više nego obično. Baterija se može istrošiti brže nego što je predviđeno.\n\nAplikacije koje najviše troše bateriju:"</string>
@@ -4731,6 +4731,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimalan broj vidljivih kompleta podataka"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Vraćanje na zadane vrijednosti"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Opcije za programere za automatsko popunjavanje su vraćene na zadane postavke"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokacija"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Pokazatelj lokacije na statusnoj traci"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Prikaz za sve lokacije, uključujući mreže i povezivost"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Prisilno omogući potpuno GNSS mjerenje"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Praćenje svih konstelacija i frekvencija GNSS-a bez ciklusa rada"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema uređaja"</string>
<string name="default_theme" msgid="4815428567082263639">"Zadano"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Naziv mreže"</string>
@@ -4747,8 +4752,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pauzirajte obavještenja da ostanete fokusirani"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcija nije dostupna"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ova funkcija je isključena jer usporava vaš telefon"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Prisilno omogući potpuno GNSS mjerenje"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Praćenje svih konstelacija i frekvencija GNSS-a bez ciklusa rada"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Uvijek prikaži dijaloški okvir za pad aplikacije"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Prikaz dijaloškog okvira pri svakom padu aplikacije"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Odaberite aplikaciju u kojoj je omogućen ANGLE"</string>
@@ -5135,6 +5138,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Pozivanje putem WiFi-ja vam omogućava da uspostavite i primate pozive putem mreža koje ne pripadaju mobilnom operateru, kao što su neke WiFi mreže."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Pozivi"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferirano"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferiraju se pozivi"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferiraju se SMS-ovi"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nedostupno"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nema SIM-a"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Postavke"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Povežite se s javnim mrežama"</string>
<string name="keywords_internet" msgid="7674082764898690310">"mrežna veza, internet, bežični, podaci, wifi, wi-fi, wi fi, celularni, mobilni, mobilni operater, 4g, 3g, 2g, lte"</string>
@@ -5143,4 +5151,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nedostupno jer je uključen način rada za spavanje"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Poništavanje važnosti obavještenja je završeno."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikacije"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Nepouzdani uređaj želi pristupiti vašim porukama. Dodirnite za detalje."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Dozvoliti pristup porukama?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Nepouzdani Bluetooth uređaj, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], želi pristupiti vašim porukama.\n\nNiste se prije povezivali s uređajem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Nepouzdani uređaj želi pristupiti vašim kontaktima i zapisniku poziva. Dodirnite za detalje."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Dozvoliti pristup kontaktima i zapisniku poziva?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Nepouzdani Bluetooth uređaj, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], želi pristupiti vašim kontaktima i zapisniku poziva. To obuhvata podatke o dolaznim i odlaznim pozivima.\n\nNiste se prije povezivali s uređajem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index dc8c34d..4072467 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adreces IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Xarxes desades"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscripcions"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Altres xarxes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Configuració IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"La configuració avançada de la Wi‑Fi no està disponible per a aquest usuari"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Desa"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Suprimeix l\'APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN nou"</string>
<string name="menu_save" msgid="6611465355127483100">"Desa"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Descarta"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancel·la"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"El camp Nom no pot ser buit."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"L\'APN no pot ser buit."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Les aplicacions es poden restablir"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Restableix Wi-Fi, dades mòbils i Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Es restabliran totes les opcions de configuració de la xarxa, inclosos:\n\n"<li>"la Wi‑Fi"</li>\n<li>"les dades mòbils"</li>\n<li>"el Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Esborra"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Esborra les SIM baixades"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Per baixar targetes SIM de substitució, contacta amb el teu operador de telefonia mòbil. Aquesta acció no cancel·larà cap dels plans de servei mòbil."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Aquesta acció no cancel·larà cap dels plans de servei mòbil. Per baixar targetes SIM de substitució, contacta amb el teu operador."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Restableix la configuració"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Vols restablir totes les opcions de configuració de la xarxa? Aquesta acció no es pot desfer."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Vols restablir totes les opcions de configuració de la xarxa i esborrar les targetes SIM baixades? Aquesta acció no es pot desfer."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"La tauleta s\'ha utilitzat més del que és habitual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"El dispositiu s\'ha utilitzat més del que és habitual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Pot ser que la bateria s\'esgoti massa ràpid"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"S\'està mantenint el bon estat de la bateria"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"S\'està optimitzant per a l\'estat de la bateria"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria limitada temporalment. Toca per obtenir més informació."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"El telèfon s\'ha fet servir més del que és habitual i és possible que la bateria s\'esgoti abans del previst.\n\nAplicacions que han consumit més bateria:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"La tauleta s\'ha fet servir més del que és habitual i és possible que la bateria s\'esgoti abans del previst.\n\nAplicacions que han consumit més bateria:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Màxim de conjunts de dades visibles"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Restableix els valors predeterminats"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"S\'han restablert les opcions d\'emplenament automàtic per a desenvolupadors"</string>
+ <string name="location_category" msgid="3496759112306219062">"Ubicació"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador d\'ubicació de la barra d\'estat"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostra per a totes les ubicacions, incloses la xarxa i la connectivitat"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Força mesuraments de GNSS complets"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Fes un seguiment de totes les freqüències i constel·lacions de GNSS sense cicle de treball"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema del dispositiu"</string>
<string name="default_theme" msgid="4815428567082263639">"Predeterminat"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nom de la xarxa"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Posa en pausa les notificacions per centrar l\'atenció"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funció no disponible"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Aquesta funció s\'ha desactivat perquè alenteix el telèfon"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Força mesuraments de GNSS complets"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Fes un seguiment de totes les freqüències i constel·lacions de GNSS sense cicle de treball"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Mostra sempre el quadre de diàleg de bloqueig"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostra el quadre de diàleg cada vegada que una aplicació es bloquegi"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Selecciona l\'aplicació compatible amb ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"La funció Trucades per Wi‑Fi et permet fer i rebre trucades per xarxes sense operador, com ara algunes xarxes Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Trucades"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferit"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"es prefereixen les trucades"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"es prefereixen els SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"no disponible"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No hi ha cap SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferències"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connecta\'t a xarxes públiques"</string>
<string name="keywords_internet" msgid="7674082764898690310">"connexió a la xarxa, internet, sense fil, dades, wifi, wi‑fi, wi fi, mòbils, mòbil, operador de telefonia mòbil, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"No està disponible perquè el mode d\'hora de dormir està activat"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"S\'ha completat el restabliment de la importància de les notificacions."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplicacions"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un dispositiu que no és de confiança vol accedir als teus missatges. Toca per veure més informació."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vols permetre l\'accés als missatges?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un dispositiu Bluetooth que no és de confiança, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vol accedir als teus missatges. \n\nNo t\'has connectat a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] abans."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un dispositiu que no és de confiança vol accedir als teus contactes i al registre de trucades. Toca per veure més informació."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vols permetre l\'accés als contactes i al registre de trucades?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un dispositiu Bluetooth que no és de confiança, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vol accedir als teus contactes i al registre de trucades. Això inclou dades sobre les trucades entrants i sortints.\n\nNo t\'has connectat a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] abans."</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index b94395d..1dc2e95 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adresy IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Uložené sítě"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Odběry"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Ostatní sítě"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Nastavení IP adresy"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Rozšířená nastavení sítě Wi-Fi nejsou pro tohoto uživatele dostupná."</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Uložit"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Smazat přístupový bod"</string>
<string name="menu_new" msgid="6571230342655509006">"Nový přístupový bod"</string>
<string name="menu_save" msgid="6611465355127483100">"Uložit"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Zahodit"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Zrušit"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Pole Jméno nesmí být prázdné."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Název přístupového bodu nesmí být prázdný."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikace lze resetovat"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Resetovat Wi-Fi, data a Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Budou resetována nastavení všech sítí, včetně následujících:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobilní data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Vymazat"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Vymazat stažení SIM karty"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Chcete-li stáhnout náhradní SIM kartu, kontaktujte operátora. Tímto krokem nebude zrušen mobilní tarif."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Tímto krokem nebude zrušen mobilní tarif. Pokud chcete stáhnout náhradní SIM karty, obraťte se na svého operátora."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Obnovit nastavení"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Chcete resetovat všechna nastavení sítí? Tuto akci nelze vrátit zpět."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Obnovit všechna síťová nastavení a vymazat stažené SIM karty? Tuto akci nelze vrátit zpět."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet byl využíván víc než obvykle"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Zařízení bylo využíváno víc než obvykle"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baterie se možná vybije dříve než obvykle"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Uchování výdrže baterie"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimalizace pro výdrž baterie"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Baterie je dočasně omezena. Klepnutím zobrazíte další informace."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefon byl využíván víc než obvykle. Baterie se možná vybije dříve, než bylo očekáváno.\n\nAplikace, které nejvíce spotřebovávají baterii:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablet byl využíván víc než obvykle. Baterie se možná vybije dříve, než bylo očekáváno.\n\nAplikace, které nejvíce spotřebovávají baterii:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max. viditelných datových sad"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Resetovat na výchozí hodnoty"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Možnosti automatického vyplňování pro vývojáře byly resetovány"</string>
+ <string name="location_category" msgid="3496759112306219062">"Poloha"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indikátor polohy na stavovém řádku"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Zobrazit u všech poloh (včetně polohy zjištěné ze sítě a připojení)"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vynutit úplné měření GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Sledovat všechny konstelace a frekvence GNSS bez cyklického vypínání a zapínání"</string>
<string name="device_theme" msgid="5027604586494772471">"Motiv zařízení"</string>
<string name="default_theme" msgid="4815428567082263639">"Výchozí"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Název sítě"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pokud nechcete být rušeni, oznámení pozastavte"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkce není k dispozici"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Tato funkce byla vypnuta, protože zpomaluje telefon"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vynutit úplné měření GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Sledovat všechny konstelace a frekvence GNSS bez cyklického vypínání a zapínání"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Vždy zobrazit dialog o pádu"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Zobrazit dialog při každém pádu aplikace"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Vyberte aplikaci podporující ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Volání přes Wi-Fi umožňuje uskutečňovat a přijímat hovory ze sítí nespravované operátory, jako jsou některé sítě Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Volání"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferované"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferované hovory"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferované SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"není k dispozici"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Žádná SIM karta"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Předvolby"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Připojovat k veřejným sítím"</string>
<string name="keywords_internet" msgid="7674082764898690310">"připojení k síti, internet, bezdrátové, data, wifi, wi-fi, wi fi, mobilní síť, mobilní operátor, 4g, 3g, 2g, lte"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nedostupné, protože je zapnutý režim večerky"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset důležitosti oznámení byl dokončen."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikace"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Nedůvěryhodné zařízení žádá o přístup k vašim zprávám. Podrobnosti zobrazíte klepnutím."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Chcete povolit přístup ke zprávám?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Nedůvěryhodné zařízení Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] žádá o přístup k vašim zprávám.\n\nK zařízení [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] jste se ještě nikdy nepřipojili."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Nedůvěryhodné zařízení žádá o přístup k vašim kontaktům a seznamu hovorů. Podrobnosti zobrazíte klepnutím."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Chcete povolit přístup ke kontaktům a seznamu hovorů?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Nedůvěryhodné zařízení Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] žádá o přístup k vašim kontaktům a seznamu hovorů. To zahrnuje data o příchozích a odchozích hovorech.\n\nK zařízení [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] jste se ještě nikdy nepřipojili."</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index b7860ae..c90a66e 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-adresser"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Gemte netværk"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonnementer"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Andre netværk"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-indstillinger"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Avancerede Wi-Fi-indstillinger er ikke tilgængelige for denne bruger"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Gem"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Slet adgangspunkt"</string>
<string name="menu_new" msgid="6571230342655509006">"Nyt adgangspunkt"</string>
<string name="menu_save" msgid="6611465355127483100">"Gem"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Kassér"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Luk"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Feltet Navn skal udfyldes."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Du skal angive et adgangspunkt."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps kan nulstilles"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Nulstil Wi-Fi, mobil og Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Denne handling nulstiller alle netværksindstillinger, bl.a.:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobildata"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Ryd"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Ryd downloadede SIM-kort"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Kontakt dit mobilselskab for at downloade nye SIM-kort. Mobilabonnementer opsiges ikke."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Mobilabonnementer opsiges ikke. Kontakt dit mobilselskab for at downloade nye SIM-kort."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Nulstil indstillinger"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Vil du nulstille alle netværksindstillinger? Denne handling kan ikke fortrydes."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Vil du nulstille alle netværksindstillingerne og rydde downloadede SIM-kort? Denne handling kan ikke fortrydes."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Din tablet er blevet brugt mere end normalt"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Enheden er blevet brugt mere end normalt"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batteriet aflades muligvis hurtigere end normalt"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Sådan får du mest muligt ud af dit batteri"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimerer på baggrund af batteritilstanden"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batteriet er midlertidigt begrænset. Tryk for at få flere oplysninger."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Din telefon er blevet brugt mere end normalt. Dit batteri aflades muligvis hurtigere end forventet.\n\nHer kan du se apps sorteret efter batteriforbrug:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Din tablet er blevet brugt mere end normalt. Dit batteri aflades muligvis hurtigere end forventet.\n\nHer kan du se apps sorteret efter batteriforbrug:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Højeste antal synlige datasæt"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Nulstil til standardværdierne"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Udviklerindstillingerne for autofyld blev nulstillet"</string>
+ <string name="location_category" msgid="3496759112306219062">"Placering"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Placeringsindikator i statusbjælke"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Vis i forbindelse med alle placeringer, herunder netværk og forbindelse"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Gennemtving fuld GNSS-måling"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Registrer alle GNSS-konstellationer og -frekvenser uden opgavegennemløb"</string>
<string name="device_theme" msgid="5027604586494772471">"Enhedstema"</string>
<string name="default_theme" msgid="4815428567082263639">"Standard"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Netværksnavn"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Sæt notifikationer på pause, så du kan koncentrere dig"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funktionen er ikke tilgængelig"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Denne funktion er blevet deaktiveret, fordi den gør din telefon langsom"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Gennemtving fuld GNSS-måling"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Registrer alle GNSS-konstellationer og -frekvenser uden opgavegennemløb"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Vis altid dialogboks med nedbrud"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Vis dialogboks, hver gang en app går ned"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Vælg ANGLE-aktiveret app"</string>
@@ -5052,6 +5055,16 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Med Wi-Fi-opkald kan du foretage og modtage opkald via netværk, der ikke er mobilnetværk, f.eks. Wi‑Fi-netværk."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Opkald"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Sms"</string>
+ <!-- no translation found for calls_sms_preferred (6016477652522583496) -->
+ <skip />
+ <!-- no translation found for calls_sms_calls_preferred (252913858812799809) -->
+ <skip />
+ <!-- no translation found for calls_sms_sms_preferred (5826706870873784062) -->
+ <skip />
+ <!-- no translation found for calls_sms_unavailable (4055729705246556529) -->
+ <skip />
+ <!-- no translation found for calls_sms_no_sim (2336377399761819718) -->
+ <skip />
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Præferencer"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Opret forbindelse til offentlige netværk"</string>
<string name="keywords_internet" msgid="7674082764898690310">"netværksforbindelse, internet, trådløs, data, wifi, wi-fi, mobilnetværk, mobil, mobilselskab, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5073,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Ikke tilgængelig, da sengetidstilstand er aktiveret"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Vigtigheden af notifikationer blev nulstillet."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"En ikke-godkendt enhed vil gerne have adgang til dine beskeder. Tryk for at få flere oplysninger."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vil du give adgang til beskeder?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"En ikke-godkendt Bluetooth-enhed, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vil gerne have adgang til dine beskeder.\n\nDu har ikke oprettet forbindelse til [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] før."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"En ikke-godkendt enhed vil gerne have adgang til dine kontakter og din opkaldsliste. Tryk for at få flere oplysninger."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vil du give adgang til kontakter og opkaldsliste?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"En ikke-godkendt Bluetooth-enhed, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vil gerne have adgang til dine kontakter og din opkaldsliste. Dette omfatter data om indgående og udgående opkald.\n\nDu har ikke oprettet forbindelse til [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] før."</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 36b529a..dc99c3a 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -1023,8 +1023,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-Adressen"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Gespeicherte WLANs"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abos"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Andere Netzwerke"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-Einstellungen"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Erweiterte WLAN-Einstellungen sind für diesen Nutzer nicht verfügbar"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Speichern"</string>
@@ -1598,7 +1597,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN löschen"</string>
<string name="menu_new" msgid="6571230342655509006">"Neuer APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Speichern"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Verwerfen"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Abbrechen"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Das Namensfeld darf nicht leer sein."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN darf nicht leer sein."</string>
@@ -1613,8 +1612,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps können zurückgesetzt werden"</string>
<string name="reset_network_title" msgid="1395494440355807616">"WLAN, mobile Daten & Bluetooth zurücksetzen"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Hierdurch werden sämtliche Netzwerkeinstellungen zurückgesetzt, einschließlich:\n\n"<li>"WLAN"</li>\n<li>"Mobile Daten"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Löschen"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Heruntergeladene SIMs löschen"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Wenn du Ersatz-SIMs herunterladen möchtest, wende dich an deinen Mobilfunkanbieter. Dein Mobilfunkvertrag wird dadurch nicht gekündigt."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Dein Mobilfunkvertrag wird dadurch nicht gekündigt. Wende dich an deinen Mobilfunkanbieter, um Ersatz-SIMs herunterzuladen."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Einstellungen zurücksetzen"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Sämtliche Netzwerkeinstellungen zurücksetzen? Dieser Vorgang kann nicht rückgängig gemacht werden."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Alle Netzwerkeinstellungen zurücksetzen und heruntergeladene SIMs löschen? Dieser Vorgang kann nicht rückgängig gemacht werden."</string>
@@ -2457,7 +2457,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet mehr als üblich genutzt"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Gerät mehr als üblich genutzt"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Der Akku könnte früher als üblich leer sein"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Akkuzustand erhalten"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimierung des Akkuzustands"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Akku vorübergehend eingeschränkt. Für weitere Informationen tippen."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Dein Smartphone wurde intensiver als üblich genutzt. Der Akku könnte deshalb früher als erwartet leer sein.\n\nApps mit höchstem Akkuverbrauch:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Dein Tablet wurde intensiver als üblich genutzt. Der Akku könnte deshalb früher als erwartet leer sein.\n\nApps mit höchstem Akkuverbrauch:"</string>
@@ -4652,6 +4652,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maximale Zahl sichtbarer Datensätze"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Auf Standardwerte zurücksetzen"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Die Optionen für automatisches Ausfüllen für Entwickler wurden zurückgesetzt"</string>
+ <string name="location_category" msgid="3496759112306219062">"Standort"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Standortanzeige in der Statusleiste"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Für alle Standorte anzeigen, einschließlich Netzwerk und Verbindung"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vollständige GNSS-Messung erzwingen"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Alle GNSS-Konstellationen und -Frequenzen ohne GNSS-Zyklus erfassen"</string>
<string name="device_theme" msgid="5027604586494772471">"Gerätedesign"</string>
<string name="default_theme" msgid="4815428567082263639">"Standard"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Netzwerkname"</string>
@@ -4668,8 +4673,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Zur besseren Konzentration Benachrichtigungen pausieren"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funktion nicht verfügbar"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Diese Funktion wurde deaktiviert, weil sie dein Smartphone langsamer macht"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vollständige GNSS-Messung erzwingen"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Alle GNSS-Konstellationen und -Frequenzen ohne GNSS-Zyklus erfassen"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Bei Absturz immer Absturz-Dialogfeld anzeigen"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Bei App-Abstürzen immer Dialogfeld anzeigen"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE-App auswählen"</string>
@@ -4897,14 +4900,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"SIM kann nicht aktiviert werden"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"Nimm die SIM heraus und lege sie dann wieder ein. Sollte das Problem weiterhin bestehen, starte das Gerät neu."</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"Versuche, die SIM noch einmal zu aktivieren. Sollte das Problem weiterhin bestehen, starte das Gerät neu."</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"Netzwerkaktivierung"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> ist aktiviert"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"Tippe, um die SIM-Einstellungen zu aktualisieren"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"SIM-Karte"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"Diese heruntergeladene SIM löschen?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"Wenn du diese SIM löschst, wird der <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g>-Dienst von diesem Gerät entfernt.\n\nDer Mobilfunkvertrag bei <xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> wird dadurch nicht gekündigt."</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"Löschen"</string>
@@ -5057,14 +5056,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Mit WLAN-Telefonie kannst du Anrufe über Netzwerke ohne Mobilfunkanbieter starten und empfangen, wie etwa über einige WLAN-Netzwerke."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Anrufe"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"bevorzugt"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"Anrufe bevorzugt"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS bevorzugt"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nicht verfügbar"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Keine SIM-Karte"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Einstellungen"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Mit öffentlichen Netzwerken verbinden"</string>
<string name="keywords_internet" msgid="7674082764898690310">"netzwerkverbindung, internet, kabellos, drahtlos, daten, wlan, w-lan, mobilfunk, mobil, mobilfunkanbieter, 4g, 3g, 2g, lte"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"Flugsichere Netzwerke anzeigen"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"Flugmodus deaktivieren"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nicht verfügbar, weil der Modus „Schlafenszeit“ aktiviert ist"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Die Wichtigkeit von Benachrichtigungen wurde zurückgesetzt."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Ein nicht vertrauenswürdiges Gerät fordert Zugriff auf deine Nachrichten an. Weitere Informationen."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Möchtest du den Zugriff auf Nachrichten zulassen?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Ein nicht vertrauenswürdiges Bluetooth-Gerät, <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>, fordert Zugriff auf deine Nachrichten an.\n\nDu warst bisher noch nicht mit <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g> verbunden."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Ein nicht vertrauenswürdiges Gerät fordert Zugriff auf deine Kontakte und deine Anrufliste an. Weitere Informationen."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Möchtest du den Zugriff auf Kontakte und Anrufliste zulassen?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Ein nicht vertrauenswürdiges Bluetooth-Gerät, <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>, fordert Zugriff auf deine Kontakte und deine Anrufliste an. Dazu gehören auch Daten über ein- und ausgehende Anrufe.\n\nDu warst bisher noch nicht mit <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g> verbunden."</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 0e2c17a..fe8f6fc 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Διευθύνσεις IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Αποθηκευμένα δίκτυα"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Συνδρομές"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Άλλα δίκτυα"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Ρυθμίσεις IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Οι σύνθετες ρυθμίσεις Wi‑Fi δεν είναι διαθέσιμες για αυτόν το χρήστη"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Αποθ/ση"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Διαγραφή APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Νέο APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Αποθ/ση"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Απόρριψη"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Ακύρωση"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Το πεδίο Όνομα δεν μπορεί να είναι κενό."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Το APN δεν μπορεί να είναι κενό."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Μπορεί να γίνει επαναφορά των εφαρμογών"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Επαναφ. Wi-Fi/mobile/Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Με αυτόν τον τρόπο θα γίνει επαναφορά όλων των ρυθμίσεων δικτύου, μεταξύ των οποίων για:\n\n"<li>"Wi‑Fi"</li>\n<li>"Δεδομένα κινητής τηλεφωνίας"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Διαγραφή"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Διαγραφή ληφθεισών SIM"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Για λήψη SIM αντικατάστασης, επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας σας. Με αυτήν την ενέργεια, δεν θα ακυρωθεί κάποιο πρόγραμμα υπηρεσιών κινητής τηλεφωνίας."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Με αυτήν την ενέργεια, δεν θα ακυρωθεί κανένα πρόγραμμα υπηρεσιών κινητής τηλεφωνίας. Για τη λήψη SIM αντικατάστασης, επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας σας."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Επαναφορά ρυθμίσεων"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Επαναφορά όλων των ρυθμίσεων δικτύου; Δεν μπορείτε να αναιρέσετε αυτή την ενέργεια."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Να γίνει επαναφορά όλων των ρυθμίσεων δικτύου και διαγραφή όλων των SIM των οποίων έγινε λήψη; Δεν μπορείτε να αναιρέσετε αυτή την ενέργεια."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Το tablet χρησιμοποιείται περισσότερο από το συνηθισμένο"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Η συσκευή χρησιμοποιείται περισσότερο από το συνηθισμένο"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Η μπαταρία μπορεί να εξαντληθεί νωρίτερα από το συνηθισμένο"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Διατήρηση της υγείας της μπαταρίας"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Βελτιστοποίηση για τη διατήρηση της καλής κατάστασης της μπαταρίας"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Η μπαταρία περιορίστηκε προσωρινά. Πατήστε για να μάθετε περισσότερα."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Το τηλέφωνό σας έχει χρησιμοποιηθεί περισσότερο από το συνηθισμένο. Η μπαταρία μπορεί να εξαντληθεί πιο σύντομα από το αναμενόμενο.\n\nΚορυφαίες εφαρμογές βάσει χρήσης μπαταρίας:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Το tablet έχει χρησιμοποιηθεί περισσότερο από το συνηθισμένο. Η μπαταρία μπορεί να εξαντληθεί πιο σύντομα από το αναμενόμενο.\n\nΚορυφαίες εφαρμογές βάσει χρήσης μπαταρίας:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Μέγιστα ορατά σύνολα δεδομένων"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Επαναφορά στις προεπιλεγμένες τιμές"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Έγινε επαναφορά των επιλογών προγραμματιστή αυτόματης συμπλήρωσης"</string>
+ <string name="location_category" msgid="3496759112306219062">"Τοποθεσία"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Ένδειξη τοποθεσίας στη γραμμή κατάστασης"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Εμφάνιση για όλες τις τοποθεσίες, συμπεριλαμβανομένου του δικτύου και της συνδεσιμότητας"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Αναγκαστικές πλήρεις μετρήσεις GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Παρακολούθηση όλων των πανοραμικών συνθέσεων και των συχνοτήτων GNSS χωρίς κύκλο λειτουργιών"</string>
<string name="device_theme" msgid="5027604586494772471">"Θέμα συσκευής"</string>
<string name="default_theme" msgid="4815428567082263639">"Προεπιλογή"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Όνομα δικτύου"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Θέστε σε παύση τις ειδοποιήσεις για να παραμένετε συγκεντρωμένοι"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Η λειτουργία δεν είναι διαθέσιμη"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Αυτή η λειτουργία απενεργοποιήθηκε επειδή καθυστερεί το τηλέφωνό σας"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Αναγκαστικές πλήρεις μετρήσεις GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Παρακολούθηση όλων των πανοραμικών συνθέσεων και των συχνοτήτων GNSS χωρίς κύκλο λειτουργιών"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Να εμφανίζεται πάντα το παράθυρο διαλόγου σφάλματος"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Να εμφανίζεται το παράθυρο διαλόγου κάθε φορά που παρουσιάζεται σφάλμα σε κάποια εφαρμογή"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Επιλογή εφαρμογής με δυνατότητα χρήσης ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Με τη λειτουργία Κλήση Wi-Fi μπορείτε να πραγματοποιείτε και να λαμβάνετε κλήσεις μέσω δικτύων που δεν ανήκουν στην εταιρεία κινητής τηλεφωνίας, όπως ορισμένα δίκτυα Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Κλήσεις"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"προτιμώνται"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"προτιμώνται οι κλήσεις"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"προτιμώνται τα SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"μη διαθέσιμη"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Δεν υπάρχει SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Προτιμήσεις"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Σύνδεση σε δημόσια δίκτυα"</string>
<string name="keywords_internet" msgid="7674082764898690310">"σύνδεση δικτύου, διαδίκτυο, ασύρματο, δεδομένα, wifi, wi-fi, wi fi, δίκτυο κινητής τηλεφωνίας, κινητό, εταιρεία κινητής τηλεφωνίας, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Μη διαθέσιμη επιλογή επειδή η λειτουργία ώρας ύπνου είναι ενεργή."</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Η επαναφορά σημασίας ειδοποίησης ολοκληρώθηκε."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Εφαρμογές"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Μια μη αξιόπιστη συσκευή θέλει να αποκτήσει πρόσβαση στα μηνύματά σας. Πατήστε για λεπτομέρειες."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Να επιτρέπεται η πρόσβαση σε μηνύματα;"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Μια μη αξιόπιστη συσκευή Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], θέλει να αποκτήσει πρόσβαση στα μηνύματά σας.\n\nΔεν έχετε συνδεθεί στη συσκευή [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] στο παρελθόν."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Μια μη αξιόπιστη συσκευή θέλει να αποκτήσει πρόσβαση στις επαφές και το αρχείο καταγραφής κλήσεων. Πατήστε για λεπτομέρειες."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Να επιτρέπεται η πρόσβαση στις επαφές και στο αρχείο καταγραφής κλήσεων;"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Μια μη αξιόπιστη συσκευή Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], θέλει να αποκτήσει πρόσβαση στις επαφές και το αρχείο καταγραφής κλήσεων. Αυτό περιλαμβάνει δεδομένα σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις.\n\nΔεν έχετε συνδεθεί στη συσκευή [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] στο παρελθόν."</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 406f497..3393b17 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 addresses"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saved networks"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscriptions"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Other networks"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP settings"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi advanced settings are not available for this user"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Save"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Delete APN"</string>
<string name="menu_new" msgid="6571230342655509006">"New APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Save"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Discard"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancel"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"The Name field can\'t be empty."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"The APN cannot be empty."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps can be reset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reset wi-fi, mobile and Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"This will reset all network settings, including:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobile data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Erase"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Erase downloaded SIMs"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"To download replacement SIMs, contact your carrier. This won\'t cancel any mobile service plans."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"This won’t cancel any mobile service plans. To download replacement SIMs, contact your operator."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reset settings"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Reset all network settings? You can\'t undo this action."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reset all network settings and erase downloaded SIMs? You can\'t undo this action."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet used more than usual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Device used more than usual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Battery may run out earlier than usual"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preserving battery health"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimising for battery health"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Battery limited temporarily. Tap to learn more."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max visible datasets"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reset to default values"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Auto-fill developer options have been reset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Location"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bar location indicator"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Show for all locations, including network and connectivity"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Device theme"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Network name"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pause notifications to stay focused"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Feature not available"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"This feature has been turned off because it slows down your phone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Always show crash dialogue"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Show dialogue every time an app crashes"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Select ANGLE enabled app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi calling allows you to make and receive calls over non‑operator networks, such as some Wi‑Fi networks."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Calls"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferred"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"calls preferred"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS preferred"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"unavailable"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connect to public networks"</string>
<string name="keywords_internet" msgid="7674082764898690310">"network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, mobile operator, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Unavailable because bedtime mode is on"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset notification importance completed."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Untrusted device wants to access your messages. Tap for details."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Allow access to messages?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your messages.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Untrusted device wants to access your contacts and call log. Tap for details."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Allow access to contacts and call log?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your contacts and call log. This includes data about incoming and outgoing calls.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 1967f5d..8f1ea0a 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 addresses"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saved networks"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscriptions"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Other networks"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP settings"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi advanced settings are not available for this user"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Save"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Delete APN"</string>
<string name="menu_new" msgid="6571230342655509006">"New APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Save"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Discard"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancel"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"The Name field can\'t be empty."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"The APN cannot be empty."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps can be reset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reset Wi-Fi, mobile and Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"This will reset all network settings, including:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobile data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Erase"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Erase downloaded SIMs"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"To download replacement SIMs, contact your carrier. This won\'t cancel any mobile service plans."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"This won’t cancel any mobile service plans. To download replacement SIMs, contact your operator."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reset settings"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Reset all network settings? You can\'t undo this action."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reset all network settings and erase downloaded SIMs? You can\'t undo this action."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet used more than usual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Device used more than usual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Battery may run out earlier than usual"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preserving battery health"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimising for battery health"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Battery limited temporarily. Tap to learn more."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max visible datasets"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reset to default values"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Auto-fill developer options have been reset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Location"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bar location indicator"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Show for all locations, including network and connectivity"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Device theme"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Network name"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pause notifications to stay focused"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Feature not available"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"This feature has been turned off because it slows down your phone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Always show crash dialogue"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Show dialogue every time an app crashes"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Select ANGLE enabled app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi calling allows you to make and receive calls over non‑operator networks, such as some Wi‑Fi networks."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Calls"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferred"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"calls preferred"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS preferred"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"unavailable"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connect to public networks"</string>
<string name="keywords_internet" msgid="7674082764898690310">"network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, mobile operator, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Unavailable because bedtime mode is on"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset notification importance completed."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Untrusted device wants to access your messages. Tap for details."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Allow access to messages?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your messages.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Untrusted device wants to access your contacts and call log. Tap for details."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Allow access to contacts and call log?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your contacts and call log. This includes data about incoming and outgoing calls.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 52e21cf..fa94b82 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 addresses"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saved networks"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscriptions"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Other networks"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP settings"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi advanced settings are not available for this user"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Save"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Delete APN"</string>
<string name="menu_new" msgid="6571230342655509006">"New APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Save"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Discard"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancel"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"The Name field can\'t be empty."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"The APN cannot be empty."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps can be reset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reset Wi-Fi, mobile & Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"This will reset all network settings, including:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobile data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Erase"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Erase downloaded SIMs"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"To download replacement SIMs, contact your operator. This won’t cancel any mobile service plans."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"This won’t cancel any mobile service plans. To download replacement SIMs, contact your operator."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reset settings"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Reset all network settings? You can’t undo this action."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reset all network settings and delete downloaded SIMs? You can’t undo this action."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet used more than usual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Device used more than usual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Battery may run out earlier than usual"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preserving battery health"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimising for battery health"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Battery limited temporarily. Tap to learn more."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max visible datasets"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reset to default values"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Auto-fill developer options have been reset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Location"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bar location indicator"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Show for all locations, including network and connectivity"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Device theme"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Network name"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pause notifications to stay focused"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Feature not available"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"This feature has been turned off because it slows down your phone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Always show crash dialogue"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Show dialogue every time an app crashes"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Select ANGLE enabled app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi calling allows you to make and receive calls over non‑operator networks, such as some Wi‑Fi networks."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Calls"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferred"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"calls preferred"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS preferred"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"unavailable"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connect to public networks"</string>
<string name="keywords_internet" msgid="7674082764898690310">"network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, mobile operator, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Unavailable because bedtime mode is on"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset notification importance completed."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Untrusted device wants to access your messages. Tap for details."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Allow access to messages?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your messages.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Untrusted device wants to access your contacts and call log. Tap for details."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Allow access to contacts and call log?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your contacts and call log. This includes data about incoming and outgoing calls.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 1f2060e..66ce5da 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 addresses"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saved networks"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscriptions"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Other networks"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP settings"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi advanced settings are not available for this user"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Save"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Delete APN"</string>
<string name="menu_new" msgid="6571230342655509006">"New APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Save"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Discard"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancel"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"The Name field can\'t be empty."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"The APN cannot be empty."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps can be reset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reset Wi-Fi, mobile and Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"This will reset all network settings, including:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobile data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Erase"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Erase downloaded SIMs"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"To download replacement SIMs, contact your operator. This won’t cancel any mobile service plans."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"This won’t cancel any mobile service plans. To download replacement SIMs, contact your operator."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reset settings"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Reset all network settings? You can’t undo this action."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reset all network settings and delete downloaded SIMs? You can’t undo this action."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet used more than usual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Device used more than usual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Battery may run out earlier than usual"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preserving battery health"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimising for battery health"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Battery limited temporarily. Tap to learn more."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max visible datasets"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reset to default values"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Auto-fill developer options have been reset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Location"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bar location indicator"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Show for all locations, including network and connectivity"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Device theme"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Network name"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pause notifications to stay focused"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Feature not available"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"This feature has been turned off because it slows down your phone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Always show crash dialogue"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Show dialogue every time an app crashes"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Select ANGLE enabled app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi calling allows you to make and receive calls over non‑operator networks, such as some Wi‑Fi networks."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Calls"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferred"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"calls preferred"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS preferred"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"unavailable"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connect to public networks"</string>
<string name="keywords_internet" msgid="7674082764898690310">"network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, mobile operator, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Unavailable because bedtime mode is on"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset notification importance completed."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Untrusted device wants to access your messages. Tap for details."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Allow access to messages?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your messages.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Untrusted device wants to access your contacts and call log. Tap for details."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Allow access to contacts and call log?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your contacts and call log. This includes data about incoming and outgoing calls.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index efc05f2..ca37379 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 addresses"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saved networks"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscriptions"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Other networks"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP settings"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi advanced settings are not available for this user"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Save"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Delete APN"</string>
<string name="menu_new" msgid="6571230342655509006">"New APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Save"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Discard"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancel"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"The Name field can’t be empty."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"The APN can’t be empty."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps can be reset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reset Wi-Fi, mobile & Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"This will reset all network settings, including:\n\n"<li>"Wi‑Fi"</li>"\n"<li>"Mobile data"</li>"\n"<li>"Bluetooth"</li>""</string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Erase"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Erase downloaded SIMs"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"To download replacement SIMs, contact your carrier. This won’t cancel any mobile service plans."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"This won’t cancel any mobile service plans. To download replacement SIMs, contact your carrier."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reset settings"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Reset all network settings? You can’t undo this action."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reset all network settings and erase downloaded SIMs? You can’t undo this action."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet used more than usual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Device used more than usual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Battery may run out earlier than usual"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preserving battery health"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimizing for battery health"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Battery limited temporarily. Tap to learn more."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nTop apps by battery usage:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max visible datasets"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reset to default values"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Autofill developer options have been reset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Location"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bar location indicator"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Show for all locations, including network and connectivity"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Device theme"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Network name"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pause notifications to stay focused"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Feature not available"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"This feature has been turned off because it slows down your phone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Force full GNSS measurements"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Track all GNSS constellations and frequencies with no duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Always show crash dialog"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Show dialog every time an app crashes"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Select ANGLE enabled app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi calling allows you to make and receive calls over non‑carrier networks such as some Wi‑Fi networks."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Calls"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferred"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"calls preferred"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS preferred"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"unavailable"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connect to public networks"</string>
<string name="keywords_internet" msgid="7674082764898690310">"network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, cell carrier, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Unavailable because bedtime mode is on"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset notification importance completed."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Untrusted device wants to access your messages. Tap for details."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Allow access to messages?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your messages.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Untrusted device wants to access your contacts and call log. Tap for details."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Allow access to contacts and call log?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"An untrusted Bluetooth device, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wants to access your contacts and call log. This includes data about incoming and outgoing calls.\n\nYou haven’t connected to [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] before."</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index cb055a6..5ae9844 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Direcciones IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Redes guardadas"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Suscripciones"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Otras redes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Configuración de IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"La configuración avanzada de Wi‑Fi no está disponible para este usuario"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Guardar"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Eliminar APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN nuevo"</string>
<string name="menu_save" msgid="6611465355127483100">"Guardar"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Descartar"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancelar"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"El campo Nombre no puede estar vacío."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"El APN no puede estar vacío."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Se pueden restablecer las apps"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Restablecer configuración de Wi-Fi, datos móviles y Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Se restablecerán las opciones de configuración de todas las redes, lo que incluye:\n\n"<li>"Wi‑Fi"</li>\n<li>"Datos móviles"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Borrar"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Borrar tarjeta SIM descargada"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para descargar tarjetas SIM de reemplazo, comunícate con tu proveedor. Esta acción no cancelará ningún plan de servicio móvil."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Esta acción no cancelará ningún plan de servicio móvil. Para descargar tarjetas SIM de reemplazo, comunícate con tu proveedor."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Restablecer configuración"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"¿Quieres restablecer toda la configuración de red? No podrás deshacer esta acción."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"¿Quieres restablecer toda la configuración de red y borrar las tarjetas SIM descargadas? No podrás deshacer esta acción."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"La tablet se usó más de lo habitual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"El dispositivo se usó más de lo habitual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"La batería podría agotarse antes de lo habitual"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Cómo preservar el estado de la batería"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimizando el estado de la batería"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batería limitada temporalmente. Presiona para obtener más información."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"El teléfono se usó más de lo habitual. Es posible que la batería se agote antes de lo esperado.\n\nEstas son las apps que más batería consumen:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"La tablet se usó más de lo habitual. Es posible que la batería se agote antes de lo esperado.\n\nEstas son las apps que más batería consumen:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Máximo de conjuntos de datos visibles"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Restablecer valores predeterminados"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Se restablecieron las opciones de autocompletar para desarrolladores"</string>
+ <string name="location_category" msgid="3496759112306219062">"Ubicación"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador de ubicación de la barra de estado"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostrar para todas las ubicaciones, incluidas la red y la conectividad"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forzar dimensiones GNSS completas"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Seguir todas las frecuencias y constelaciones de GNSS sin ciclo de funciones"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema del dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Predeterminado"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nombre de la red"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pausa las notificaciones para concentrarte"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Función no disponible"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Se desactivó esta función porque ralentiza el teléfono"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forzar dimensiones GNSS completas"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Seguir todas las frecuencias y constelaciones de GNSS sin ciclo de funciones"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Mostrar siempre el cuadro de diálogo de bloqueos"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostrar el cuadro de diálogo cada vez que falle una app"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Seleccionar app compatible con ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Con las Llamadas por Wi‑Fi, puedes llamar y recibir llamadas a través de redes que no son de proveedores, como algunas redes Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Llamadas"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferencia"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferencia para llamadas"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferencia para SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"no disponible"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"No hay ninguna tarjeta SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferencias"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Conectarse a redes públicas"</string>
<string name="keywords_internet" msgid="7674082764898690310">"conexión de red, internet, inalámbrico, datos, wifi, wi-fi, wi fi, datos móviles, móvil, proveedor de telefonía, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"No disponible cuando el modo hora de dormir está activado"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Se restableció la prioridad de notificaciones."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un dispositivo que no es de confianza quiere acceder a tus mensajes. Presiona para ver más detalles"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"¿Quieres permitir el acceso a los mensajes?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un dispositivo Bluetooth que no es de confianza, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quiere acceder a tus mensajes.\n\nNo te conectaste a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] antes."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un dispositivo que no es de confianza quiere acceder a tus contactos y al registro de llamadas. Presiona para ver más detalles"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"¿Quieres permitir el acceso a los contactos y al registro de llamadas?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un dispositivo Bluetooth que no es de confianza, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quiere acceder a tus contactos y al registro de llamadas. Esto incluye datos sobre llamadas entrantes y salientes.\n\nNo te conectaste a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] antes."</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 3880e70..cbc38df 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -769,7 +769,7 @@
<string name="bluetooth_dock_settings_remember" msgid="6993526033095292609">"Ajustes de recordatorio"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="3114156958598821615">"Máximo de dispositivos de audio conectados por Bluetooth"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="4056811727247312473">"Selecciona el número máximo de dispositivos de audio conectados por Bluetooth"</string>
- <string name="wifi_display_settings_title" msgid="6451625615274960175">"Enviar pantalla"</string>
+ <string name="wifi_display_settings_title" msgid="6451625615274960175">"Enviar"</string>
<string name="keywords_wifi_display_settings" msgid="5753883229564422679">"proyectar"</string>
<string name="wifi_display_enable_menu_item" msgid="7391841780777318134">"Habilitar pantalla inalámbrica"</string>
<string name="wifi_display_no_devices_found" msgid="7904877793677102805">"No hay dispositivos cercanos."</string>
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Direcciones IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Redes guardadas"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Suscripciones"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Otras redes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Ajustes de IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Este usuario no puede utilizar los ajustes avanzados de Wi‑Fi"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Guardar"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Eliminar APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nuevo APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Guardar"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Descartar"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancelar"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"El campo Nombre no puede estar vacío."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"El campo APN no puede estar vacío."</string>
@@ -1612,8 +1611,11 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Las aplicaciones se pueden reiniciar"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Recuperar Wi-Fi, red móvil y Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Se recuperarán todos los ajustes de red, como:\n\n"<li>"Wi‑Fi"</li>\n<li>"Datos móviles"</li>\n<li>"Bluetooth"</li></string>
+ <!-- no translation found for erase_euicc_data_button (728078969563311737) -->
+ <skip />
<string name="reset_esim_title" msgid="6152167073280852849">"Borrar las SIM descargadas"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para descargar SIM de sustitución, ponte en contacto con tu operador. Esta acción no cancelará ningún plan de servicios móviles."</string>
+ <!-- no translation found for reset_esim_desc (3662444090563399131) -->
+ <skip />
<string name="reset_network_button_text" msgid="2281476496459610071">"Recuperar ajustes"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"¿Quieres restablecer la configuración de red? No podrás deshacer esta acción."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"¿Quieres recuperar todos los ajustes de red y borrar todas las SIM descargadas? No podrás deshacer esta acción."</string>
@@ -2456,7 +2458,8 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"El tablet se ha usado más de lo normal"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"El dispositivo se ha usado más de lo normal"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Quizás se agote la batería antes de lo normal"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preservando estado de la batería"</string>
+ <!-- no translation found for battery_tip_limited_temporarily_title (7152799456221596915) -->
+ <skip />
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batería limitada temporalmente. Toca para ver más información."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Tu teléfono se ha usado más de lo normal y es posible te quedes sin batería antes de lo esperado.\n\nEstas son las aplicaciones que más batería consumen:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tu tablet se ha usado más de lo normal y es posible te quedes sin batería antes de lo esperado.\n\nEstas son las aplicaciones que más batería consumen:"</string>
@@ -4651,6 +4654,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Número máximo de conjuntos de datos visibles"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Restablecer valores predeterminados"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Se ha restablecido la opción de autocompletar las opciones del desarrollador"</string>
+ <string name="location_category" msgid="3496759112306219062">"Ubicación"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador de ubicación en la barra de estado"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostrar con todas las ubicaciones, incluidas la red y la conectividad"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forzar mediciones de GNSS completas"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Registrar todas las frecuencias y constelaciones de GNSS sin ciclo de servicio"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema del dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Predeterminado"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nombre de la red"</string>
@@ -4667,8 +4675,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pausa las notificaciones para concentrarte"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Función no disponible"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Esta función se ha desactivado porque ralentiza el teléfono"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forzar mediciones de GNSS completas"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Registrar todas las frecuencias y constelaciones de GNSS sin ciclo de servicio"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Mostrar siempre el cuadro de diálogo de fallos"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostrar el cuadro de diálogo cuando una aplicación falle"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Seleccionar una aplicación para usar ANGLE"</string>
@@ -5052,6 +5058,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Con las llamadas por Wi‑Fi, puedes llamar y recibir llamadas por redes que no son de operadores, como ciertas redes Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Llamadas"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferida"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferida para las llamadas"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferida para los SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"no disponible"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Sin tarjeta SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferencias"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Conectarse a redes públicas"</string>
<string name="keywords_internet" msgid="7674082764898690310">"conexión de red, internet, inalámbrico, datos, wifi, wi-fi, wi fi, datos móviles, móvil, operador de telefonía, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5071,16 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"No disponible porque el modo Descanso está activado"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Borrado de la importancia de las notificaciones completado."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplicaciones"</string>
+ <!-- no translation found for bluetooth_message_access_notification_content (2986108412562309009) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_title (9009836130395061579) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_content (6004506637437582983) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_notification_content (4280361621526852063) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_title (7624607995928968721) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_content (2235876209172857819) -->
+ <skip />
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 79100f5..e294c19 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-aadressid"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Salvestatud võrgud"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Tellimused"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Muud võrgud"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-seaded"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"WiFi täpsemad seaded pole selle kasutaja jaoks saadaval"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Salvesta"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Kustuta pääsupunktinimi"</string>
<string name="menu_new" msgid="6571230342655509006">"Uus pääsupunkt"</string>
<string name="menu_save" msgid="6611465355127483100">"Salvesta"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Loobu"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Tühista"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Nimeväli ei tohi tühi olla."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ei saa olla tühi."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Rakendused saab lähtestada"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Lähtesta WiFi, mobiilne andmeside ja Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"See lähtestab kõik võrguseaded, sh:\n\n"<li>"WiFi"</li>\n<li>"Mobiilne andmeside"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Kustuta"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Kustuta allalaaditud SIM-id"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Asendus-SIM-kaartide allalaadimiseks võtke ühendust operaatoriga. See ei tühista mobiilsideteenuse pakette."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"See ei tühista mobiilsideteenuse pakette. Asendus-SIM-kaartide allalaadimiseks võtke ühendust operaatoriga."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Lähtesta seaded"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Kas soovite kõik võrguseaded lähtestada? Seda toimingut ei saa tagasi võtta."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Kas soovite kõik võrguseaded lähtestada ja allalaaditud SIM-id kustutada? Seda toimingut ei saa tagasi võtta."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tahvelarvutit on kasutatud tavapärasest rohkem"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Seadet on kasutatud tavapärasest rohkem"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Aku võib tavapärasest kiiremini tühjaks saada"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Akutase säästmine"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimeerimine aku seisukorra põhjal"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Akutase on ajutiselt piiratud. Lisateabe saamiseks puudutage."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Teie telefoni on kasutatud tavapärasest rohkem. Aku võib oodatust kiiremini tühjaks saada.\n\nEnim akut kasutanud rakendused:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Teie tahvelarvutit on kasutatud tavapärasest rohkem. Aku võib oodatust kiiremini tühjaks saada.\n\nEnim akut kasutanud rakendused:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max nähtavate andmekomplektide arv"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Vaikeväärtustele lähtestamine"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Arendaja automaattäite valikud on lähtestatud"</string>
+ <string name="location_category" msgid="3496759112306219062">"Asukoht"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Olekuriba asukohanäidik"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Kuva kõikide asukohtade puhul (sh võrk ja ühenduvus)"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Jõusta GNSS-i täielikud mõõtmistulemused"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Jälgi kõiki GNSS-i radu ja sagedusi ilma töötsüklita"</string>
<string name="device_theme" msgid="5027604586494772471">"Seadme teema"</string>
<string name="default_theme" msgid="4815428567082263639">"Vaikeseade"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Võrgu nimi"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Keskendumiseks peatage märguanded"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funktsioon pole saadaval"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"See funktsioon on välja lülitatud, kuna see muudab teie telefoni aeglaseks"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Jõusta GNSS-i täielikud mõõtmistulemused"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Jälgi kõiki GNSS-i radu ja sagedusi ilma töötsüklita"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Kuva alati kokkujooksmise dialoog"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Dialoog kuvatakse alati, kui rakendus kokku jookseb"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Valige rakendus, milles ANGLE on lubatud"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"WiFi-kõned võimaldavad teil helistada ja kõnesid vastu võtta operaatoriväliste võrkude kaudu (nt mõned WiFi-võrgud)."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Kõned"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"eelistatud"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"eelistatud on kõned"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"eelistatud on SMS-id"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"pole saadaval"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM-kaarti pole"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Eelistused"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Ühenda avalike võrkudega"</string>
<string name="keywords_internet" msgid="7674082764898690310">"võrguühendus, internet, juhtmeta, andmeside, wifi, wi-fi, wi fi, mobiilside, mobiilsideoperaator, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Pole saadaval, kuna uneaja režiim on sisse lülitatud"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Märguande olulisuse lähtestamine viidi lõpule."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Rakendused"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Ebausaldusväärne seade soovib saada juurdepääsu teie sõnumitele. Puudutage üksikasjade nägemiseks."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Kas lubada juurdepääs sõnumitele?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Ebausaldusväärne Bluetooth-seade [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] soovib saada juurdepääsu teie sõnumitele.\n\nTe pole seadmega [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] varem ühendust loonud."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Ebausaldusväärne seade soovib saada juurdepääsu teie kontaktidele ja kõnelogile. Puudutage üksikasjade nägemiseks."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Kas lubada juurdepääs kontaktidele ja kõnelogile?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Ebausaldusväärne Bluetooth-seade [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] soovib saada juurdepääsu teie kontaktidele ja kõnelogile. See hõlmab andmeid sissetulevate ja väljuvate kõnede kohta.\n\nTe pole seadmega [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] varem ühendust loonud."</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index b5d063c..905d11f 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 helbideak"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Gordetako sareak"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Harpidetzak"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Beste sare batzuk"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IParen ezarpenak"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Erabiltzaile honek ezin ditu erabili Wi-Fi aurreratuaren ezarpenak"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Gorde"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Ezabatu APNa"</string>
<string name="menu_new" msgid="6571230342655509006">"APN berria"</string>
<string name="menu_save" msgid="6611465355127483100">"Gorde"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Baztertu"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Utzi"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Izena eremuak ezin du hutsik egon."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APNak ezin du hutsik egon."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Berrezar daitezke aplikazioak"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Berrezarri wifi, Bluetooth eta sare mugikorrak"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Hori eginez gero, sare guztien ezarpenak berrezarriko dira, besteak beste: \n\n"<li>"Wifia"</li>\n<li>"Datu-konexioa"</li>\n<li>"Bluetooth-a"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Ezabatu eduki guztia"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Ezabatu deskargatutako SIMen edukia"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Ordezko SIM txartelak deskargatzeko, jarri operadorearekin harremanetan. Ez da utziko bertan behera mugikorraren zerbitzu-planik."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Ez da utziko bertan behera mugikorraren zerbitzu-planik. Ordezko SIMak deskargatzeko, jarri harremanetan operadorearekin."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Berrezarri ezarpenak"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Sareko ezarpen guztiak berrezarri nahi dituzu? Ezin da desegin ekintza hori."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Sareko ezarpen guztiak berrezarri eta deskargatutako SIM txartelen datu guztiak ezabatu nahi dituzu? Ezin da desegin ekintza hori."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tableta ohi baino gehiago erabili da"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Gailua ohi baino gehiago erabili da"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baliteke bateria ohi baino lehenago agortzea"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Bateriaren egoera ona mantentzen"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimizatzen, bateria egoera onean mantentzeko"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria mugatuta egongo da aldi batez. Informazio gehiago lortzeko, sakatu hau."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefonoa ohi baino gehiago erabili da. Baliteke bateria espero baino lehenago agortzea.\n\nBateria gehien erabili duten aplikazioak:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tableta ohi baino gehiago erabili da. Baliteke bateria espero baino lehenago agortzea.\n\nBateria gehien erabili duten aplikazioak:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Ikusgai dauden gehieneko datu multzoak"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Berrezarri balio lehenetsiak"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Garatzaileak ez ditu berrezarri betetze automatikoko aukerak"</string>
+ <string name="location_category" msgid="3496759112306219062">"Kokapena"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Kokapen-adierazlearen egoera-barra"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Erakutsi kokapen guztietan, sarea eta konektagarritasuna barne"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Behartu GNSS neurketa osoak gauzatzera"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Egin GNSS konstelazio eta maiztasun guztien jarraipena, eginbeharren ziklorik gabe"</string>
<string name="device_theme" msgid="5027604586494772471">"Gailuaren gaia"</string>
<string name="default_theme" msgid="4815428567082263639">"Lehenetsia"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Sarearen izena"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pausatu jakinarazpenak arreta ez galtzeko"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Eginbidea ez dago erabilgarri"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Eginbidea desaktibatu egin da, telefonoa moteltzen duelako"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Behartu GNSS neurketa osoak gauzatzera"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Egin GNSS konstelazio eta maiztasun guztien jarraipena, eginbeharren ziklorik gabe"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Erakutsi beti hutsegiteen leihoak"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Erakutsi leiho bat aplikazioren batek huts egiten duen bakoitzean"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Hautatu ANGLE-rekin bateragarria den aplikazio bat"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wifi bidezko deiekin, deiak egin eta jaso ahalko dituzu operadore batenak ez diren sareen bitartez (adibidez, zenbait wifi-sare)."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Deiak"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMSa"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"hobetsiak"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"deiak hobesten dira"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMSak hobesten dira"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ez dago erabilgarri"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Ez dago SIM txartelik"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Hobespenak"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Konektatu sare publikoetara"</string>
<string name="keywords_internet" msgid="7674082764898690310">"sareko konexioa, internet, hari gabeko konexioak, datuak, wifia, mugikorra, telefono mugikorra, operadorea, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Ez dago erabilgarri, lo egiteko garaiaren modua aktibatuta dagoelako"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Berrezarri da jakinarazpenen garrantzia."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikazioak"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Fidagarria ez den gailu batek zure mezuak atzitu nahi ditu. Sakatu xehetasunak ikusteko."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Mezuak atzitzeko baimena eman nahi diozu?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Fidagarria ez den Bluetooth bidezko gailu batek ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) zure mezuak atzitu nahi ditu.\n\nEz zara inoiz konektatu [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] gailura."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Fidagarria ez den gailu batek zure kontaktuak eta deien historia atzitu nahi ditu. Sakatu xehetasunak ikusteko."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Kontaktuak eta deien historia atzitzeko baimena eman nahi diozu?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Fidagarria ez den Bluetooth bidezko gailu batek ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) zure kontaktuak eta deien historia atzitu nahi ditu. Hor sartzen dira jasotako eta egindako deiei buruzko datuak.\n\nEz zara inoiz konektatu [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] gailura."</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 8895e6e..f801e7c 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"نشانیهای IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"شبکههای ذخیرهشده"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"اشتراکها"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"شبکههای دیگر"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"تنظیمات IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"تنظیمات پیشرفته Wi‑Fi برای این کاربر در دسترس نیست"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ذخیره"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"حذف نام نقطه دستیابی"</string>
<string name="menu_new" msgid="6571230342655509006">"نام نقطه دستیابی جدید"</string>
<string name="menu_save" msgid="6611465355127483100">"ذخیره"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"صرفنظر"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"لغو"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"قسمت نام نباید خالی باشد."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"نام نقطه دستیابی نمیتواند خالی باشد."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"برنامهها را میتوان بازنشانی کرد"</string>
<string name="reset_network_title" msgid="1395494440355807616">"بازنشانی Wi-Fi، داده شبکه همراه و بلوتوث"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"این کار همه تنظیمات شبکه را بازنشانی میکند، ازجمله:\n\n"<li>"Wi-Fi"</li>\n<li>"داده شبکه تلفن همراه"</li>\n<li>"بلوتوث"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"پاکسازی"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"پاکسازی سیمکارتهای بارشده"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"برای بارگیری سیمکارتهای جایگزین، با شرکت مخابراتیتان تماس بگیرید. با این کار، هیچیک از طرحهای سرویس دستگاه همراه لغو نمیشود."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"با این کار، هیچیک از طرحهای سرویس تلفن همراه لغو نمیشود. برای بارگیری سیمکارتهای جایگزین، با شرکت مخابراتیتان تماس بگیرید."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"بازنشانی تنظیمات"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"همه تنظیمات شبکه بازنشانی شود؟ این کنش واگرد نمیشود."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"همه تنظیمات شبکه بازنشانی شود و سیمکارتهای بارگیریشده پاکسازی شود؟ این کنش واگرد نمیشود."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"رایانه لوحی بیشتر از حد معمول استفاده شده است"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"دستگاه بیشتر از حد معمول استفاده شده است"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ممکن است شارژ باتری زودتر از معمول تمام شود"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"حفظ سلامت باتری"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"بهینهسازی برای سلامت باتری"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"باتری موقتاً محدود شده است. برای اطلاعات بیشتر، ضربه بزنید."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"از تلفنتان بیشازحد معمول استفاده شده است. ممکن است باتری آن زودتر از موعد موردانتظار تمام شود.\n\nبرنامههای برتر براساس مصرف باتری:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"از رایانه لوحی بیش از حد معمول استفاده شده است. ممکن است باتری آن زودتر از موعد موردانتظار تمام شود.\n\nبرنامههای برتر براساس مصرف باتری:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"حداکثر مجموعه دادههای مرئی"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"بازنشانی به مقادیر پیشفرض"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"گزینههای برنامهنویس تکمیل خودکار بازنشانی شد"</string>
+ <string name="location_category" msgid="3496759112306219062">"مکان"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"نشانگر مکان در نوار وضعیت"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"برای همه مکانها نشان داده شود، ازجمله شبکه و اتصال"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"اجرای کامل اندازهگیری GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"بدون دوره کاری، همه دسته عکسهای پانوراما و فرکانسها را ردیابی کنید."</string>
<string name="device_theme" msgid="5027604586494772471">"طرح زمینه دستگاه"</string>
<string name="default_theme" msgid="4815428567082263639">"پیشفرض"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"نام شبکه"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"توقف موقت اعلانها برای متمرکز ماندن"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ویژگی دردسترس نیست."</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"این ویژگی غیرفعال شده است چون سرعت تلفنتان را کاهش میدهد"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"اجرای کامل اندازهگیری GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"بدون دوره کاری، همه دسته عکسهای پانوراما و فرکانسها را ردیابی کنید."</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"همیشه کادر گفتگوی خرابی نمایش داده شود"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"نمایش کادر گفتگو هنگامی که برنامهای خراب میشود"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"برنامه دارای ANGLE فعال انتخاب کنید"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"«تماس ازطریق Wi-Fi» امکان برقراری و دریافت تماس ازطریق شبکههای غیرمخابراتی را (برای مثل برخی از شبکههای Wi-Fi) به شما میدهد."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"تماس"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"پیامک"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"دارای اولویت"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"اولویت با تماس"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"اولویت با پیامک"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"دردسترس نیست"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"سیمکارتی وجود ندارد"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"اولویتها"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"اتصال به شبکههای عمومی"</string>
<string name="keywords_internet" msgid="7674082764898690310">"اتصال شبکه، اینترنت، بیسیم، داده، wifi، wi-fi، wi fi، شبکه تلفن همراه، تلفن همراه، شرکت مخابراتی تلفن همراه، 4g، 3g، 2g، lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"دردسترس نیست زیرا «حالت وقت خواب» روشن است"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"بازنشاندن اهمیت اعلان تکمیل شد."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"برنامهها"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"دستگاه غیرمطمئنی میخواهد به پیامهایتان دسترسی داشته باشد. برای دیدن جزئیات، ضربه بزنید."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"دسترسی به پیامها مجاز شود؟"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"دستگاه بلوتوث غیرمطمئنی، [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]، میخواهد به پیامهایتان دسترسی داشته باشد.\n\nتاکنون به [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] متصل نشدهاید."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"دستگاه غیرمطمئنی میخواهد به مخاطبین و گزارش تماس شما دسترسی داشته باشد. برای دیدن جزئیات، ضربه بزنید."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"دسترسی به مخاطبین و گزارش تماس مجاز شود؟"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"دستگاه بلوتوث غیرمطمئنی، [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]، میخواهد به مخاطبین و گزارش تماس شما دسترسی داشته باشد. این شامل دادههای مربوط به تماسهای ورودی و خروجی میشود.\n\nتاکنون به [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] متصل نشدهاید."</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 25a6d81..150f98b 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-osoitteet"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Tallennetut verkot"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Tilaukset"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Muut verkot"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-asetukset"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi-lisäasetukset eivät ole tämän käyttäjän käytettävissä."</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Tallenna"</string>
@@ -1053,7 +1052,7 @@
<string name="wifi_p2p_cancel_connect_message" msgid="2409074184473879809">"Haluatko peruuttaa laitteelle <xliff:g id="PEER_NAME">%1$s</xliff:g> lähetetyn yhteydenmuodostuskutsun?"</string>
<string name="wifi_p2p_delete_group_message" msgid="4880242270742385699">"Unohdetaanko tämä ryhmä?"</string>
<string name="wifi_hotspot_checkbox_text" msgid="1549663436920597006">"Wi‑Fi-hotspot"</string>
- <string name="wifi_hotspot_off_subtext" msgid="2751383134504362078">"Internetyhteyttä tai sisältöä ei jaeta muiden laitteiden kanssa."</string>
+ <string name="wifi_hotspot_off_subtext" msgid="2751383134504362078">"Internetyhteyttä tai sisältöä ei jaeta muille laitteille."</string>
<string name="wifi_hotspot_tethering_on_subtext" product="tablet" msgid="5832429443898690152">"Tabletin internetyhteys jaetaan hotspotin kautta"</string>
<string name="wifi_hotspot_tethering_on_subtext" product="default" msgid="5451921191609178326">"Puhelimen internetyhteys jaetaan hotspotin kautta"</string>
<string name="wifi_hotspot_on_local_only_subtext" msgid="965051079784031636">"Sovellus jakaa sisältöä – jos haluat jakaa internetyhteyden, sammuta hotspot ja käynnistä se uudelleen"</string>
@@ -1064,9 +1063,9 @@
<string name="wifi_hotspot_password_title" msgid="9096340919454296786">"Hotspotin salasana"</string>
<string name="wifi_hotspot_ap_band_title" msgid="560262446129195042">"AP-taajuus"</string>
<string name="wifi_hotspot_footer_info_regular" msgid="6620216295510397461">"Hotspot-ominaisuudella voit luoda muille laitteillesi Wi-Fi-verkon. Ominaisuus jakaa internetyhteyden muille laitteille mobiilidatayhteydellä. Lisämaksuja mobiilidatan käytöstä voidaan periä."</string>
- <string name="wifi_hotspot_footer_info_local_only" msgid="3813311942370920903">"Sovellukset voivat luoda hotspotin ja jakaa sisältöä lähellä olevien laitteiden kanssa."</string>
+ <string name="wifi_hotspot_footer_info_local_only" msgid="3813311942370920903">"Sovellukset voivat luoda hotspotin ja jakaa sisältöä lähellä oleville laitteille."</string>
<string name="wifi_hotspot_auto_off_title" msgid="8855711787485504882">"Laita hotspot pois päältä automaattisesti"</string>
- <string name="wifi_hotspot_auto_off_summary" msgid="8283656069997871354">"Kun laitteita ei ole yhdistetty"</string>
+ <string name="wifi_hotspot_auto_off_summary" msgid="8283656069997871354">"Kun laitteita ei ole yhdistettynä"</string>
<string name="wifi_tether_starting" msgid="8879874184033857814">"Otetaan yhteyspiste käyttöön..."</string>
<string name="wifi_tether_stopping" msgid="4416492968019409188">"Poistetaan yhteyspiste käytöstä..."</string>
<string name="wifi_tether_enabled_subtext" msgid="5085002421099821056">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> on aktiivinen"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Poista APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Uusi APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Tallenna"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Hylkää"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Peru"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Nimi-kenttä ei voi olla tyhjä."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ei voi olla tyhjä."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Sovellukset voidaan nollata"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Nollaa Wi-Fin, mobiiliverkon ja Bluetoothin asetukset"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Tämä nollaa kaikki verkkoasetukset, esimerkiksi seuraavat:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobiilidata"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Tyhjennä"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Tyhjennä ladatut SIM-kortit"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Jos haluat ladata korvaavia SIM-kortteja, ota yhteyttä operaattoriin. Tämä ei peruuta liittymäsopimustasi."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Tämä ei peruuta liittymäsopimustasi. Jos haluat ladata korvaavia SIM-kortteja, ota yhteyttä operaattoriin."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Nollaa asetukset"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Nollataanko kaikki verkkoasetukset? Toimintoa ei voi kumota."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Haluatko nollata kaikki verkkoasetukset ja tyhjentää ladatut SIM-kortit? Toimintoa ei voi kumota."</string>
@@ -1672,7 +1672,7 @@
<string name="tether_settings_summary_hotspot_and_bluetooth_and_ethernet" msgid="4104425838594994441">"Hotspot, Bluetooth, Ethernet"</string>
<string name="tether_settings_summary_usb_and_bluetooth_and_ethernet" msgid="5880591133984166550">"USB, Bluetooth, Ethernet"</string>
<string name="tether_settings_summary_all" msgid="7565193614882005775">"Hotspot, USB, Bluetooth, Ethernet"</string>
- <string name="tether_settings_summary_off" msgid="2526164899130351968">"Internetyhteyttä ei jaeta muiden laitteiden kanssa."</string>
+ <string name="tether_settings_summary_off" msgid="2526164899130351968">"Internetyhteyttä ei jaeta muille laitteille."</string>
<string name="tethering_interface_options" msgid="7575535888135143650">"Puhelimen käyttäminen modeemina"</string>
<string name="disable_wifi_hotspot_title" msgid="2167985468585290478">"Älä käytä Wi-Fi-hotspotia"</string>
<string name="disable_wifi_hotspot_when_usb_on" msgid="220439059794714583">"Jaa verkkoyhteys vain USB:n kautta"</string>
@@ -1694,8 +1694,8 @@
<string name="bluetooth_untether_blank" msgid="5087548945727762308">"Jaettu internetyhteys katkaistaan laitteesta <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
<string name="ethernet_tether_checkbox_text" msgid="959743110824197356">"Ethernetin jakaminen"</string>
<string name="ethernet_tethering_subtext" product="default" msgid="5998100693350351694">"Jaa puhelimen internetyhteys Ethernetillä"</string>
- <string name="tethering_footer_info" msgid="6782375845587483281">"Hotspot- ja yhteyden jako ‑ominaisuuksien avulla voit jakaa internetyhteyden muille laitteille mobiilidatayhteydellä. Sovellukset voivat myös luoda hotspotin ja jakaa sisältöä lähellä olevien laitteiden kanssa."</string>
- <string name="tethering_footer_info_sta_ap_concurrency" msgid="2079039077487477676">"Jaa internetyhteys muille laitteille Wi-Fin tai mobiilidatan avulla hotspotilla tai käyttämällä puhelinta modeemina. Sovellukset voivat myös luoda hotspotin ja jakaa sisältöä lähellä olevien laitteiden kanssa."</string>
+ <string name="tethering_footer_info" msgid="6782375845587483281">"Hotspot- ja yhteyden jako ‑ominaisuuksien avulla voit jakaa internetyhteyden muille laitteille mobiilidatayhteydellä. Sovellukset voivat myös luoda hotspotin ja jakaa sisältöä lähellä oleville laitteille."</string>
+ <string name="tethering_footer_info_sta_ap_concurrency" msgid="2079039077487477676">"Jaa internetyhteys muille laitteille Wi-Fin tai mobiilidatan avulla hotspotilla tai käyttämällä puhelinta modeemina. Sovellukset voivat myös luoda hotspotin ja jakaa sisältöä lähellä oleville laitteille."</string>
<string name="tethering_help_button_text" msgid="2823655011510912001">"Ohjeet"</string>
<string name="network_settings_title" msgid="4663717899931613176">"Mobiiliverkko"</string>
<string name="manage_mobile_plan_title" msgid="5616930513733409064">"Mobiilisopimus"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablettia on käytetty tavallista enemmän"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Laitetta on käytetty tavallista enemmän"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Akku voi loppua odotettua aiemmin"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Huolehditaan akun kunnosta"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Akun kunnon optimointi"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Akun käyttöä rajoitettu tilapäisesti. Lue lisää napauttamalla."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Puhelinta käytetty tavallista enemmän. Akku voi loppua odotettua aiemmin.\n\nAkkua eniten käyttäneet sovellukset:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablettia on käytetty tavallista enemmän. Akku voi loppua odotettua aiemmin.\n\nAkkua eniten käyttäneet sovellukset:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Näkyvien data-aineistojen enimmäismäärä"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Palauta oletusarvot"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Automaattisen täytön kehittäjäasetukset palautettu"</string>
+ <string name="location_category" msgid="3496759112306219062">"Sijainti"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Tilapalkin sijaintiosoitin"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Näytä kaikista sijainneista (myös verkko ja yhteydet)"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Pakota täydet GNSS-mitat"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Seuraa kaikkia GNSS-kuvioita ja ‑taajuuksia, joissa ei ole pulssisuhdetta."</string>
<string name="device_theme" msgid="5027604586494772471">"Laitteen teema"</string>
<string name="default_theme" msgid="4815428567082263639">"Oletus"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Verkon nimi"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Keskeytä ilmoitukset, jotta voit keskittyä"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Ominaisuutta ei ole saatavilla"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Tämä ominaisuus on poistettu käytöstä, koska se hidastaa puhelintasi."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Pakota täydet GNSS-mitat"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Seuraa kaikkia GNSS-kuvioita ja ‑taajuuksia, joissa ei ole pulssisuhdetta."</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Näytä aina kaatumisikkuna"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Näytä valintaikkuna aina, kun sovellus kaatuu."</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Valitse ANGLE-yhteensopiva sovellus"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi-puheluilla voit soittaa ja vastaanottaa puheluita muun kuin operaattorin verkon (esim. joidenkin Wi-Fi-verkkojen) kautta."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Puhelut"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Tekstiviestit"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ensisijainen"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ensisijainen: puhelut"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"ensisijainen: tekstiviestit"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ei saatavilla"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Ei SIM-korttia"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Valinnat"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Yhdistä julkisiin verkkoihin"</string>
<string name="keywords_internet" msgid="7674082764898690310">"verkkoyhteys, internet, langaton, data, langaton yhteys, Wi-Fi, Wi Fi, datayhteys, mobiili, puhelinoperaattori, 4g, 3g, 2g, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Ei käytettävissä, koska Nukkuma-aikamoodi on päällä"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ilmoitusten tärkeys nollattu"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Sovellukset"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Epäluotettava laite pyytää pääsyä viesteihisi. Katso lisätietoja napauttamalla."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Sallitaanko pääsy viesteihin?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Epäluotettava Bluetooth-laite, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], pyytää pääsyä viesteihisi.\n\n[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ei ole ennen ollut yhteydessä laitteeseesi."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Epäluotettava laite pyytää pääsyä yhteystietoihisi ja puhelulokiisi. Katso lisätietoja napauttamalla."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Sallitaanko pääsy yhteystietoihin ja puhelulokiin?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Epäluotettava Bluetooth-laite, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], pyytää pääsyä yhteystietoihisi ja puhelulokiisi. Tämä sisältää datan saapuvista ja lähtevistä puheluista.\n\n[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ei ole ennen ollut yhteydessä laitteeseesi."</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 7279516..f652f33 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -25,7 +25,6 @@
<string name="device_info_default" msgid="1406619232867343310">"Inconnu"</string>
<plurals name="show_dev_countdown" formatted="false" msgid="1646187747875476269">
<item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir concepteur.</item>
- <item quantity="many">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
<item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir concepteur.</item>
</plurals>
<string name="show_dev_on" msgid="2840850085134853754">"Vous êtes maintenant concepteur!"</string>
@@ -209,7 +208,6 @@
<string name="add_a_language" msgid="2126220398077503271">"Ajouter une langue"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Supprimer la langue sélectionnée?</item>
- <item quantity="many">Remove selected languages?</item>
<item quantity="other">Supprimer les langues sélectionnées?</item>
</plurals>
<string name="dlg_remove_locales_message" msgid="8110560091134252067">"Le texte s\'affichera dans une autre langue."</string>
@@ -302,7 +300,6 @@
<string name="location_settings_summary_location_off" msgid="4797932754681162262">"Désactivé"</string>
<plurals name="location_settings_summary_location_on" formatted="false" msgid="1019959038518185676">
<item quantity="one">Activé : <xliff:g id="COUNT_1">%1$d</xliff:g> application a accès à la position</item>
- <item quantity="many">On - <xliff:g id="COUNT_1">%1$d</xliff:g> apps have access to location</item>
<item quantity="other">Activé : <xliff:g id="COUNT_1">%1$d</xliff:g> applications ont accès à la position</item>
</plurals>
<string name="location_settings_loading_app_permission_stats" msgid="6054103701535557342">"Chargement en cours…"</string>
@@ -401,7 +398,6 @@
<string name="fingerprint_enable_keyguard_toggle_title" msgid="5451094461919440992">"verrouillage de l\'écran"</string>
<plurals name="security_settings_fingerprint_preference_summary" formatted="false" msgid="988602245530967106">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> empreinte digitale configurée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> fingerprints set up</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> empreintes digitales configurées</item>
</plurals>
<string name="security_settings_fingerprint_preference_summary_none" msgid="1044059475710838504"></string>
@@ -628,23 +624,19 @@
<string name="lock_failed_attempts_now_wiping_dialog_dismiss" msgid="170155081899679669">"Ignorer"</string>
<plurals name="lockpassword_password_too_short" formatted="false" msgid="2192234965414232157">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT_1">%d</xliff:g> caractère</item>
- <item quantity="many">Must be at least <xliff:g id="COUNT_1">%d</xliff:g> characters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT_1">%d</xliff:g> caractères</item>
</plurals>
<plurals name="lockpassword_pin_too_short" formatted="false" msgid="6817086810898414162">
<item quantity="one">Le NIP doit contenir au moins <xliff:g id="COUNT_1">%d</xliff:g> chiffre</item>
- <item quantity="many">PIN must be at least <xliff:g id="COUNT_1">%d</xliff:g> digits</item>
<item quantity="other">Le NIP doit contenir au moins <xliff:g id="COUNT_1">%d</xliff:g> chiffres</item>
</plurals>
<string name="lockpassword_continue_label" msgid="2507983991979547816">"Continuer"</string>
<plurals name="lockpassword_password_too_long" formatted="false" msgid="8118091957172967677">
<item quantity="one">Doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> caractère</item>
- <item quantity="many">Must be fewer than <xliff:g id="NUMBER_1">%d</xliff:g> characters</item>
<item quantity="other">Doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> caractères</item>
</plurals>
<plurals name="lockpassword_pin_too_long" formatted="false" msgid="8706992338720310765">
<item quantity="one">Doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> chiffre</item>
- <item quantity="many">Must be fewer than <xliff:g id="NUMBER_1">%d</xliff:g> digits</item>
<item quantity="other">Doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> chiffres</item>
</plurals>
<string name="lockpassword_pin_recently_used" msgid="6650277060998923465">"L\'administrateur de l\'appareil ne permet pas l\'utilisation d\'un NIP récent"</string>
@@ -654,37 +646,30 @@
<string name="lockpassword_password_requires_symbol" msgid="6178512486154701321">"Doit contenir au moins un symbole"</string>
<plurals name="lockpassword_password_requires_letters" formatted="false" msgid="2385916409676839024">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettre</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettres</item>
</plurals>
<plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2057467885488612701">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettre minuscule</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettres minuscules</item>
</plurals>
<plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="4541266279643052025">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettre majuscule</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> lettres majuscules</item>
</plurals>
<plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="70617964591376248">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> chiffre</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> chiffres</item>
</plurals>
<plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="7981236881269921943">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractère spécial</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractères spéciaux</item>
</plurals>
<plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="1567877061888948467">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractère autre qu\'une lettre</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractères autres qu\'une lettre</item>
</plurals>
<plurals name="lockpassword_password_requires_nonnumerical" formatted="false" msgid="5056743974888384475">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractère non numérique</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-numerical characters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractères non numériques</item>
</plurals>
<string name="lockpassword_password_recently_used" msgid="5341218079730167191">"L\'administrateur de l\'appareil ne permet pas l\'utilisation d\'un mot de passe récent"</string>
@@ -700,7 +685,6 @@
<string name="number_of_device_admins_none" msgid="152926922020437312">"Aucune application active"</string>
<plurals name="number_of_device_admins" formatted="false" msgid="2528735319390151989">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application active</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications actives</item>
</plurals>
<string name="manage_trust_agents" msgid="6410149930029992356">"Agents de confiance"</string>
@@ -708,7 +692,6 @@
<string name="manage_trust_agents_summary" msgid="6423843123607674286">"Aucun"</string>
<plurals name="manage_trust_agents_summary_on" formatted="false" msgid="5438047398376802735">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> agent de confiance actif</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> active trust agents</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> agent(s) de confiance actif(s)</item>
</plurals>
<string name="bluetooth_quick_toggle_title" msgid="5955341060378240781">"Bluetooth"</string>
@@ -1017,17 +1000,14 @@
<string name="wifi_forget_dialog_message" msgid="8419499588321940243">"Tous les mots de passe de ce réseau seront supprimés"</string>
<plurals name="wifi_saved_access_points_summary" formatted="false" msgid="2802436466732147888">
<item quantity="one">%d réseau</item>
- <item quantity="many">%d networks</item>
<item quantity="other">%d réseaux</item>
</plurals>
<plurals name="wifi_saved_passpoint_access_points_summary" formatted="false" msgid="5802057518058840450">
<item quantity="one">%d abonnement</item>
- <item quantity="many">%d subscriptions</item>
<item quantity="other">%d abonnements</item>
</plurals>
<plurals name="wifi_saved_all_access_points_summary" formatted="false" msgid="5125849180309374451">
<item quantity="one">%d réseau et abonnement</item>
- <item quantity="many">%d networks & subscriptions</item>
<item quantity="other">%d réseaux et abonnements</item>
</plurals>
<string name="wifi_advanced_titlebar" msgid="1234150304285575798">"Paramètres Wi-Fi avancés"</string>
@@ -1042,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adresses IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Réseaux enregistrés"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonnements"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Autres réseaux"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Paramètres IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Les paramètres Wi-Fi avancés ne sont pas accessibles pour cet utilisateur"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Enregistrer"</string>
@@ -1360,7 +1339,6 @@
<string name="wrong_pin_code_pukked" msgid="3414172752791445033">"NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string>
<plurals name="wrong_pin_code" formatted="false" msgid="4054088588731305475">
<item quantity="one">Le NIP de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
- <item quantity="many">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="other">Le NIP de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
</plurals>
<string name="wrong_pin_code_one" msgid="6924852214263071441">"NIP de module SIM incorrect. Il vous reste une tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string>
@@ -1618,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Supprimer l\'APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nouveau nom point d\'accès"</string>
<string name="menu_save" msgid="6611465355127483100">"Enregistrer"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Supprimer"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Annuler"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Le champ « Nom » est obligatoire."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"L\'APN est obligatoire."</string>
@@ -1633,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Les applications peuvent être réinitialisées"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Réinitialiser les paramètres Wi-Fi, cellulaires et Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Cette opération entraîne la réinitialisation de tous les paramètres réseau, y compris :\n\n"<li>"Le Wi‑Fi"</li>\n<li>"Les données cellulaires"</li>\n<li>"Le Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Effacer"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Effacer cartes SIM téléchargées"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Pour télécharger une carte SIM de remplacement, communiquez avec votre fournisseur de services. Cela n\'annulera aucun forfait de services cellulaires."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Cela n\'annulera aucun forfait de services cellulaires. Pour télécharger une carte SIM de remplacement, communiquez avec votre fournisseur de services."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Réinitialiser les paramètres"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Réinitialiser tous les paramètres réseau? Cette action est irréversible."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Réinitialiser tous les paramètres réseau et effacer les cartes SIM téléchargées? Vous ne pouvez pas annuler cette action."</string>
@@ -1742,7 +1721,6 @@
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Le signalement de position est désactivé"</string>
<plurals name="location_app_permission_summary_location_on" formatted="false" msgid="8286873148858526214">
<item quantity="one"> <xliff:g id="PERMITTED_LOCATION_APP_COUNT_2">%1$d</xliff:g> application sur <xliff:g id="TOTAL_LOCATION_APP_COUNT_3">%2$d</xliff:g> a accès à la position</item>
- <item quantity="many"> <xliff:g id="PERMITTED_LOCATION_APP_COUNT_2">%1$d</xliff:g> of <xliff:g id="TOTAL_LOCATION_APP_COUNT_3">%2$d</xliff:g> apps have access to location</item>
<item quantity="other"> <xliff:g id="PERMITTED_LOCATION_APP_COUNT_2">%1$d</xliff:g> applications sur <xliff:g id="TOTAL_LOCATION_APP_COUNT_3">%2$d</xliff:g> ont accès à la position</item>
</plurals>
<string name="location_category_recent_location_access" msgid="7880996987927703141">"Accès récents à la position"</string>
@@ -1903,7 +1881,6 @@
<string name="recent_app_category_title" msgid="189758417804427533">"Applications récemment ouvertes"</string>
<plurals name="see_all_apps_title" formatted="false" msgid="6864581406735745400">
<item quantity="one">Afficher %1$d application</item>
- <item quantity="many">See all %1$d apps</item>
<item quantity="other">Afficher %1$d applications</item>
</plurals>
<string name="forgot_password_title" msgid="3967873480875239885">"Contacter l\'administrateur informatique"</string>
@@ -1924,7 +1901,6 @@
<string name="cache_size_label" msgid="313456088966822757">"Cache"</string>
<plurals name="uri_permissions_text" formatted="false" msgid="8212425823423508096">
<item quantity="one">%d élément</item>
- <item quantity="many">%d items</item>
<item quantity="other">%d éléments</item>
</plurals>
<string name="clear_uri_btn_text" msgid="4828117421162495134">"Supprimer l\'accès"</string>
@@ -2288,7 +2264,6 @@
<string name="accessibility_hearingaid_active_device_summary" msgid="509703438222873967">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> est actif"</string>
<plurals name="show_number_hearingaid_count" formatted="false" msgid="776000580683647556">
<item quantity="one"><xliff:g id="NUMBER_DEVICE_COUNT_1">%1$d</xliff:g> prothèse auditive enregistrée</item>
- <item quantity="many"><xliff:g id="NUMBER_DEVICE_COUNT_1">%1$d</xliff:g> saved hearing aids</item>
<item quantity="other"><xliff:g id="NUMBER_DEVICE_COUNT_1">%1$d</xliff:g> prothèses auditives enregistrées</item>
</plurals>
<string name="accessibility_summary_shortcut_enabled" msgid="4030427268146752644">"Raccourci activé"</string>
@@ -2308,22 +2283,18 @@
<string name="daltonizer_mode_tritanomaly_summary" msgid="2837137091067433059">"Bleu-jaune"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_short_delay" formatted="false" msgid="5354221071353645263">
<item quantity="one">Court (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
- <item quantity="many">Short (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconds)</item>
<item quantity="other">Court (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> secondes)</item>
</plurals>
<plurals name="accessibilty_autoclick_preference_subtitle_medium_delay" formatted="false" msgid="1550891909800510628">
<item quantity="one">Moyen (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
- <item quantity="many">Medium (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconds)</item>
<item quantity="other">Moyen (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> secondes)</item>
</plurals>
<plurals name="accessibilty_autoclick_preference_subtitle_long_delay" formatted="false" msgid="2230755548820485984">
<item quantity="one">Long (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
- <item quantity="many">Long (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconds)</item>
<item quantity="other">Long (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> secondes)</item>
</plurals>
<plurals name="accessibilty_autoclick_delay_unit_second" formatted="false" msgid="4537791441118261556">
<item quantity="one"><xliff:g id="CLICK_DELAY_LABEL_2">%1$s</xliff:g> seconde</item>
- <item quantity="many"><xliff:g id="CLICK_DELAY_LABEL_2">%1$s</xliff:g> seconds</item>
<item quantity="other"><xliff:g id="CLICK_DELAY_LABEL_2">%1$s</xliff:g> secondes</item>
</plurals>
<string name="accessibility_vibration_summary" msgid="27904038683405084">"Sonnerie : <xliff:g id="SUMMARY_RING">%1$s</xliff:g>. Notifications : <xliff:g id="SUMMARY_NOTIFICATION">%2$s</xliff:g>. Toucher : <xliff:g id="SUMMARY_TOUCH">%3$s</xliff:g>."</string>
@@ -2396,12 +2367,10 @@
<string name="print_settings_summary_no_service" msgid="6721731154917653862">"Désactivé"</string>
<plurals name="print_settings_summary" formatted="false" msgid="1034273609054146099">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> service d\'impression actif</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> print services on</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> services d\'impression actifs</item>
</plurals>
<plurals name="print_jobs_summary" formatted="false" msgid="3933688846338306536">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> tâche d\'impression</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> print jobs</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> tâches d\'impression</item>
</plurals>
<string name="print_settings_title" msgid="7680498284751129935">"Services d\'impression"</string>
@@ -2487,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"La tablette a été sollicitée plus que d\'habitude"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"L\'appareil a été sollicité plus que d\'habitude"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"La pile pourrait s\'épuiser plus tôt que d\'habitude"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Préservation de la pile"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimisation en fonction de la santé de la pile"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Pile limitée temporairement. Touchez ici pour en savoir plus."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Votre téléphone a été sollicité plus que d\'habitude. Sa pile pourrait s\'épuiser plus rapidement que prévu.\n\nVoici les applications qui ont utilisé le plus d\'énergie :"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Votre tablette a été sollicitée plus que d\'habitude. Sa pile pourrait s\'épuiser plus rapidement que prévu.\n\nVoici les applications qui ont utilisé le plus d\'énergie :"</string>
@@ -2495,27 +2464,22 @@
<string name="battery_tip_dialog_message_footer" msgid="986542164372177504">"Inclut les activités énergivores en arrière-plan"</string>
<plurals name="battery_tip_restrict_title" formatted="false" msgid="3108195491484891588">
<item quantity="one">Restreindre %1$d application</item>
- <item quantity="many">Restrict %1$d apps</item>
<item quantity="other">Restreindre %1$d applications</item>
</plurals>
<plurals name="battery_tip_restrict_handled_title" formatted="false" msgid="5862649927574803958">
<item quantity="one">%2$d application récemment restreinte</item>
- <item quantity="many">%2$d apps recently restricted</item>
<item quantity="other">%2$d applications récemment restreintes</item>
</plurals>
<plurals name="battery_tip_restrict_summary" formatted="false" msgid="3328499737453686910">
<item quantity="one">%2$d application sollicite beaucoup la pile en arrière-plan</item>
- <item quantity="many">%2$d apps have high background battery usage</item>
<item quantity="other">%2$d applications sollicitent beaucoup la pile en arrière-plan</item>
</plurals>
<plurals name="battery_tip_restrict_handled_summary" formatted="false" msgid="3036853535034350991">
<item quantity="one">Cette application ne peut pas fonctionner en arrière-plan</item>
- <item quantity="many">These apps can\'t run in the background</item>
<item quantity="other">Ces applications ne peuvent pas fonctionner en arrière-plan</item>
</plurals>
<plurals name="battery_tip_restrict_app_dialog_title" formatted="false" msgid="7897944678619251740">
<item quantity="one">Restreindre %1$d application?</item>
- <item quantity="many">Restrict %1$d apps?</item>
<item quantity="other">Restreindre %1$d applications?</item>
</plurals>
<string name="battery_tip_restrict_app_dialog_message" msgid="137856003724730751">"Pour économiser la pile, empêchez <xliff:g id="APP">%1$s</xliff:g> de l\'utiliser en arrière-plan. Il se peut que cette application ne fonctionne pas correctement et que les notifications soient retardées."</string>
@@ -2536,7 +2500,6 @@
<string name="restricted_app_title" msgid="6585080822121007436">"Applications restreintes"</string>
<plurals name="restricted_app_summary" formatted="false" msgid="6059772951505411003">
<item quantity="one">Limitation de l\'utilisation de la pile pour %1$d application</item>
- <item quantity="many">Limiting battery usage for %1$d apps</item>
<item quantity="other">Limitation de l\'utilisation de la pile pour %1$d applications</item>
</plurals>
<string name="restricted_app_time_summary" msgid="3097721884155913252">"Application restreinte : <xliff:g id="TIME">%1$s</xliff:g>"</string>
@@ -2547,7 +2510,6 @@
<string name="battery_manager_off" msgid="673547668722420924">"Désactivé"</string>
<plurals name="battery_manager_app_restricted" formatted="false" msgid="6714534362166394848">
<item quantity="one">%1$d application restreinte</item>
- <item quantity="many">%1$d apps restricted</item>
<item quantity="other">%1$d applications restreintes</item>
</plurals>
<string name="battery_header_title_alternate" msgid="8371821625994616659">"<xliff:g id="NUMBER">^1</xliff:g>"<small>" "<font size="20">"<xliff:g id="UNIT">%</xliff:g>"</font></small>""</string>
@@ -2816,7 +2778,6 @@
<string name="notification_history_dismiss" msgid="6180321217375722918">"Récemment ignorées"</string>
<plurals name="notification_history_count" formatted="false" msgid="1859304685071321991">
<item quantity="one"><xliff:g id="NUMBER_1">%d</xliff:g> notification</item>
- <item quantity="many"><xliff:g id="NUMBER_1">%d</xliff:g> notifications</item>
<item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> notifications</item>
</plurals>
<string name="sound_category_call_ringtone_vibrate_title" msgid="9090693401915654528">"Sonnerie et vibreur pour les appels"</string>
@@ -3066,23 +3027,19 @@
<string name="done_button" msgid="6269449526248267">"Terminé"</string>
<plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="5491460811755938449">
<item quantity="one">Faire confiance au certificat ou le supprimer</item>
- <item quantity="many">Trust or remove certificates</item>
<item quantity="other">Faire confiance aux certificats ou les supprimer</item>
</plurals>
<plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="2788832560436163252">
<item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé une autorité de certification sur votre appareil, ce qui peut leur permettre de surveiller son activité réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
<item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des autorités de certification sur votre appareil, ce qui peut leur permettre de surveiller son activité réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.</item>
</plurals>
<plurals name="ssl_ca_cert_info_message" formatted="false" msgid="3989916958347169622">
<item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé une autorité de certification pour votre profil professionnel, ce qui peut leur permettre de surveiller l\'activité du réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
<item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des autorités de certification pour votre profil professionnel, ce qui peut leur permettre de surveiller l\'activité du réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.</item>
</plurals>
<string name="ssl_ca_cert_warning_message" msgid="4374052724815563051">"Un tiers peut surveiller votre activité réseau, y compris les courriels, les applications et les sites Web sécurisés. \n\nUn certificat de confiance installé sur votre appareil rend cela possible."</string>
<plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="125941406175485894">
<item quantity="one">Vérifier le certificat</item>
- <item quantity="many">Check certificates</item>
<item quantity="other">Vérifier les certificats</item>
</plurals>
<string name="user_settings_title" msgid="6550866465409807877">"Plusieurs utilisateurs"</string>
@@ -3260,7 +3217,6 @@
<string name="dashboard_title" msgid="5660733037244683387">"Paramètres"</string>
<plurals name="settings_suggestion_header_summary_hidden_items" formatted="false" msgid="6585075562837786847">
<item quantity="one">Afficher %d élément masqué</item>
- <item quantity="many">Show %d hidden items</item>
<item quantity="other">Afficher %d éléments masqués</item>
</plurals>
<string name="network_dashboard_title" msgid="788543070557731240">"Réseau et Internet"</string>
@@ -3412,7 +3368,7 @@
<string name="boot_sounds_title" msgid="5033062848948884111">"Activation par les sons"</string>
<string name="live_caption_title" msgid="8617086825712756983">"Transcription instantanée"</string>
<string name="live_caption_summary" msgid="2898451867595161809">"Ajouter automatiquement des sous-titres aux contenus multimédias"</string>
- <string name="zen_mode_settings_schedules_summary" msgid="2047688589286811617">"{count,plural, =0{Aucun}=1{1 horaire programmé}one{# horaire programmé}many{# schedules set}other{# horaires programmés}}"</string>
+ <string name="zen_mode_settings_schedules_summary" msgid="2047688589286811617">"{count,plural, =0{Aucun}=1{1 horaire programmé}one{# horaire programmé}other{# horaires programmés}}"</string>
<string name="zen_mode_settings_title" msgid="682676757791334259">"Ne pas déranger"</string>
<string name="zen_mode_settings_summary" msgid="6040862775514495191">"Recevez uniquement les notifications des personnes et des applications importantes"</string>
<string name="zen_mode_slice_subtitle" msgid="6849372107272604160">"Limiter les interruptions"</string>
@@ -3483,9 +3439,9 @@
<string name="zen_mode_sound_summary_on" msgid="9077659040104989899">"Activé"</string>
<string name="zen_mode_duration_summary_always_prompt" msgid="7658172853423383037">"Toujours demander"</string>
<string name="zen_mode_duration_summary_forever" msgid="5551992961329998606">"Jusqu\'à la désactivation"</string>
- <string name="zen_mode_duration_summary_time_hours" msgid="2602655749780428308">"{count,plural, =1{1 heure}one{# heure}many{# hours}other{# heures}}"</string>
- <string name="zen_mode_duration_summary_time_minutes" msgid="5755536844016835693">"{count,plural, =1{1 minute}one{# minute}many{# minutes}other{# minutes}}"</string>
- <string name="zen_mode_sound_summary_off" msgid="7350437977839985836">"{count,plural, =0{Désactivé}=1{Désactivé : 1 horaire peut s\'activer automatiquement}one{Désactivé : # horaire peut s\'activer automatiquement}many{Off / # schedules can turn on automatically}other{Désactivé : # horaires peuvent s\'activer automatiquement}}"</string>
+ <string name="zen_mode_duration_summary_time_hours" msgid="2602655749780428308">"{count,plural, =1{1 heure}one{# heure}other{# heures}}"</string>
+ <string name="zen_mode_duration_summary_time_minutes" msgid="5755536844016835693">"{count,plural, =1{1 minute}one{# minute}other{# minutes}}"</string>
+ <string name="zen_mode_sound_summary_off" msgid="7350437977839985836">"{count,plural, =0{Désactivé}=1{Désactivé : 1 horaire peut s\'activer automatiquement}one{Désactivé : # horaire peut s\'activer automatiquement}other{Désactivé : # horaires peuvent s\'activer automatiquement}}"</string>
<string name="zen_category_behavior" msgid="3214056473947178507">"Ce qui peut interrompre le mode Ne pas déranger"</string>
<string name="zen_category_people" msgid="8252926021894933047">"Personnes"</string>
<string name="zen_category_apps" msgid="1167374545618451925">"Applications"</string>
@@ -3627,7 +3583,6 @@
<string name="priority_conversation_count_zero" msgid="3862289535537564713">"Aucune conversation prioritaire"</string>
<plurals name="priority_conversation_count" formatted="false" msgid="4229447176780862649">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> conversation prioritaire</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> priority conversations</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> conversations prioritaires</item>
</plurals>
<string name="important_conversations" msgid="1233893707189659401">"Conversations prioritaires"</string>
@@ -3669,12 +3624,10 @@
<string name="default_notification_assistant" msgid="243718059890346442">"Notifications adaptatives"</string>
<plurals name="notifications_sent_daily" formatted="false" msgid="1479283620504341566">
<item quantity="one">~<xliff:g id="NUMBER_1">%d</xliff:g> notification par jour</item>
- <item quantity="many">~<xliff:g id="NUMBER_1">%d</xliff:g> notifications per day</item>
<item quantity="other">~<xliff:g id="NUMBER_1">%d</xliff:g> notifications par jour</item>
</plurals>
<plurals name="notifications_sent_weekly" formatted="false" msgid="4913443431857170519">
<item quantity="one">~<xliff:g id="NUMBER_1">%d</xliff:g> notification par semaine</item>
- <item quantity="many">~<xliff:g id="NUMBER_1">%d</xliff:g> notifications per week</item>
<item quantity="other">~<xliff:g id="NUMBER_1">%d</xliff:g> notifications par semaine</item>
</plurals>
<string name="notifications_sent_never" msgid="9081278709126812062">"Jamais"</string>
@@ -3683,7 +3636,6 @@
<string name="manage_notification_access_summary_zero" msgid="7528633634628627431">"Les applications ne peuvent pas lire les notifications."</string>
<plurals name="manage_notification_access_summary_nonzero" formatted="false" msgid="3703008881487586312">
<item quantity="one">%d application peut lire les notifications</item>
- <item quantity="many">%d apps can read notifications</item>
<item quantity="other">%d application peuvent lire les notifications</item>
</plurals>
<string name="notification_assistant_title" msgid="6983941403582134437">"Notifications adaptatives"</string>
@@ -3730,7 +3682,6 @@
<string name="interact_across_profiles_number_of_connected_apps_none" msgid="8573289199942092964">"Aucune application associée"</string>
<plurals name="interact_across_profiles_number_of_connected_apps" formatted="false" msgid="6991750455661974772">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application connectée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> apps connected</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications connectées</item>
</plurals>
<string name="interact_across_profiles_install_work_app_title" msgid="2821669067014436056">"Pour connecter ces applications, installez <xliff:g id="NAME">%1$s</xliff:g> dans votre profil professionnel"</string>
@@ -3747,7 +3698,6 @@
<string name="notification_channels_other" msgid="18159805343647908">"Autre"</string>
<plurals name="notification_group_summary" formatted="false" msgid="483490958130993160">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> catégorie</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> categories</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> catégories</item>
</plurals>
<string name="no_channels" msgid="4716199078612071915">"Cette application n\'a publié aucune notification"</string>
@@ -3756,12 +3706,10 @@
<string name="app_notification_listing_summary_zero" msgid="2988400013221120744">"Activé pour toutes les applications"</string>
<plurals name="app_notification_listing_summary_others" formatted="false" msgid="1506127395400503717">
<item quantity="one">Désactivé pour <xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="many">Off for <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
<item quantity="other">Désactivé pour <xliff:g id="COUNT_1">%d</xliff:g> applications</item>
</plurals>
<plurals name="deleted_channels" formatted="false" msgid="5963473421547029532">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> catégorie supprimée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> categories deleted</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> catégories supprimées</item>
</plurals>
<string name="notification_toggle_on" msgid="1624283327379059003">"Activées"</string>
@@ -3834,7 +3782,7 @@
<string name="zen_mode_from_all_conversations" msgid="3447000451361857061">"Toutes les conversations"</string>
<string name="zen_mode_from_important_conversations" msgid="528050873364229253">"Conversations prioritaires"</string>
<string name="zen_mode_from_no_conversations" msgid="3924593219855567165">"Aucune"</string>
- <string name="zen_mode_conversations_count" msgid="3199310723073707153">"{count,plural, =0{Aucune}=1{1 conversation}one{# conversation}many{# conversations}other{# conversations}}"</string>
+ <string name="zen_mode_conversations_count" msgid="3199310723073707153">"{count,plural, =0{Aucune}=1{1 conversation}one{# conversation}other{# conversations}}"</string>
<string name="zen_mode_people_calls_messages_section_title" msgid="6815202112413762206">"Qui peut provoquer des interruptions"</string>
<string name="zen_mode_calls_title" msgid="2078578043677037740">"Appels"</string>
<string name="zen_mode_calls" msgid="7653245854493631095">"Appels"</string>
@@ -3843,7 +3791,7 @@
<string name="zen_mode_calls_footer" msgid="2008079711083701243">"Pour vous assurer que les appels autorisés émettent un son, vérifiez si votre appareil est réglé pour sonner"</string>
<string name="zen_mode_custom_calls_footer" msgid="6521283204577441053">"Pendant « <xliff:g id="SCHEDULE_NAME">%1$s</xliff:g> », les appels entrants sont bloqués. Vous pouvez régler les paramètres pour permettre à vos amis, à votre famille ou à d\'autres contacts de vous joindre."</string>
<string name="zen_mode_starred_contacts_title" msgid="630299631659575589">"Contacts marqués d\'une étoile"</string>
- <string name="zen_mode_starred_contacts_summary_contacts" msgid="1629467178444895094">"{count,plural,offset:2 =0{Aucun}=1{{contact_1}}=2{{contact_1} et {contact_2}}=3{{contact_1}, {contact_2} et {contact_3}}one{{contact_1}, {contact_2} et # autre}many{{contact_1}, {contact_2}, and # others}other{{contact_1}, {contact_2} et # autres}}"</string>
+ <string name="zen_mode_starred_contacts_summary_contacts" msgid="1629467178444895094">"{count,plural,offset:2 =0{Aucun}=1{{contact_1}}=2{{contact_1} et {contact_2}}=3{{contact_1}, {contact_2} et {contact_3}}one{{contact_1}, {contact_2} et # autre}other{{contact_1}, {contact_2} et # autres}}"</string>
<string name="zen_mode_starred_contacts_empty_name" msgid="2906404745550293688">"(Sans nom)"</string>
<string name="zen_mode_messages" msgid="7315084748885170585">"Messages"</string>
<string name="zen_mode_messages_list" msgid="5431014101342361882">"messages"</string>
@@ -3853,7 +3801,7 @@
<string name="zen_mode_custom_messages_footer" msgid="7545180036949550830">"Pendant « <xliff:g id="SCHEDULE_NAME">%1$s</xliff:g> », les messages entrants sont bloqués. Vous pouvez régler les paramètres pour permettre à vos amis, à votre famille ou à d\'autres contacts de vous joindre."</string>
<string name="zen_mode_all_messages_summary" msgid="3756267858343104554">"Tous les messages peuvent vous parvenir"</string>
<string name="zen_mode_all_calls_summary" msgid="7337907849083824698">"Tous les appels peuvent vous parvenir"</string>
- <string name="zen_mode_contacts_count" msgid="6568631261119795799">"{count,plural, =0{Aucun}=1{1 contact}one{# contact}many{# contacts}other{# contacts}}"</string>
+ <string name="zen_mode_contacts_count" msgid="6568631261119795799">"{count,plural, =0{Aucun}=1{1 contact}one{# contact}other{# contacts}}"</string>
<string name="zen_mode_from_anyone" msgid="6027004263046694174">"Tout le monde"</string>
<string name="zen_mode_from_contacts" msgid="2989933306317064818">"Contacts"</string>
<string name="zen_mode_from_starred" msgid="8616516644241652287">"Contacts marqués d\'une étoile"</string>
@@ -3891,13 +3839,13 @@
<string name="zen_mode_bypassing_apps_summary_all" msgid="4684544706511555744">"Toutes les notifications"</string>
<string name="zen_mode_bypassing_apps_summary_some" msgid="5315750826830358230">"Quelques notifications"</string>
<string name="zen_mode_bypassing_apps_footer" msgid="1454862989340760124">"Les personnes sélectionnées peuvent toujours vous joindre, même si vous n\'autorisez pas les applications à provoquer des interruptions"</string>
- <string name="zen_mode_bypassing_apps_subtext" msgid="5258652366929842710">"{count,plural,offset:2 =0{Aucune application ne peut provoquer d\'interruption}=1{{app_1} peut provoquer des interruptions}=2{{app_1} et {app_2} peuvent provoquer des interruptions}=3{{app_1}, {app_2} et {app_3} peuvent provoquer des interruptions}one{{app_1}, {app_2} et # autre application peuvent provoquer des interruptions}many{{app_1}, {app_2}, and # more can interrupt}other{{app_1}, {app_2} et # autres applications peuvent provoquer des interruptions}}"</string>
+ <string name="zen_mode_bypassing_apps_subtext" msgid="5258652366929842710">"{count,plural,offset:2 =0{Aucune application ne peut provoquer d\'interruption}=1{{app_1} peut provoquer des interruptions}=2{{app_1} et {app_2} peuvent provoquer des interruptions}=3{{app_1}, {app_2} et {app_3} peuvent provoquer des interruptions}one{{app_1}, {app_2} et # autre application peuvent provoquer des interruptions}other{{app_1}, {app_2} et # autres applications peuvent provoquer des interruptions}}"</string>
<string name="zen_mode_bypassing_apps_title" msgid="371050263563164059">"Applications"</string>
<string name="zen_mode_bypassing_apps_all_summary" msgid="5197566190120503132">"Toutes les notifications"</string>
<string name="zen_mode_bypassing_apps_some_summary" msgid="1514572070650411509">"Quelques notifications"</string>
<string name="zen_mode_bypassing_app_channels_header" msgid="4011017798712587373">"Notifications qui peuvent provoquer des interruptions"</string>
<string name="zen_mode_bypassing_app_channels_toggle_all" msgid="1449462656358219116">"Autoriser toutes les notifications"</string>
- <string name="zen_mode_other_sounds_summary" msgid="8784400697494837032">"{count,plural,offset:2 =0{Rien ne peut provoquer d\'interruption}=1{{sound_category_1} peut provoquer des interruptions}=2{{sound_category_1} et {sound_category_2} peuvent provoquer des interruptions}=3{{sound_category_1}, {sound_category_2} et {sound_category_3} peuvent provoquer des interruptions}one{{sound_category_1}, {sound_category_2} et # autre application peuvent provoquer des interruptions}many{{sound_category_1}, {sound_category_2}, and # more can interrupt}other{{sound_category_1}, {sound_category_2} et # autres applications peuvent provoquer des interruptions}}"</string>
+ <string name="zen_mode_other_sounds_summary" msgid="8784400697494837032">"{count,plural,offset:2 =0{Rien ne peut provoquer d\'interruption}=1{{sound_category_1} peut provoquer des interruptions}=2{{sound_category_1} et {sound_category_2} peuvent provoquer des interruptions}=3{{sound_category_1}, {sound_category_2} et {sound_category_3} peuvent provoquer des interruptions}one{{sound_category_1}, {sound_category_2} et # autre application peuvent provoquer des interruptions}other{{sound_category_1}, {sound_category_2} et # autres applications peuvent provoquer des interruptions}}"</string>
<string name="zen_mode_sounds_none" msgid="6557474361948269420">"Rien ne peut provoquer d\'interruption"</string>
<string name="zen_mode_people_none" msgid="4613147461974255046">"Personne ne peut provoquer d\'interruption"</string>
<string name="zen_mode_people_some" msgid="9101872681298810281">"Certaines personnes peuvent provoquer des interruptions"</string>
@@ -3923,12 +3871,10 @@
<string name="zen_mode_summary_alarms_only_indefinite" msgid="910047326128154945">"Ne recevoir que les alarmes sans limite de temps"</string>
<plurals name="zen_mode_summary_alarms_only_by_minute" formatted="false" msgid="1900512966361163390">
<item quantity="one">Alarmes seulement pendant <xliff:g id="DURATION">%1$d</xliff:g> minute, jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
- <item quantity="many">Change to alarms only for <xliff:g id="DURATION">%1$d</xliff:g> minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Alarmes seulement pendant <xliff:g id="DURATION">%1$d</xliff:g> minutes, jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
</plurals>
<plurals name="zen_mode_summary_alarms_only_by_hour" formatted="false" msgid="955991428001659124">
<item quantity="one">Alarmes seulement pendant <xliff:g id="DURATION">%1$d</xliff:g> heure, jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
- <item quantity="many">Change to alarms only for <xliff:g id="DURATION">%1$d</xliff:g> hours until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
<item quantity="other">Alarmes seulement pendant <xliff:g id="DURATION">%1$d</xliff:g> heures, jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
</plurals>
<string name="zen_mode_summary_alarms_only_by_time" msgid="8140619669703968810">"Ne recevoir que les alarmes jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -4014,22 +3960,18 @@
<string name="notification_summary_channel" msgid="8459033623057872803">"<xliff:g id="CHANNEL_NAME">%1$s</xliff:g> • <xliff:g id="GROUP_NAME">%2$s</xliff:g>"</string>
<plurals name="notifications_categories_off" formatted="false" msgid="1385401442703692986">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> catégorie désactivée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> categories turned off</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> catégories désactivées</item>
</plurals>
<plurals name="permissions_summary" formatted="false" msgid="5015472550875144481">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisations accordées</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> permissions granted</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations accordées</item>
</plurals>
<plurals name="runtime_permissions_summary" formatted="false" msgid="2091022049141391855">
<item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> autorisation accordée sur <xliff:g id="COUNT_3">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="COUNT_2">%d</xliff:g> of <xliff:g id="COUNT_3">%d</xliff:g> permissions granted</item>
<item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> autorisations accordées sur <xliff:g id="COUNT_3">%d</xliff:g></item>
</plurals>
<plurals name="runtime_permissions_additional_count" formatted="false" msgid="5888624648943937645">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation supplémentaire</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations supplémentaires</item>
</plurals>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="7456745929035665029">"Aucune autorisation accordée"</string>
@@ -4059,7 +4001,6 @@
<string name="domain_urls_apps_summary_off" msgid="2534980824850890416">"Aucune application ouvrant des liens compatibles"</string>
<plurals name="domain_urls_apps_summary_on" formatted="false" msgid="7864816862441985323">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> application ouvrant des liens compatibles</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> apps opening supported links</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> applications ouvrant des liens compatibles</item>
</plurals>
<string name="app_link_open_always" msgid="9167065494930657503">"Autoriser l\'application à gérer les liens pris en charge"</string>
@@ -4067,7 +4008,6 @@
<string name="app_link_open_never" msgid="5299808605386052350">"Ne pas autoriser l\'application à ouvrir les liens"</string>
<plurals name="app_link_open_always_summary" formatted="false" msgid="1816161439007251694">
<item quantity="one">L\'application revendique <xliff:g id="COUNT_1">%d</xliff:g> lien</item>
- <item quantity="many">App claims to handle <xliff:g id="COUNT_1">%d</xliff:g> links</item>
<item quantity="other">L\'application revendique <xliff:g id="COUNT_1">%d</xliff:g> liens</item>
</plurals>
<string name="open_supported_links_footer" msgid="3188808142432787933">"L\'application réclame les liens suivants :"</string>
@@ -4110,12 +4050,10 @@
<string name="hide_extra_apps" msgid="7313907836289865123">"Afficher utilisation des applis"</string>
<plurals name="power_high_usage_summary" formatted="false" msgid="573433136005336970">
<item quantity="one"><xliff:g id="NUMBER">%2$d</xliff:g> application se comporte de manière anormale</item>
- <item quantity="many"><xliff:g id="NUMBER">%2$d</xliff:g> apps behaving abnormally</item>
<item quantity="other"><xliff:g id="NUMBER">%2$d</xliff:g> applications se comportent de manière anormale</item>
</plurals>
<plurals name="power_high_usage_title" formatted="false" msgid="8013115866788425817">
<item quantity="one">Application qui draine la pile</item>
- <item quantity="many">Apps draining battery</item>
<item quantity="other">Applications qui drainent la pile</item>
</plurals>
<string name="high_power_filter_on" msgid="447849271630431531">"Non optimisée"</string>
@@ -4193,7 +4131,6 @@
<string name="memory_usage_apps" msgid="5776108502569850579">"Mémoire utilisée par les applications"</string>
<plurals name="memory_usage_apps_summary" formatted="false" msgid="1355637088533572208">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> application a utilisé de la mémoire au cours de la période suivante : <xliff:g id="DURATION_1">%2$s</xliff:g></item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> apps used memory in the last <xliff:g id="DURATION_1">%2$s</xliff:g></item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> applications ont utilisé de la mémoire au cours de la période suivante : <xliff:g id="DURATION_1">%2$s</xliff:g></item>
</plurals>
<string name="running_frequency" msgid="7260225121706316639">"Fréquence"</string>
@@ -4268,7 +4205,6 @@
<string name="data_usage_wifi_format" msgid="7644390582649568117">"<xliff:g id="AMOUNT">^1</xliff:g> utilisés sur Wi‑Fi"</string>
<plurals name="notification_summary" formatted="false" msgid="7638388920823212470">
<item quantity="one">Désactivé pour <xliff:g id="COUNT">%d</xliff:g> application</item>
- <item quantity="many">Off for <xliff:g id="COUNT">%d</xliff:g> apps</item>
<item quantity="other">Désactivé pour <xliff:g id="COUNT">%d</xliff:g> applications</item>
</plurals>
<string name="notification_summary_none" msgid="9179312319023988089">"Activées pour toutes les applications"</string>
@@ -4335,12 +4271,10 @@
<string name="suggestions_more_title" msgid="240124526378997009">"+<xliff:g id="ID_1">%1$d</xliff:g> autre(s)"</string>
<plurals name="suggestions_collapsed_title" formatted="false" msgid="5023679825210836444">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> suggestion</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
</plurals>
<plurals name="suggestions_collapsed_summary" formatted="false" msgid="3789011332018516832">
<item quantity="one">+<xliff:g id="COUNT">%1$d</xliff:g> suggestion</item>
- <item quantity="many">+<xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
<item quantity="other">+<xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
</plurals>
<string name="suggestion_remove" msgid="6753986344585367776">"Supprimer"</string>
@@ -4370,7 +4304,6 @@
<string name="network_restrictions" msgid="8385824604048229846">"Restrictions réseau"</string>
<plurals name="network_restrictions_summary" formatted="false" msgid="3875128958788008975">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> restriction</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> restrictions</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> restrictions</item>
</plurals>
<string name="operator_warning" msgid="5672761970087591211">"Le suivi de consommation de données du fournisseur de services peut différer de celui de l\'appareil"</string>
@@ -4386,7 +4319,6 @@
<string name="data_usage_other_apps" msgid="5649047093607329537">"Autres applications incluses dans l\'utilisation"</string>
<plurals name="data_saver_unrestricted_summary" formatted="false" msgid="3316296488378947221">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> application est autorisée à ignorer les restrictions lorsque la fonction Économiseur de données est activée</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> apps allowed to use unrestricted data when Data Saver is on</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> applications sont autorisées à ignorer les restrictions lorsque la fonction Économiseur de données est activée</item>
</plurals>
<string name="data_usage_title" msgid="4039024073687469094">"Données primaires"</string>
@@ -4399,7 +4331,6 @@
<string name="data_usage_chart_no_data_content_description" msgid="5481968839079467231">"Aucune donnée durant cette période"</string>
<plurals name="billing_cycle_days_left" formatted="false" msgid="661792524671718753">
<item quantity="one">Il reste %d jour</item>
- <item quantity="many">%d days left</item>
<item quantity="other">Il reste %d jours</item>
</plurals>
<string name="billing_cycle_none_left" msgid="1694844019159277504">"Aucun temps restant"</string>
@@ -4473,7 +4404,6 @@
<string name="special_access" msgid="1767980727423395147">"Accès spéciaux applis"</string>
<plurals name="special_access_summary" formatted="false" msgid="4995506406763570815">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> application peut utiliser les données sans restriction</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> apps can use unrestricted data</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> applications peuvent utiliser les données sans restriction</item>
</plurals>
<string name="special_access_more" msgid="132919514147475846">"En voir plus"</string>
@@ -4512,17 +4442,14 @@
<string name="cross_profile_calendar_summary" msgid="8856185206722860069">"Afficher les événements professionnels dans l\'agenda personnel"</string>
<plurals name="hours" formatted="false" msgid="1853396353451635458">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> heure</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> hours</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> heures</item>
</plurals>
<plurals name="minutes" formatted="false" msgid="6244503272924425418">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> minute</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> minutes</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> minutes</item>
</plurals>
<plurals name="seconds" formatted="false" msgid="4237020272336995370">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> seconde</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> seconds</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> secondes</item>
</plurals>
<string name="automatic_storage_manager_settings" msgid="519158151463974656">"Gérer l\'espace de stockage"</string>
@@ -4647,7 +4574,6 @@
<string name="enterprise_privacy_apps_count_estimation_info" msgid="7959907857710107792">"Le nombre d\'applications est estimé. Il peut exclure les applications installées à partir d\'une source autre que la boutique Google Play Store."</string>
<plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="5403847001419529018">
<item quantity="one">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="many">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
<item quantity="other">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> applications</item>
</plurals>
<string name="enterprise_privacy_location_access" msgid="8023838718108456971">"Autorisations de localisation"</string>
@@ -4656,7 +4582,6 @@
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="7498546659083996300">"Applications par défaut"</string>
<plurals name="enterprise_privacy_number_packages" formatted="false" msgid="8568544906431825430">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications</item>
</plurals>
<string name="enterprise_privacy_input_method" msgid="3278314982700662246">"Clavier par défaut"</string>
@@ -4670,7 +4595,6 @@
<string name="enterprise_privacy_ca_certs_work" msgid="4318941788592655561">"Certificats de confiance installés dans votre profil professionnel"</string>
<plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="6459725295322004179">
<item quantity="one">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> certificat CA</item>
- <item quantity="many">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
<item quantity="other">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> certificats CA</item>
</plurals>
<string name="enterprise_privacy_lock_device" msgid="464054894363899866">"L\'administrateur peut verrouiller l\'appareil et réinitialiser le mot de passe"</string>
@@ -4679,7 +4603,6 @@
<string name="enterprise_privacy_failed_password_wipe_work" msgid="2537582942554484170">"Nombre maximal de tentatives d\'entrée du mot de passe avant de supprimer les données du profil professionnel"</string>
<plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8811973918944217791">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tentative</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentatives</item>
</plurals>
<string name="do_disclosure_generic" msgid="3067459392402324538">"Cet appareil est géré par votre organisation."</string>
@@ -4688,20 +4611,17 @@
<string name="learn_more" msgid="3534519107947510952">"En savoir plus"</string>
<plurals name="default_camera_app_title" formatted="false" msgid="8112432929729136399">
<item quantity="one">Application d\'appareil photo</item>
- <item quantity="many">Camera apps</item>
<item quantity="other">Applications d\'appareil photo</item>
</plurals>
<string name="default_calendar_app_title" msgid="1870095225089706093">"Application d\'agenda"</string>
<string name="default_contacts_app_title" msgid="7740028900741944569">"Application de contacts"</string>
<plurals name="default_email_app_title" formatted="false" msgid="8338194872609410234">
<item quantity="one">Application de client de courriel</item>
- <item quantity="many">Email client apps</item>
<item quantity="other">Applications de client de courriel</item>
</plurals>
<string name="default_map_app_title" msgid="7569231732944853320">"Application de carte"</string>
<plurals name="default_phone_app_title" formatted="false" msgid="4222188821845826493">
<item quantity="one">Application de téléphone</item>
- <item quantity="many">Phone apps</item>
<item quantity="other">Applications de téléphone</item>
</plurals>
<string name="app_names_concatenation_template_2" msgid="8320181646458855457">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g> et <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
@@ -4731,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Nombre maximal d\'ensembles de données"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Réinitialiser aux valeurs par défaut"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Les options de remplissage automatique du concepteur ont été réinitialisées"</string>
+ <string name="location_category" msgid="3496759112306219062">"Localisation"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicateur de localisation dans la barre d\'état"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Afficher pour tous les lieux, y compris le réseau et la connectivité"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forcer les mesures GNSS complètes"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Faire le suivi de toutes les constellations et les fréquences GNSS sans cycle de tâches"</string>
<string name="device_theme" msgid="5027604586494772471">"Thème de l\'appareil"</string>
<string name="default_theme" msgid="4815428567082263639">"Par défaut"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nom du réseau"</string>
@@ -4747,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Suspendre les notifications pour rester concentré"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Cette fonctionnalité n\'est pas accessible"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Cette fonctionnalité a été désactivée, car elle ralentit votre téléphone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forcer les mesures GNSS complètes"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Faire le suivi de toutes les constellations et les fréquences GNSS sans cycle de tâches"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Toujours afficher la fenêtre de plantage"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Afficher la fenêtre chaque fois qu\'une application plante"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Sélectionnez l\'application compatible avec ANGLE"</string>
@@ -4894,7 +4817,6 @@
<string name="mobile_network_summary_add_a_network" msgid="9079866102827526779">"Ajouter un réseau"</string>
<plurals name="mobile_network_summary_count" formatted="false" msgid="5173633860800230925">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> carte SIM</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> cartes SIM</item>
</plurals>
<string name="default_for_calls" msgid="2788950217176988034">"Valeur par défaut pour les appels"</string>
@@ -5029,13 +4951,11 @@
<string name="permission_bar_chart_details" msgid="5816698018592357088">"Tout afficher dans le tableau de bord"</string>
<plurals name="permission_bar_chart_label" formatted="false" msgid="4853396794340896078">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> application</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> apps</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> applications</item>
</plurals>
<string name="accessibility_usage_title" msgid="9190967143518779145">"Usage des fonctions d\'accessibilité"</string>
<plurals name="accessibility_usage_summary" formatted="false" msgid="6910643986958263005">
<item quantity="one"><xliff:g id="SERVICE_COUNT">%1$d</xliff:g> application a l\'accès complet à votre appareil</item>
- <item quantity="many"><xliff:g id="SERVICE_COUNT">%1$d</xliff:g> apps have full access to your device</item>
<item quantity="other"><xliff:g id="SERVICE_COUNT">%1$d</xliff:g> applications ont l\'accès complet à votre appareil</item>
</plurals>
<string name="media_output_panel_title" msgid="5920946795078065159">"Changer de sortie"</string>
@@ -5135,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"La fonctionnalité d\'appels Wi-Fi vous permet d\'effectuer des appels sur des réseaux autres que des réseaux cellulaires, comme des réseaux Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Appels"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Messages texte"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"préféré"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"appels préférés"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"messages texte préférés"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"non accessible"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Aucune carte SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Préférences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Se connecter aux réseaux publics"</string>
<string name="keywords_internet" msgid="7674082764898690310">"connexion réseau, internet, sans fil, données, wifi, wi-fi, wi fi, cellulaire, mobile, fournisseur cellulaire, 4g, 3g, 2g, lte"</string>
@@ -5143,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Cette fonctionnalité n\'est pas accessible parce que le mode Nuit est activé"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"L\'importance de la notification a bien été réinitialisée."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Applications"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un appareil non vérifié souhaite accéder à vos messages. Touchez l\'écran pour en savoir plus."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Autoriser l\'accès aux messages?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un appareil Bluetooth non vérifié, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], souhaite accéder à vos messages.\n\nVous ne vous êtes jamais connecté à [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] auparavant."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un appareil non vérifié veut accéder à vos contacts et à votre journal d\'appels. Touchez l\'écran pour en savoir plus."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Autoriser l\'accès aux contacts et au journal d\'appels?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un appareil Bluetooth non vérifié, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], souhaite accéder à vos contacts et à votre journal d\'appels. Cela comprend des données concernant les appels entrants et sortants.\n\nVous ne vous êtes jamais connecté à [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] auparavant."</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index ebd1b18..a2f0b23 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -25,7 +25,6 @@
<string name="device_info_default" msgid="1406619232867343310">"Inconnu"</string>
<plurals name="show_dev_countdown" formatted="false" msgid="1646187747875476269">
<item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir développeur.</item>
- <item quantity="many">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
<item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir développeur.</item>
</plurals>
<string name="show_dev_on" msgid="2840850085134853754">"Vous êtes désormais un développeur !"</string>
@@ -209,7 +208,6 @@
<string name="add_a_language" msgid="2126220398077503271">"Ajouter une langue"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Supprimer la langue sélectionnée ?</item>
- <item quantity="many">Remove selected languages?</item>
<item quantity="other">Supprimer les langues sélectionnées ?</item>
</plurals>
<string name="dlg_remove_locales_message" msgid="8110560091134252067">"Le texte s\'affichera dans une autre langue."</string>
@@ -302,7 +300,6 @@
<string name="location_settings_summary_location_off" msgid="4797932754681162262">"Désactivé"</string>
<plurals name="location_settings_summary_location_on" formatted="false" msgid="1019959038518185676">
<item quantity="one">Activée - <xliff:g id="COUNT_1">%1$d</xliff:g> application a accès à votre position</item>
- <item quantity="many">On - <xliff:g id="COUNT_1">%1$d</xliff:g> apps have access to location</item>
<item quantity="other">Activée - <xliff:g id="COUNT_1">%1$d</xliff:g> applications ont accès à votre position</item>
</plurals>
<string name="location_settings_loading_app_permission_stats" msgid="6054103701535557342">"Chargement…"</string>
@@ -401,7 +398,6 @@
<string name="fingerprint_enable_keyguard_toggle_title" msgid="5451094461919440992">"verrouillage de l\'écran"</string>
<plurals name="security_settings_fingerprint_preference_summary" formatted="false" msgid="988602245530967106">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> empreinte digitale configurée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> fingerprints set up</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> empreintes digitales configurées</item>
</plurals>
<string name="security_settings_fingerprint_preference_summary_none" msgid="1044059475710838504"></string>
@@ -628,23 +624,19 @@
<string name="lock_failed_attempts_now_wiping_dialog_dismiss" msgid="170155081899679669">"Ignorer"</string>
<plurals name="lockpassword_password_too_short" formatted="false" msgid="2192234965414232157">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT_1">%d</xliff:g> caractère</item>
- <item quantity="many">Must be at least <xliff:g id="COUNT_1">%d</xliff:g> characters</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT_1">%d</xliff:g> caractères</item>
</plurals>
<plurals name="lockpassword_pin_too_short" formatted="false" msgid="6817086810898414162">
<item quantity="one">Le code doit comporter au moins <xliff:g id="COUNT_1">%d</xliff:g> chiffre</item>
- <item quantity="many">PIN must be at least <xliff:g id="COUNT_1">%d</xliff:g> digits</item>
<item quantity="other">Le code doit comporter au moins <xliff:g id="COUNT_1">%d</xliff:g> chiffres</item>
</plurals>
<string name="lockpassword_continue_label" msgid="2507983991979547816">"Continuer"</string>
<plurals name="lockpassword_password_too_long" formatted="false" msgid="8118091957172967677">
<item quantity="one">Le mot de passe doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> caractère</item>
- <item quantity="many">Must be fewer than <xliff:g id="NUMBER_1">%d</xliff:g> characters</item>
<item quantity="other">Le mot de passe doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> caractères</item>
</plurals>
<plurals name="lockpassword_pin_too_long" formatted="false" msgid="8706992338720310765">
<item quantity="one">Le code doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> chiffre</item>
- <item quantity="many">Must be fewer than <xliff:g id="NUMBER_1">%d</xliff:g> digits</item>
<item quantity="other">Le code doit contenir moins de <xliff:g id="NUMBER_1">%d</xliff:g> chiffres</item>
</plurals>
<string name="lockpassword_pin_recently_used" msgid="6650277060998923465">"L\'administrateur de l\'appareil n\'autorise pas l\'utilisation d\'un code récent"</string>
@@ -654,37 +646,30 @@
<string name="lockpassword_password_requires_symbol" msgid="6178512486154701321">"Veuillez inclure au moins un symbole."</string>
<plurals name="lockpassword_password_requires_letters" formatted="false" msgid="2385916409676839024">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettre</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettres</item>
</plurals>
<plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2057467885488612701">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettre minuscule</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettres minuscules</item>
</plurals>
<plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="4541266279643052025">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettre majuscule</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> lettres majuscules</item>
</plurals>
<plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="70617964591376248">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> chiffre</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> chiffres</item>
</plurals>
<plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="7981236881269921943">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> symbole spécial</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> symboles spéciaux</item>
</plurals>
<plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="1567877061888948467">
<item quantity="one">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> caractère autre qu\'une lettre</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
<item quantity="other">Le mot de passe doit comporter au moins <xliff:g id="COUNT">%d</xliff:g> caractères autre qu\'une lettre</item>
</plurals>
<plurals name="lockpassword_password_requires_nonnumerical" formatted="false" msgid="5056743974888384475">
<item quantity="one">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractère non numérique</item>
- <item quantity="many">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-numerical characters</item>
<item quantity="other">Doit contenir au moins <xliff:g id="COUNT">%d</xliff:g> caractères non numériques</item>
</plurals>
<string name="lockpassword_password_recently_used" msgid="5341218079730167191">"L\'administrateur de l\'appareil n\'autorise pas l\'utilisation d\'un mot de passe récent"</string>
@@ -700,7 +685,6 @@
<string name="number_of_device_admins_none" msgid="152926922020437312">"Aucune application active"</string>
<plurals name="number_of_device_admins" formatted="false" msgid="2528735319390151989">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application active</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications actives</item>
</plurals>
<string name="manage_trust_agents" msgid="6410149930029992356">"Agents de confiance"</string>
@@ -708,7 +692,6 @@
<string name="manage_trust_agents_summary" msgid="6423843123607674286">"Aucun"</string>
<plurals name="manage_trust_agents_summary_on" formatted="false" msgid="5438047398376802735">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> agent de confiance actif</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> active trust agents</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> agents de confiance actifs</item>
</plurals>
<string name="bluetooth_quick_toggle_title" msgid="5955341060378240781">"Bluetooth"</string>
@@ -1017,17 +1000,14 @@
<string name="wifi_forget_dialog_message" msgid="8419499588321940243">"Tous les mots de passe pour ce réseau seront supprimés"</string>
<plurals name="wifi_saved_access_points_summary" formatted="false" msgid="2802436466732147888">
<item quantity="one">%d réseau</item>
- <item quantity="many">%d networks</item>
<item quantity="other">%d réseaux</item>
</plurals>
<plurals name="wifi_saved_passpoint_access_points_summary" formatted="false" msgid="5802057518058840450">
<item quantity="one">%d abonnement</item>
- <item quantity="many">%d subscriptions</item>
<item quantity="other">%d abonnements</item>
</plurals>
<plurals name="wifi_saved_all_access_points_summary" formatted="false" msgid="5125849180309374451">
<item quantity="one">%d réseau et abonnement</item>
- <item quantity="many">%d networks & subscriptions</item>
<item quantity="other">%d réseaux et abonnements</item>
</plurals>
<string name="wifi_advanced_titlebar" msgid="1234150304285575798">"Paramètres Wi-Fi avancés"</string>
@@ -1042,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adresses IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Réseaux enregistrés"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonnements"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Autres réseaux"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Paramètres IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Les paramètres Wi-Fi avancés ne sont pas disponibles pour cet utilisateur."</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Enregistrer"</string>
@@ -1360,7 +1339,6 @@
<string name="wrong_pin_code_pukked" msgid="3414172752791445033">"Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil."</string>
<plurals name="wrong_pin_code" formatted="false" msgid="4054088588731305475">
<item quantity="one">Code PIN de la carte SIM erroné. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
- <item quantity="many">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="other">Code PIN de la carte SIM erroné. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
</plurals>
<string name="wrong_pin_code_one" msgid="6924852214263071441">"Code PIN de la carte SIM incorrect. Il vous reste 1 tentative. Après cela, vous devrez contacter votre opérateur pour déverrouiller votre appareil."</string>
@@ -1618,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Supprimer l\'APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nouvel APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Enregistrer"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Annuler"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Annuler"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Le champ \"Nom\" est obligatoire."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"L\'APN est obligatoire."</string>
@@ -1633,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Vous pouvez réinitialiser les applications"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Réinitialiser le Wi-Fi, les données mobiles et le Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Tous les paramètres réseau seront réinitialisés, y compris les suivants :\n\n"<li>"Wi‑Fi"</li>\n<li>"Données mobiles"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Effacer"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Effacer les cartes SIM téléchargées"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Pour télécharger des cartes SIM de remplacement, contactez votre opérateur. Cela n\'entraînera la résiliation d\'aucun forfait mobile."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Cela n\'entraînera la résiliation d\'aucun forfait mobile. Pour télécharger des cartes SIM de remplacement, contactez votre opérateur."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Réinitialiser les paramètres"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Réinitialiser tous les paramètres du réseau ? Cette action est irréversible."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Réinitialiser tous les paramètres réseau et effacer les cartes SIM téléchargées ? Cette action est irréversible."</string>
@@ -1742,7 +1721,6 @@
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"La localisation est désactivée"</string>
<plurals name="location_app_permission_summary_location_on" formatted="false" msgid="8286873148858526214">
<item quantity="one"> <xliff:g id="PERMITTED_LOCATION_APP_COUNT_2">%1$d</xliff:g> application sur <xliff:g id="TOTAL_LOCATION_APP_COUNT_3">%2$d</xliff:g> a accès à votre position</item>
- <item quantity="many"> <xliff:g id="PERMITTED_LOCATION_APP_COUNT_2">%1$d</xliff:g> of <xliff:g id="TOTAL_LOCATION_APP_COUNT_3">%2$d</xliff:g> apps have access to location</item>
<item quantity="other"> <xliff:g id="PERMITTED_LOCATION_APP_COUNT_2">%1$d</xliff:g> applications sur <xliff:g id="TOTAL_LOCATION_APP_COUNT_3">%2$d</xliff:g> ont accès à votre position</item>
</plurals>
<string name="location_category_recent_location_access" msgid="7880996987927703141">"Accès récent à votre position"</string>
@@ -1903,7 +1881,6 @@
<string name="recent_app_category_title" msgid="189758417804427533">"Applications ouvertes récemment"</string>
<plurals name="see_all_apps_title" formatted="false" msgid="6864581406735745400">
<item quantity="one">Afficher l\'application</item>
- <item quantity="many">See all %1$d apps</item>
<item quantity="other">Afficher les %1$d applications</item>
</plurals>
<string name="forgot_password_title" msgid="3967873480875239885">"Contacter votre administrateur informatique"</string>
@@ -1924,7 +1901,6 @@
<string name="cache_size_label" msgid="313456088966822757">"Cache"</string>
<plurals name="uri_permissions_text" formatted="false" msgid="8212425823423508096">
<item quantity="one">%d élément</item>
- <item quantity="many">%d items</item>
<item quantity="other">%d éléments</item>
</plurals>
<string name="clear_uri_btn_text" msgid="4828117421162495134">"Supprimer l\'accès"</string>
@@ -2288,7 +2264,6 @@
<string name="accessibility_hearingaid_active_device_summary" msgid="509703438222873967">"Appareil \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" actif"</string>
<plurals name="show_number_hearingaid_count" formatted="false" msgid="776000580683647556">
<item quantity="one"><xliff:g id="NUMBER_DEVICE_COUNT_1">%1$d</xliff:g> appareil auditif enregistré</item>
- <item quantity="many"><xliff:g id="NUMBER_DEVICE_COUNT_1">%1$d</xliff:g> saved hearing aids</item>
<item quantity="other"><xliff:g id="NUMBER_DEVICE_COUNT_1">%1$d</xliff:g> appareils auditifs enregistrés</item>
</plurals>
<string name="accessibility_summary_shortcut_enabled" msgid="4030427268146752644">"Raccourci activé"</string>
@@ -2308,22 +2283,18 @@
<string name="daltonizer_mode_tritanomaly_summary" msgid="2837137091067433059">"Bleu-jaune"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_short_delay" formatted="false" msgid="5354221071353645263">
<item quantity="one">Court (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
- <item quantity="many">Short (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconds)</item>
<item quantity="other">Court (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
</plurals>
<plurals name="accessibilty_autoclick_preference_subtitle_medium_delay" formatted="false" msgid="1550891909800510628">
<item quantity="one">Moyen (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
- <item quantity="many">Medium (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconds)</item>
<item quantity="other">Moyen (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
</plurals>
<plurals name="accessibilty_autoclick_preference_subtitle_long_delay" formatted="false" msgid="2230755548820485984">
<item quantity="one">Long (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
- <item quantity="many">Long (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconds)</item>
<item quantity="other">Long (<xliff:g id="CLICK_DELAY_LABEL_1">%1$s</xliff:g> seconde)</item>
</plurals>
<plurals name="accessibilty_autoclick_delay_unit_second" formatted="false" msgid="4537791441118261556">
<item quantity="one"><xliff:g id="CLICK_DELAY_LABEL_2">%1$s</xliff:g> seconde</item>
- <item quantity="many"><xliff:g id="CLICK_DELAY_LABEL_2">%1$s</xliff:g> seconds</item>
<item quantity="other"><xliff:g id="CLICK_DELAY_LABEL_2">%1$s</xliff:g> seconde</item>
</plurals>
<string name="accessibility_vibration_summary" msgid="27904038683405084">"Sonnerie : <xliff:g id="SUMMARY_RING">%1$s</xliff:g>, Notification : <xliff:g id="SUMMARY_NOTIFICATION">%2$s</xliff:g>, Appui : <xliff:g id="SUMMARY_TOUCH">%3$s</xliff:g>"</string>
@@ -2396,12 +2367,10 @@
<string name="print_settings_summary_no_service" msgid="6721731154917653862">"Désactivé"</string>
<plurals name="print_settings_summary" formatted="false" msgid="1034273609054146099">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> service d\'impression activé</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> print services on</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> services d\'impression activés</item>
</plurals>
<plurals name="print_jobs_summary" formatted="false" msgid="3933688846338306536">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> tâche d\'impression</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> print jobs</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> tâches d\'impression</item>
</plurals>
<string name="print_settings_title" msgid="7680498284751129935">"Services d\'impression"</string>
@@ -2487,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablette plus utilisée que d\'habitude"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Appareil plus utilisé que d\'habitude"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"La batterie pourrait s\'épuiser plus tôt que prévu"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Préservation de la batterie"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimisation pour préserver la batterie"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batterie limitée temporairement. Appuyez sur cette notification pour en savoir plus."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Votre téléphone a été plus utilisé que d\'habitude. Il est possible que vous arriviez à court de batterie plus vite que prévu.\n\nClassement des applis par utilisation de la batterie :"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Votre tablette a été plus utilisée que d\'habitude. Il est possible que vous arriviez à court de batterie plus vite que prévu.\n\nClassement des applis par utilisation de la batterie :"</string>
@@ -2495,27 +2464,22 @@
<string name="battery_tip_dialog_message_footer" msgid="986542164372177504">"Inclut les activités en arrière-plan qui sollicitent fortement la batterie"</string>
<plurals name="battery_tip_restrict_title" formatted="false" msgid="3108195491484891588">
<item quantity="one">Limiter %1$d application</item>
- <item quantity="many">Restrict %1$d apps</item>
<item quantity="other">Limiter %1$d applications</item>
</plurals>
<plurals name="battery_tip_restrict_handled_title" formatted="false" msgid="5862649927574803958">
<item quantity="one">%2$d application récemment limitée</item>
- <item quantity="many">%2$d apps recently restricted</item>
<item quantity="other">%2$d applications récemment limitées</item>
</plurals>
<plurals name="battery_tip_restrict_summary" formatted="false" msgid="3328499737453686910">
<item quantity="one">%2$d application sollicite beaucoup la batterie en arrière-plan</item>
- <item quantity="many">%2$d apps have high background battery usage</item>
<item quantity="other">%2$d applications sollicitent beaucoup la batterie en arrière-plan</item>
</plurals>
<plurals name="battery_tip_restrict_handled_summary" formatted="false" msgid="3036853535034350991">
<item quantity="one">Cette application ne peut pas s\'exécuter en arrière-plan</item>
- <item quantity="many">These apps can\'t run in the background</item>
<item quantity="other">Ces applications ne peuvent pas s\'exécuter en arrière-plan</item>
</plurals>
<plurals name="battery_tip_restrict_app_dialog_title" formatted="false" msgid="7897944678619251740">
<item quantity="one">Restreindre l\'application ?</item>
- <item quantity="many">Restrict %1$d apps?</item>
<item quantity="other">Restreindre les %1$d applications ?</item>
</plurals>
<string name="battery_tip_restrict_app_dialog_message" msgid="137856003724730751">"Pour économiser la batterie, empêchez <xliff:g id="APP">%1$s</xliff:g> de l\'utiliser en arrière-plan. Cette application peut ne pas fonctionner correctement et ses notifications risquent d\'être retardées."</string>
@@ -2536,7 +2500,6 @@
<string name="restricted_app_title" msgid="6585080822121007436">"Applications dont l\'accès est limité"</string>
<plurals name="restricted_app_summary" formatted="false" msgid="6059772951505411003">
<item quantity="one">Limitation de l\'utilisation de la batterie pour %1$d application</item>
- <item quantity="many">Limiting battery usage for %1$d apps</item>
<item quantity="other">Limitation de l\'utilisation de la batterie pour %1$d applications</item>
</plurals>
<string name="restricted_app_time_summary" msgid="3097721884155913252">"Limitée <xliff:g id="TIME">%1$s</xliff:g>"</string>
@@ -2547,7 +2510,6 @@
<string name="battery_manager_off" msgid="673547668722420924">"Désactivé"</string>
<plurals name="battery_manager_app_restricted" formatted="false" msgid="6714534362166394848">
<item quantity="one">%1$d application limitée</item>
- <item quantity="many">%1$d apps restricted</item>
<item quantity="other">%1$d applications limitées</item>
</plurals>
<string name="battery_header_title_alternate" msgid="8371821625994616659">"<xliff:g id="NUMBER">^1</xliff:g>"<small>" "<font size="20">"<xliff:g id="UNIT">%</xliff:g>"</font></small>""</string>
@@ -2816,7 +2778,6 @@
<string name="notification_history_dismiss" msgid="6180321217375722918">"Notifications ignorées récemment"</string>
<plurals name="notification_history_count" formatted="false" msgid="1859304685071321991">
<item quantity="one"><xliff:g id="NUMBER_1">%d</xliff:g> notification</item>
- <item quantity="many"><xliff:g id="NUMBER_1">%d</xliff:g> notifications</item>
<item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> notifications</item>
</plurals>
<string name="sound_category_call_ringtone_vibrate_title" msgid="9090693401915654528">"Sonnerie et vibreur pour les appels"</string>
@@ -3066,23 +3027,19 @@
<string name="done_button" msgid="6269449526248267">"OK"</string>
<plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="5491460811755938449">
<item quantity="one">Considérer le certificat comme fiable ou le supprimer</item>
- <item quantity="many">Trust or remove certificates</item>
<item quantity="other">Considérer les certificats comme fiables ou les supprimer</item>
</plurals>
<plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="2788832560436163252">
<item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé une autorité de certification sur votre appareil afin de contrôler l\'activité réseau de l\'appareil, y compris les e-mails, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, contactez votre administrateur.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
<item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des autorités de certification sur votre appareil afin de contrôler l\'activité réseau de l\'appareil, y compris les e-mails, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, contactez votre administrateur.</item>
</plurals>
<plurals name="ssl_ca_cert_info_message" formatted="false" msgid="3989916958347169622">
<item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé une autorité de certification pour votre profil professionnel afin de contrôler l\'activité sur le réseau, y compris les e-mails, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, contactez votre administrateur.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
<item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des autorités de certification pour votre profil professionnel afin de contrôler l\'activité sur le réseau, y compris les e-mails, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, contactez votre administrateur.</item>
</plurals>
<string name="ssl_ca_cert_warning_message" msgid="4374052724815563051">"Des tiers ont la possibilité de surveiller votre activité sur le réseau, y compris en ce qui concerne les e-mails, les applications et les sites Web sécurisés.\n\nUn certificat de confiance installé sur votre appareil rend cela possible."</string>
<plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="125941406175485894">
<item quantity="one">Vérifier le certificat</item>
- <item quantity="many">Check certificates</item>
<item quantity="other">Vérifier les certificats</item>
</plurals>
<string name="user_settings_title" msgid="6550866465409807877">"Utilisateurs multiples"</string>
@@ -3260,7 +3217,6 @@
<string name="dashboard_title" msgid="5660733037244683387">"Paramètres"</string>
<plurals name="settings_suggestion_header_summary_hidden_items" formatted="false" msgid="6585075562837786847">
<item quantity="one">Afficher %d élément masqué</item>
- <item quantity="many">Show %d hidden items</item>
<item quantity="other">Afficher %d éléments masqués</item>
</plurals>
<string name="network_dashboard_title" msgid="788543070557731240">"Réseau et Internet"</string>
@@ -3412,7 +3368,7 @@
<string name="boot_sounds_title" msgid="5033062848948884111">"Sons de mise en route"</string>
<string name="live_caption_title" msgid="8617086825712756983">"Sous-titres instantanés"</string>
<string name="live_caption_summary" msgid="2898451867595161809">"Sous-titres automatiques"</string>
- <string name="zen_mode_settings_schedules_summary" msgid="2047688589286811617">"{count,plural, =0{Aucune}=1{1 planification définie}one{# planification définie}many{# schedules set}other{# planifications définies}}"</string>
+ <string name="zen_mode_settings_schedules_summary" msgid="2047688589286811617">"{count,plural, =0{Aucune}=1{1 planification définie}one{# planification définie}other{# planifications définies}}"</string>
<string name="zen_mode_settings_title" msgid="682676757791334259">"Ne pas déranger"</string>
<string name="zen_mode_settings_summary" msgid="6040862775514495191">"Ne recevoir des notifications que des personnes et applications importantes"</string>
<string name="zen_mode_slice_subtitle" msgid="6849372107272604160">"Limiter les interruptions"</string>
@@ -3483,9 +3439,9 @@
<string name="zen_mode_sound_summary_on" msgid="9077659040104989899">"Activé"</string>
<string name="zen_mode_duration_summary_always_prompt" msgid="7658172853423383037">"Toujours demander"</string>
<string name="zen_mode_duration_summary_forever" msgid="5551992961329998606">"Jusqu\'à la désactivation"</string>
- <string name="zen_mode_duration_summary_time_hours" msgid="2602655749780428308">"{count,plural, =1{1 heure}one{# heure}many{# hours}other{# heures}}"</string>
- <string name="zen_mode_duration_summary_time_minutes" msgid="5755536844016835693">"{count,plural, =1{1 minute}one{# minute}many{# minutes}other{# minutes}}"</string>
- <string name="zen_mode_sound_summary_off" msgid="7350437977839985836">"{count,plural, =0{Désactivé}=1{Désactivé/1 planification peut être activée automatiquement}one{Désactivé/# planification peut être activée automatiquement}many{Off / # schedules can turn on automatically}other{Désactivé/# planifications peuvent être activées automatiquement}}"</string>
+ <string name="zen_mode_duration_summary_time_hours" msgid="2602655749780428308">"{count,plural, =1{1 heure}one{# heure}other{# heures}}"</string>
+ <string name="zen_mode_duration_summary_time_minutes" msgid="5755536844016835693">"{count,plural, =1{1 minute}one{# minute}other{# minutes}}"</string>
+ <string name="zen_mode_sound_summary_off" msgid="7350437977839985836">"{count,plural, =0{Désactivé}=1{Désactivé/1 planification peut être activée automatiquement}one{Désactivé/# planification peut être activée automatiquement}other{Désactivé/# planifications peuvent être activées automatiquement}}"</string>
<string name="zen_category_behavior" msgid="3214056473947178507">"Ce qui peut interrompre le mode Ne pas déranger"</string>
<string name="zen_category_people" msgid="8252926021894933047">"Personnes"</string>
<string name="zen_category_apps" msgid="1167374545618451925">"Applications"</string>
@@ -3627,7 +3583,6 @@
<string name="priority_conversation_count_zero" msgid="3862289535537564713">"Aucune conversation prioritaire"</string>
<plurals name="priority_conversation_count" formatted="false" msgid="4229447176780862649">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> conversation prioritaire</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> priority conversations</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> conversations prioritaires</item>
</plurals>
<string name="important_conversations" msgid="1233893707189659401">"Conversations prioritaires"</string>
@@ -3669,12 +3624,10 @@
<string name="default_notification_assistant" msgid="243718059890346442">"Notifications intelligentes"</string>
<plurals name="notifications_sent_daily" formatted="false" msgid="1479283620504341566">
<item quantity="one">Environ <xliff:g id="NUMBER_1">%d</xliff:g> notification par jour</item>
- <item quantity="many">~<xliff:g id="NUMBER_1">%d</xliff:g> notifications per day</item>
<item quantity="other">Environ <xliff:g id="NUMBER_1">%d</xliff:g> notifications par jour</item>
</plurals>
<plurals name="notifications_sent_weekly" formatted="false" msgid="4913443431857170519">
<item quantity="one">Environ <xliff:g id="NUMBER_1">%d</xliff:g> notification par semaine</item>
- <item quantity="many">~<xliff:g id="NUMBER_1">%d</xliff:g> notifications per week</item>
<item quantity="other">Environ <xliff:g id="NUMBER_1">%d</xliff:g> notifications par semaine</item>
</plurals>
<string name="notifications_sent_never" msgid="9081278709126812062">"Jamais"</string>
@@ -3683,7 +3636,6 @@
<string name="manage_notification_access_summary_zero" msgid="7528633634628627431">"Les applications ne peuvent pas lire les notifications."</string>
<plurals name="manage_notification_access_summary_nonzero" formatted="false" msgid="3703008881487586312">
<item quantity="one">%d application peut lire les notifications.</item>
- <item quantity="many">%d apps can read notifications</item>
<item quantity="other">%d applications peuvent lire les notifications.</item>
</plurals>
<string name="notification_assistant_title" msgid="6983941403582134437">"Notifications intelligentes"</string>
@@ -3730,7 +3682,6 @@
<string name="interact_across_profiles_number_of_connected_apps_none" msgid="8573289199942092964">"Aucune application associée"</string>
<plurals name="interact_across_profiles_number_of_connected_apps" formatted="false" msgid="6991750455661974772">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application associée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> apps connected</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications associées</item>
</plurals>
<string name="interact_across_profiles_install_work_app_title" msgid="2821669067014436056">"Pour connecter ces applications, installez <xliff:g id="NAME">%1$s</xliff:g> dans votre profil professionnel"</string>
@@ -3747,7 +3698,6 @@
<string name="notification_channels_other" msgid="18159805343647908">"Autres"</string>
<plurals name="notification_group_summary" formatted="false" msgid="483490958130993160">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> catégorie</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> categories</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> catégories</item>
</plurals>
<string name="no_channels" msgid="4716199078612071915">"Cette application n\'a publié aucune notification"</string>
@@ -3756,12 +3706,10 @@
<string name="app_notification_listing_summary_zero" msgid="2988400013221120744">"Activées pour toutes les applications"</string>
<plurals name="app_notification_listing_summary_others" formatted="false" msgid="1506127395400503717">
<item quantity="one">Désactivé pour <xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="many">Off for <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
<item quantity="other">Désactivé pour <xliff:g id="COUNT_1">%d</xliff:g> applications</item>
</plurals>
<plurals name="deleted_channels" formatted="false" msgid="5963473421547029532">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> catégorie supprimée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> categories deleted</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> catégories supprimées</item>
</plurals>
<string name="notification_toggle_on" msgid="1624283327379059003">"Activées"</string>
@@ -3834,7 +3782,7 @@
<string name="zen_mode_from_all_conversations" msgid="3447000451361857061">"Toutes les conversations"</string>
<string name="zen_mode_from_important_conversations" msgid="528050873364229253">"Conversations prioritaires"</string>
<string name="zen_mode_from_no_conversations" msgid="3924593219855567165">"Aucune"</string>
- <string name="zen_mode_conversations_count" msgid="3199310723073707153">"{count,plural, =0{Aucune}=1{1 conversation}one{# conversation}many{# conversations}other{# conversations}}"</string>
+ <string name="zen_mode_conversations_count" msgid="3199310723073707153">"{count,plural, =0{Aucune}=1{1 conversation}one{# conversation}other{# conversations}}"</string>
<string name="zen_mode_people_calls_messages_section_title" msgid="6815202112413762206">"Personnes qui peuvent interrompre le mode Ne pas déranger"</string>
<string name="zen_mode_calls_title" msgid="2078578043677037740">"Appels"</string>
<string name="zen_mode_calls" msgid="7653245854493631095">"Appels"</string>
@@ -3843,7 +3791,7 @@
<string name="zen_mode_calls_footer" msgid="2008079711083701243">"Pour que le téléphone sonne lorsque vous recevez un appel autorisé, assurez-vous d\'avoir activé la sonnerie"</string>
<string name="zen_mode_custom_calls_footer" msgid="6521283204577441053">"Les appels entrants sont bloqués pendant la plage horaire \"<xliff:g id="SCHEDULE_NAME">%1$s</xliff:g>\". Vous pouvez ajuster les paramètres pour que vos proches ou d\'autres contacts puissent quand même vous joindre."</string>
<string name="zen_mode_starred_contacts_title" msgid="630299631659575589">"Contacts favoris"</string>
- <string name="zen_mode_starred_contacts_summary_contacts" msgid="1629467178444895094">"{count,plural,offset:2 =0{Aucun}=1{{contact_1}}=2{{contact_1} et {contact_2}}=3{{contact_1}, {contact_2} et {contact_3}}one{{contact_1}, {contact_2} et # autre contact favori}many{{contact_1}, {contact_2}, and # others}other{{contact_1}, {contact_2} et # autres contacts favoris}}"</string>
+ <string name="zen_mode_starred_contacts_summary_contacts" msgid="1629467178444895094">"{count,plural,offset:2 =0{Aucun}=1{{contact_1}}=2{{contact_1} et {contact_2}}=3{{contact_1}, {contact_2} et {contact_3}}one{{contact_1}, {contact_2} et # autre contact favori}other{{contact_1}, {contact_2} et # autres contacts favoris}}"</string>
<string name="zen_mode_starred_contacts_empty_name" msgid="2906404745550293688">"(Sans nom)"</string>
<string name="zen_mode_messages" msgid="7315084748885170585">"Messages"</string>
<string name="zen_mode_messages_list" msgid="5431014101342361882">"messages"</string>
@@ -3853,7 +3801,7 @@
<string name="zen_mode_custom_messages_footer" msgid="7545180036949550830">"Les messages entrants sont bloqués pour \"<xliff:g id="SCHEDULE_NAME">%1$s</xliff:g>\". Vous pouvez ajuster les paramètres pour que vos proches ou d\'autres contacts puissent quand même vous joindre."</string>
<string name="zen_mode_all_messages_summary" msgid="3756267858343104554">"Vous recevez tous les messages"</string>
<string name="zen_mode_all_calls_summary" msgid="7337907849083824698">"Vous recevez tous les appels"</string>
- <string name="zen_mode_contacts_count" msgid="6568631261119795799">"{count,plural, =0{Aucun}=1{1 contact}one{# contact}many{# contacts}other{# contacts}}"</string>
+ <string name="zen_mode_contacts_count" msgid="6568631261119795799">"{count,plural, =0{Aucun}=1{1 contact}one{# contact}other{# contacts}}"</string>
<string name="zen_mode_from_anyone" msgid="6027004263046694174">"Tout le monde"</string>
<string name="zen_mode_from_contacts" msgid="2989933306317064818">"Contacts"</string>
<string name="zen_mode_from_starred" msgid="8616516644241652287">"Contacts favoris"</string>
@@ -3891,13 +3839,13 @@
<string name="zen_mode_bypassing_apps_summary_all" msgid="4684544706511555744">"Toutes les notifications"</string>
<string name="zen_mode_bypassing_apps_summary_some" msgid="5315750826830358230">"Certaines notifications"</string>
<string name="zen_mode_bypassing_apps_footer" msgid="1454862989340760124">"Les personnes sélectionnées peuvent vous contacter, même si vous n\'autorisez pas les applications à interrompre le mode Ne pas déranger"</string>
- <string name="zen_mode_bypassing_apps_subtext" msgid="5258652366929842710">"{count,plural,offset:2 =0{Aucune application ne peut interrompre le mode Ne pas déranger}=1{{app_1} peut interrompre le mode Ne pas déranger}=2{{app_1} et {app_2} peuvent interrompre le mode Ne pas déranger}=3{{app_1}, {app_2} et {app_3} peuvent interrompre le mode Ne pas déranger}one{{app_1}, {app_2} et # autre application peuvent interrompre le mode Ne pas déranger}many{{app_1}, {app_2}, and # more can interrupt}other{{app_1}, {app_2} et # autres applications peuvent interrompre le mode Ne pas déranger}}"</string>
+ <string name="zen_mode_bypassing_apps_subtext" msgid="5258652366929842710">"{count,plural,offset:2 =0{Aucune application ne peut interrompre le mode Ne pas déranger}=1{{app_1} peut interrompre le mode Ne pas déranger}=2{{app_1} et {app_2} peuvent interrompre le mode Ne pas déranger}=3{{app_1}, {app_2} et {app_3} peuvent interrompre le mode Ne pas déranger}one{{app_1}, {app_2} et # autre application peuvent interrompre le mode Ne pas déranger}other{{app_1}, {app_2} et # autres applications peuvent interrompre le mode Ne pas déranger}}"</string>
<string name="zen_mode_bypassing_apps_title" msgid="371050263563164059">"Applications"</string>
<string name="zen_mode_bypassing_apps_all_summary" msgid="5197566190120503132">"Toutes les notifications"</string>
<string name="zen_mode_bypassing_apps_some_summary" msgid="1514572070650411509">"Certaines notifications"</string>
<string name="zen_mode_bypassing_app_channels_header" msgid="4011017798712587373">"Notifications qui peuvent interrompre le mode Ne pas déranger"</string>
<string name="zen_mode_bypassing_app_channels_toggle_all" msgid="1449462656358219116">"Autoriser toutes les notifications"</string>
- <string name="zen_mode_other_sounds_summary" msgid="8784400697494837032">"{count,plural,offset:2 =0{Rien ne peut interrompre le mode Ne pas déranger}=1{{sound_category_1} peut interrompre le mode Ne pas déranger}=2{{sound_category_1} et {sound_category_2} peuvent interrompre le mode Ne pas déranger}=3{{sound_category_1}, {sound_category_2} et {sound_category_3} peuvent interrompre le mode Ne pas déranger}one{{sound_category_1}, {sound_category_2} et # autre son peuvent interrompre le mode Ne pas déranger}many{{sound_category_1}, {sound_category_2}, and # more can interrupt}other{{sound_category_1}, {sound_category_2} et # autres sons peuvent interrompre le mode Ne pas déranger}}"</string>
+ <string name="zen_mode_other_sounds_summary" msgid="8784400697494837032">"{count,plural,offset:2 =0{Rien ne peut interrompre le mode Ne pas déranger}=1{{sound_category_1} peut interrompre le mode Ne pas déranger}=2{{sound_category_1} et {sound_category_2} peuvent interrompre le mode Ne pas déranger}=3{{sound_category_1}, {sound_category_2} et {sound_category_3} peuvent interrompre le mode Ne pas déranger}one{{sound_category_1}, {sound_category_2} et # autre son peuvent interrompre le mode Ne pas déranger}other{{sound_category_1}, {sound_category_2} et # autres sons peuvent interrompre le mode Ne pas déranger}}"</string>
<string name="zen_mode_sounds_none" msgid="6557474361948269420">"Rien ne peut interrompre le mode Ne pas déranger"</string>
<string name="zen_mode_people_none" msgid="4613147461974255046">"Personne ne peut interrompre le mode Ne pas déranger"</string>
<string name="zen_mode_people_some" msgid="9101872681298810281">"Certaines personnes peuvent interrompre le mode Ne pas déranger"</string>
@@ -3923,12 +3871,10 @@
<string name="zen_mode_summary_alarms_only_indefinite" msgid="910047326128154945">"Ne recevoir que les alarmes sans limite de temps"</string>
<plurals name="zen_mode_summary_alarms_only_by_minute" formatted="false" msgid="1900512966361163390">
<item quantity="one">Ne recevoir que les alarmes pendant <xliff:g id="DURATION">%1$d</xliff:g> minute jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
- <item quantity="many">Change to alarms only for <xliff:g id="DURATION">%1$d</xliff:g> minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Ne recevoir que les alarmes pendant <xliff:g id="DURATION">%1$d</xliff:g> minutes jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
</plurals>
<plurals name="zen_mode_summary_alarms_only_by_hour" formatted="false" msgid="955991428001659124">
<item quantity="one">Ne recevoir que les alarmes pendant <xliff:g id="DURATION">%1$d</xliff:g> heure jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
- <item quantity="many">Change to alarms only for <xliff:g id="DURATION">%1$d</xliff:g> hours until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
<item quantity="other">Ne recevoir que les alarmes pendant <xliff:g id="DURATION">%1$d</xliff:g> heures jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
</plurals>
<string name="zen_mode_summary_alarms_only_by_time" msgid="8140619669703968810">"Ne recevoir que les alarmes jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -4014,22 +3960,18 @@
<string name="notification_summary_channel" msgid="8459033623057872803">"<xliff:g id="CHANNEL_NAME">%1$s</xliff:g> • <xliff:g id="GROUP_NAME">%2$s</xliff:g>"</string>
<plurals name="notifications_categories_off" formatted="false" msgid="1385401442703692986">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> catégorie désactivée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> categories turned off</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> catégories désactivées</item>
</plurals>
<plurals name="permissions_summary" formatted="false" msgid="5015472550875144481">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation accordée</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> permissions granted</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations accordées</item>
</plurals>
<plurals name="runtime_permissions_summary" formatted="false" msgid="2091022049141391855">
<item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> autorisation accordée sur <xliff:g id="COUNT_3">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="COUNT_2">%d</xliff:g> of <xliff:g id="COUNT_3">%d</xliff:g> permissions granted</item>
<item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> autorisations accordées sur <xliff:g id="COUNT_3">%d</xliff:g></item>
</plurals>
<plurals name="runtime_permissions_additional_count" formatted="false" msgid="5888624648943937645">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation supplémentaire</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations supplémentaires</item>
</plurals>
<string name="runtime_permissions_summary_no_permissions_granted" msgid="7456745929035665029">"Aucune autorisation accordée"</string>
@@ -4059,7 +4001,6 @@
<string name="domain_urls_apps_summary_off" msgid="2534980824850890416">"Aucune application ouvrant des liens compatibles"</string>
<plurals name="domain_urls_apps_summary_on" formatted="false" msgid="7864816862441985323">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> application ouvrant des liens compatibles</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> apps opening supported links</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> applications ouvrant des liens compatibles</item>
</plurals>
<string name="app_link_open_always" msgid="9167065494930657503">"Autoriser l\'application à ouvrir les liens compatibles"</string>
@@ -4067,7 +4008,6 @@
<string name="app_link_open_never" msgid="5299808605386052350">"Ne pas autoriser l\'application à ouvrir les liens compatibles"</string>
<plurals name="app_link_open_always_summary" formatted="false" msgid="1816161439007251694">
<item quantity="one">L\'application revendique <xliff:g id="COUNT_1">%d</xliff:g> lien</item>
- <item quantity="many">App claims to handle <xliff:g id="COUNT_1">%d</xliff:g> links</item>
<item quantity="other">L\'application revendique <xliff:g id="COUNT_1">%d</xliff:g> liens</item>
</plurals>
<string name="open_supported_links_footer" msgid="3188808142432787933">"L\'application revendique les liens suivants :"</string>
@@ -4110,12 +4050,10 @@
<string name="hide_extra_apps" msgid="7313907836289865123">"Afficher utilisation appli"</string>
<plurals name="power_high_usage_summary" formatted="false" msgid="573433136005336970">
<item quantity="one"><xliff:g id="NUMBER">%2$d</xliff:g> application a un comportement anormal</item>
- <item quantity="many"><xliff:g id="NUMBER">%2$d</xliff:g> apps behaving abnormally</item>
<item quantity="other"><xliff:g id="NUMBER">%2$d</xliff:g> applications ont un comportement anormal</item>
</plurals>
<plurals name="power_high_usage_title" formatted="false" msgid="8013115866788425817">
<item quantity="one">Une application décharge la batterie</item>
- <item quantity="many">Apps draining battery</item>
<item quantity="other">Des applications déchargent la batterie</item>
</plurals>
<string name="high_power_filter_on" msgid="447849271630431531">"Non optimisées"</string>
@@ -4193,7 +4131,6 @@
<string name="memory_usage_apps" msgid="5776108502569850579">"Mémoire utilisée par les applications"</string>
<plurals name="memory_usage_apps_summary" formatted="false" msgid="1355637088533572208">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> application a utilisé de la mémoire au cours de la période suivante : <xliff:g id="DURATION_1">%2$s</xliff:g>.</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> apps used memory in the last <xliff:g id="DURATION_1">%2$s</xliff:g></item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> applications ont utilisé de la mémoire au cours de la période suivante : <xliff:g id="DURATION_1">%2$s</xliff:g>.</item>
</plurals>
<string name="running_frequency" msgid="7260225121706316639">"Fréquence"</string>
@@ -4268,7 +4205,6 @@
<string name="data_usage_wifi_format" msgid="7644390582649568117">"<xliff:g id="AMOUNT">^1</xliff:g> utilisés sur le réseau Wi-Fi"</string>
<plurals name="notification_summary" formatted="false" msgid="7638388920823212470">
<item quantity="one">Désactivé pour <xliff:g id="COUNT">%d</xliff:g> application</item>
- <item quantity="many">Off for <xliff:g id="COUNT">%d</xliff:g> apps</item>
<item quantity="other">Désactivé pour <xliff:g id="COUNT">%d</xliff:g> applications</item>
</plurals>
<string name="notification_summary_none" msgid="9179312319023988089">"Activées pour toutes les applications"</string>
@@ -4335,12 +4271,10 @@
<string name="suggestions_more_title" msgid="240124526378997009">"+<xliff:g id="ID_1">%1$d</xliff:g> autres"</string>
<plurals name="suggestions_collapsed_title" formatted="false" msgid="5023679825210836444">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> suggestion</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
</plurals>
<plurals name="suggestions_collapsed_summary" formatted="false" msgid="3789011332018516832">
<item quantity="one">+<xliff:g id="COUNT">%1$d</xliff:g> suggestion</item>
- <item quantity="many">+<xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
<item quantity="other">+<xliff:g id="COUNT">%1$d</xliff:g> suggestions</item>
</plurals>
<string name="suggestion_remove" msgid="6753986344585367776">"Supprimer"</string>
@@ -4370,7 +4304,6 @@
<string name="network_restrictions" msgid="8385824604048229846">"Restrictions sur le réseau"</string>
<plurals name="network_restrictions_summary" formatted="false" msgid="3875128958788008975">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> restriction</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> restrictions</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> restrictions</item>
</plurals>
<string name="operator_warning" msgid="5672761970087591211">"Le suivi de consommation de votre opérateur peut différer de celui qui est effectué sur votre appareil."</string>
@@ -4386,7 +4319,6 @@
<string name="data_usage_other_apps" msgid="5649047093607329537">"Autres applications incluses dans la consommation"</string>
<plurals name="data_saver_unrestricted_summary" formatted="false" msgid="3316296488378947221">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> application est autorisée à utiliser des données sans restrictions lorsque l\'économiseur de données est activé</item>
- <item quantity="many"><xliff:g id="COUNT">%1$d</xliff:g> apps allowed to use unrestricted data when Data Saver is on</item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> applications sont autorisées à utiliser des données sans restrictions lorsque l\'économiseur de données est activé</item>
</plurals>
<string name="data_usage_title" msgid="4039024073687469094">"Données principales"</string>
@@ -4399,7 +4331,6 @@
<string name="data_usage_chart_no_data_content_description" msgid="5481968839079467231">"Aucune donnée disponible pour cette plage de dates"</string>
<plurals name="billing_cycle_days_left" formatted="false" msgid="661792524671718753">
<item quantity="one">%d jour restant</item>
- <item quantity="many">%d days left</item>
<item quantity="other">%d jours restants</item>
</plurals>
<string name="billing_cycle_none_left" msgid="1694844019159277504">"Le cycle de facturation est arrivé à échéance"</string>
@@ -4473,7 +4404,6 @@
<string name="special_access" msgid="1767980727423395147">"Accès spécifiques des applications"</string>
<plurals name="special_access_summary" formatted="false" msgid="4995506406763570815">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> application peut utiliser les données sans restrictions</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> apps can use unrestricted data</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> applications peuvent utiliser les données sans restrictions</item>
</plurals>
<string name="special_access_more" msgid="132919514147475846">"En savoir plus"</string>
@@ -4512,17 +4442,14 @@
<string name="cross_profile_calendar_summary" msgid="8856185206722860069">"Afficher les événements professionnels dans votre agenda personnel"</string>
<plurals name="hours" formatted="false" msgid="1853396353451635458">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> heure</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> hours</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> heures</item>
</plurals>
<plurals name="minutes" formatted="false" msgid="6244503272924425418">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> minute</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> minutes</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> minutes</item>
</plurals>
<plurals name="seconds" formatted="false" msgid="4237020272336995370">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> seconde</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> seconds</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> secondes</item>
</plurals>
<string name="automatic_storage_manager_settings" msgid="519158151463974656">"Gérer l\'espace de stockage"</string>
@@ -4647,7 +4574,6 @@
<string name="enterprise_privacy_apps_count_estimation_info" msgid="7959907857710107792">"Le nombre d\'applications est une estimation. Il est possible qu\'il n\'inclue pas les applications installées sans passer par le Play Store."</string>
<plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="5403847001419529018">
<item quantity="one">Au moins <xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="many">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
<item quantity="other">Au moins <xliff:g id="COUNT_1">%d</xliff:g> applications</item>
</plurals>
<string name="enterprise_privacy_location_access" msgid="8023838718108456971">"Autorisations de localisation"</string>
@@ -4656,7 +4582,6 @@
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="7498546659083996300">"Applications par défaut"</string>
<plurals name="enterprise_privacy_number_packages" formatted="false" msgid="8568544906431825430">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications</item>
</plurals>
<string name="enterprise_privacy_input_method" msgid="3278314982700662246">"Clavier par défaut"</string>
@@ -4670,7 +4595,6 @@
<string name="enterprise_privacy_ca_certs_work" msgid="4318941788592655561">"Certificats de confiance dans votre profil professionnel"</string>
<plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="6459725295322004179">
<item quantity="one">Au moins <xliff:g id="COUNT_1">%d</xliff:g> certificat CA</item>
- <item quantity="many">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
<item quantity="other">Au moins <xliff:g id="COUNT_1">%d</xliff:g> certificats CA</item>
</plurals>
<string name="enterprise_privacy_lock_device" msgid="464054894363899866">"L\'administrateur peut verrouiller l\'appareil et réinitialiser le mot de passe"</string>
@@ -4679,7 +4603,6 @@
<string name="enterprise_privacy_failed_password_wipe_work" msgid="2537582942554484170">"Tentatives de saisie du mot de passe avant la suppression des données du profil professionnel"</string>
<plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8811973918944217791">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tentative</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentatives</item>
</plurals>
<string name="do_disclosure_generic" msgid="3067459392402324538">"Cet appareil est géré par votre organisation."</string>
@@ -4688,20 +4611,17 @@
<string name="learn_more" msgid="3534519107947510952">"En savoir plus"</string>
<plurals name="default_camera_app_title" formatted="false" msgid="8112432929729136399">
<item quantity="one">Appareil photo</item>
- <item quantity="many">Camera apps</item>
<item quantity="other">Appareil photo</item>
</plurals>
<string name="default_calendar_app_title" msgid="1870095225089706093">"Agenda"</string>
<string name="default_contacts_app_title" msgid="7740028900741944569">"Contacts"</string>
<plurals name="default_email_app_title" formatted="false" msgid="8338194872609410234">
<item quantity="one">Client de messagerie</item>
- <item quantity="many">Email client apps</item>
<item quantity="other">Client de messagerie</item>
</plurals>
<string name="default_map_app_title" msgid="7569231732944853320">"Cartes"</string>
<plurals name="default_phone_app_title" formatted="false" msgid="4222188821845826493">
<item quantity="one">Téléphone</item>
- <item quantity="many">Phone apps</item>
<item quantity="other">Téléphone</item>
</plurals>
<string name="app_names_concatenation_template_2" msgid="8320181646458855457">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
@@ -4731,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Nombre maximal d\'ensembles de données visibles"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Rétablir les valeurs par défaut"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Les options de saisie automatique du développeur ont été réinitialisées"</string>
+ <string name="location_category" msgid="3496759112306219062">"Localisation"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicateur de localisation dans la barre d\'état"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Afficher pour tous les emplacements, y compris le réseau et la connectivité"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forcer les mesures GNSS complètes"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Effectuer le suivi de toutes les fréquences et constellations GNSS sans rapport cyclique"</string>
<string name="device_theme" msgid="5027604586494772471">"Thème de l\'appareil"</string>
<string name="default_theme" msgid="4815428567082263639">"Par défaut"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nom du réseau"</string>
@@ -4747,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Suspendre les notifications pour rester concentré"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Fonctionnalité non disponible"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Cette fonctionnalité a été désactivée, car elle ralentit votre téléphone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forcer les mesures GNSS complètes"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Effectuer le suivi de toutes les fréquences et constellations GNSS sans rapport cyclique"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Toujours afficher une boîte de dialogue en cas de plantage"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Afficher une boîte de dialogue chaque fois qu\'une application plante"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Sélectionner une application compatible avec ANGLE"</string>
@@ -4894,7 +4817,6 @@
<string name="mobile_network_summary_add_a_network" msgid="9079866102827526779">"Ajouter un réseau"</string>
<plurals name="mobile_network_summary_count" formatted="false" msgid="5173633860800230925">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> carte SIM</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> SIMs</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> cartes SIM</item>
</plurals>
<string name="default_for_calls" msgid="2788950217176988034">"Utiliser par défaut pour les appels"</string>
@@ -5029,13 +4951,11 @@
<string name="permission_bar_chart_details" msgid="5816698018592357088">"Tout afficher dans le tableau de bord"</string>
<plurals name="permission_bar_chart_label" formatted="false" msgid="4853396794340896078">
<item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> application</item>
- <item quantity="many"><xliff:g id="NUMBER">%s</xliff:g> apps</item>
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> applications</item>
</plurals>
<string name="accessibility_usage_title" msgid="9190967143518779145">"Utilisation de l\'accessibilité"</string>
<plurals name="accessibility_usage_summary" formatted="false" msgid="6910643986958263005">
<item quantity="one"><xliff:g id="SERVICE_COUNT">%1$d</xliff:g> application bénéficie d\'un accès complet à votre appareil</item>
- <item quantity="many"><xliff:g id="SERVICE_COUNT">%1$d</xliff:g> apps have full access to your device</item>
<item quantity="other"><xliff:g id="SERVICE_COUNT">%1$d</xliff:g> applications bénéficient d\'un accès complet à votre appareil</item>
</plurals>
<string name="media_output_panel_title" msgid="5920946795078065159">"Changer de sortie"</string>
@@ -5135,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"La fonctionnalité Appels Wi-Fi vous permet de passer et de recevoir des appels sur des réseaux non gérés par des opérateurs, comme certains réseaux Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Appels"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"mode préféré"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"appels préférés"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS préférés"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"non disponible"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Aucune carte SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Préférences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Se connecter aux réseaux publics"</string>
<string name="keywords_internet" msgid="7674082764898690310">"connexion réseau, internet, sans fil, données, wifi, wi-fi, wi fi, cellulaire, mobile, opérateur mobile, 4g, 3g, 2g, lte"</string>
@@ -5143,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Indisponible, car le mode Heure du coucher est activé"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"L\'importance de la notification a bien été réinitialisée."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Applications"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un appareil non vérifié souhaite accéder à vos messages. Appuyez ici pour plus de détails."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Autoriser l\'accès aux messages ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un appareil Bluetooth non vérifié, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], souhaite accéder à vos messages.\n\nVous ne vous êtes jamais connecté à [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] auparavant."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un appareil non vérifié souhaite accéder à vos contacts et à votre journal d\'appels. Appuyez ici pour plus de détails."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Autoriser l\'accès aux contacts et au journal d\'appels ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un appareil Bluetooth non vérifié, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], souhaite accéder à vos contacts et à votre journal d\'appels. Ceci inclut des données concernant les appels entrants et sortants.\n\nVous ne vous êtes jamais connecté à [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] auparavant."</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 95a0342..8b0e44b 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Enderezos IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Redes gardadas"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscricións"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Outras redes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Configuración IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"A configuración avanzada da wifi non está dispoñible para este usuario"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Gardar"</string>
@@ -1185,7 +1184,7 @@
<string name="brightness" msgid="6216871641021779698">"Nivel de brillo"</string>
<string name="brightness_title" msgid="5457874893085305155">"Brillo"</string>
<string name="brightness_summary" msgid="6309641759293018049">"Axusta o brillo da pantalla"</string>
- <string name="auto_brightness_title" msgid="4239324728760986697">"Brillo automático"</string>
+ <string name="auto_brightness_title" msgid="4239324728760986697">"Brillo intelixente"</string>
<string name="auto_brightness_summary" msgid="1737148869232725883">"O brillo da pantalla axústase ao contorno"</string>
<string name="auto_brightness_summary_on" msgid="2748088951224387004">"Activado"</string>
<string name="auto_brightness_summary_off" msgid="8077066192887677956">"Desactivado"</string>
@@ -1204,7 +1203,7 @@
<string name="auto_brightness_off_summary" msgid="4993150980274474226">"Non axustar á luz dispoñible"</string>
<string name="auto_brightness_very_high_summary" msgid="2784981315548144255">"Maior consumo de batería"</string>
<string name="auto_brightness_disclaimer" msgid="1868395832774087351">"Optimiza o nivel de brillo segundo a luz dispoñible. Cando estea activado, poderás axustar o brillo temporalmente."</string>
- <string name="auto_brightness_description" msgid="6807117118142381193">"O brillo da pantalla axustarase automaticamente segundo o ambiente e as actividades que leves a cabo. Podes mover o control desprazable de forma manual para que o brillo automático recoñeza as túas preferencias."</string>
+ <string name="auto_brightness_description" msgid="6807117118142381193">"O brillo da pantalla axustarase automaticamente segundo o ambiente e as actividades que leves a cabo. Podes mover o control desprazable de forma manual para que o brillo intelixente recoñeza as túas preferencias."</string>
<string name="display_white_balance_title" msgid="2624544323029364713">"Balance de brancos da pantalla"</string>
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
@@ -1292,7 +1291,7 @@
<string name="screensaver_settings_current" msgid="390472865895976891">"Protector de pantalla actual"</string>
<string name="screensaver_settings_dream_start" msgid="6486360145976995856">"Iniciar agora"</string>
<string name="screensaver_settings_button" msgid="6159236558934930238">"Configuración"</string>
- <string name="automatic_brightness" msgid="4599827881929079513">"Brillo automático"</string>
+ <string name="automatic_brightness" msgid="4599827881929079513">"Brillo intelixente"</string>
<string name="lift_to_wake_title" msgid="8994218158737714046">"Levantar para acender"</string>
<string name="ambient_display_screen_title" msgid="8615947016991429325">"Pantalla en suspensión"</string>
<string name="ambient_display_category_triggers" msgid="1216640141609270011">"Cando mostrar a pantalla"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Eliminar APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Novo APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Gardar"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Descartar"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancelar"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"O nome do campo non pode quedar baleiro."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"O APN non pode estar baleiro."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Pódense restablecer as aplicacións"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Restablecer wifi, rede móbil e Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Con esta selección, restableceranse todas as opcións de configuración de rede, entre elas as referentes a:\n\n"<li>"Wifi"</li>\n<li>"Datos móbiles"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Borrar"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Borrar SIM descargadas"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para descargar tarxetas SIM de substitución, ponte en contacto co teu operador. Non se cancelará ningún dos plans de servizos móbiles que teñas."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Non se cancelará ningún dos plans de servizos móbiles que teñas. Para descargar tarxetas SIM de substitución, ponte en contacto co teu operador."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Restablecer configuración"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Queres restablecer toda a configuración de rede? Non se pode desfacer esta acción."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Queres restablecer todas as opcións de configuración de rede e borrar as SIM descargadas? Non se pode desfacer esta acción."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Utilizouse a tableta máis do normal"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Utilizouse o dispositivo máis do normal"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"A batería pode esgotarse antes do normal"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Mantendo batería en bo estado"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimización en curso para manter a batería en bo estado"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batería limitada temporalmente. Toca para obter máis información."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"O teu teléfono utilizouse máis do habitual. A batería pode esgotarse antes do previsto.\n\nAplicacións que máis batería consomen:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"A túa tableta utilizouse máis do habitual. A batería pode esgotarse antes do previsto.\n\nAplicacións que máis batería consomen:"</string>
@@ -3307,7 +3307,7 @@
<string name="keywords_lock_screen_notif" msgid="6363144436467429932">"notificación da pantalla de bloqueo, notificacións"</string>
<string name="keywords_face_settings" msgid="1360447094486865058">"cara"</string>
<string name="keywords_fingerprint_settings" msgid="7345121109302813358">"impresión dixital, engadir impresión dixital"</string>
- <string name="keywords_display_auto_brightness" msgid="7162942396941827998">"atenuar pantalla, pantalla táctil, batería, brillo intelixente, brillo dinámico, brillo automático"</string>
+ <string name="keywords_display_auto_brightness" msgid="7162942396941827998">"atenuar pantalla, pantalla táctil, batería, brillo intelixente, brillo dinámico, brillo intelixente"</string>
<string name="keywords_display_adaptive_sleep" msgid="8003895686008403685">"atenuar pantalla, modo de suspensión, batería, tempo de espera, atención, visualización, pantalla, inactividade"</string>
<string name="keywords_auto_rotate" msgid="7914655570000378975">"xirar, voltear, xiro, retrato, orientación, horizontal, vertical"</string>
<string name="keywords_system_update_settings" msgid="5769003488814164931">"actualizar, actualización, Android"</string>
@@ -3483,9 +3483,9 @@
<string name="advanced_section_header" msgid="6003255455888626056">"Configuración avanzada"</string>
<string name="profile_section_header" msgid="4970209372372610799">"Notificacións do traballo"</string>
<string name="smart_notifications_title" msgid="8995288376897952015">"Notificacións intelixentes"</string>
- <string name="asst_capability_prioritizer_title" msgid="1181272430009156556">"Prioridade das notificacións automáticas"</string>
+ <string name="asst_capability_prioritizer_title" msgid="1181272430009156556">"Prioridade das notificacións intelixentes"</string>
<string name="asst_capability_prioritizer_summary" msgid="954988212366568737">"Define automaticamente como discretas as notificacións de prioridade baixa"</string>
- <string name="asst_capability_ranking_title" msgid="312998580233257581">"Clasificación automática das notificacións"</string>
+ <string name="asst_capability_ranking_title" msgid="312998580233257581">"Clasificación intelixente das notificacións"</string>
<string name="asst_capability_ranking_summary" msgid="2293524677144599450">"Clasifica as notificacións automaticamente por relevancia"</string>
<string name="asst_feedback_indicator_title" msgid="5169801869752395354">"Comentarios sobre notificacións intelixentes"</string>
<string name="asst_feedback_indicator_summary" msgid="5862082842073307900">"Indica axustes realizados nas notificacións e mostra a opción de enviar comentarios ao sistema"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Máximo de conxuntos de datos visibles"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Restablecer valores predeterminados"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Restablecéronse as opcións para programadores da función de autocompletar"</string>
+ <string name="location_category" msgid="3496759112306219062">"Localización"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador de localización da barra de estado"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostrar para todas as localizacións, como a rede e a conectividade"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forzar medicións completas de GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Realiza un seguimento de todas as frecuencias e constelacións de satélites de GNSS sen ciclos"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema do dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Predeterminado"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nome da rede"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pon en pausa as notificacións para concentrarte"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Función non dispoñible"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Desactivouse esta función porque fai que o teléfono vaia máis lento"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forzar medicións completas de GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Realiza un seguimento de todas as frecuencias e constelacións de satélites de GNSS sen ciclos"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Mostrar sempre o cadro de diálogo de fallos"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostra o cadro de diálogo cada vez que falla unha aplicación"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Seleccionar aplicación compatible con ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Coa función Chamadas por wifi podes facer e recibir chamadas a través de redes que non pertencen a ningún operador, como algunhas redes wifi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Chamadas"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"prefírense"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"prefírense as chamadas"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"prefírense as SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"non dispoñibles"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Sen SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferencias"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Conectarse a redes públicas"</string>
<string name="keywords_internet" msgid="7674082764898690310">"conexión de rede, Internet, sen fíos, datos, wifi, móbil, operador, 4G, 3G, 2G, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Non está dispoñible porque o modo hora de durmir está activado"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Completouse o restablecemento da importancia das notificacións."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplicacións"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un dispositivo non fiable quere acceder ás túas mensaxes. Toca para obter información."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Queres permitir o acceso ás mensaxes?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un dispositivo Bluetooth non fiable, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quere acceder ás túas mensaxes.\n\nNunca antes te conectaras a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un dispositivo non fiable quere acceder aos teus contactos e ao rexistro de chamadas. Toca para obter información."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Queres permitir o acceso aos contactos e ao rexistro de chamadas?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un dispositivo Bluetooth non fiable, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quere acceder aos teus contactos e ao rexistro de chamadas, incluídos os datos relacionados coas chamadas entrantes e saíntes.\n\nNunca antes te conectaras a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 04b323a..f6fed4e 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 સરનામા"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"સાચવેલા નેટવર્ક"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"સબ્સ્ક્રિપ્શન"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"અન્ય નેટવર્ક"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP સેટિંગ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"આ વપરાશકર્તા માટે વાઇ-ફાઇ વિગતવાર સેટિંગ્સ ઉપલબ્ધ નથી"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"સાચવો"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN કાઢી નાખો"</string>
<string name="menu_new" msgid="6571230342655509006">"નવું APN"</string>
<string name="menu_save" msgid="6611465355127483100">"સાચવો"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"નિકાળો"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"રદ કરો"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"નામ ફીલ્ડ ખાલી હોઈ શકતું નથી."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ખાલી હોઇ શકતું નથી."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ઍપ રીસેટ થઈ શકે છે"</string>
<string name="reset_network_title" msgid="1395494440355807616">"વાઇ-ફાઇ, મોબાઇલ અને બ્લૂટૂથ રીસેટ કરો"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"આ બધા નેટવર્ક સેટિંગ રીસેટ કરશે, જેમાં આનો સમાવેશ છે: \n\n"<li>"Wi‑Fi"</li>\n<li>"મોબાઇલ ડેટા"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"કાઢી નાખો"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ડાઉનલોડ કરેલાં સિમ કાઢી નખાશે"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"બદલીને લેવાના સિમ ડાઉનલોડ કરવા માટે, તમારા કૅરિઅરનો સંપર્ક કરો. આનાથી કોઈપણ મોબાઇલ સેવા પ્લાન રદ થશે નહીં."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"આનાથી કોઈપણ મોબાઇલ સેવા પ્લાન રદ થશે નહીં. બદલીના SIM કાર્ડ ડાઉનલોડ કરવા માટે, તમારા મોબાઇલ ઑપરેટરનો સંપર્ક કરો."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"સેટિંગ્સ ફરીથી સેટ કરો"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"બધાં નેટવર્ક સેટિંગ રીસેટ કરીએ? તમે આ ક્રિયા માટે કરેલો છેલ્લો ફેરફાર રદ કરી શકશો નહીં."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"બધા નેટવર્ક સેટિંગ રીસેટ કરીએ અને ડાઉનલોડ કરેલાં સિમ કાઢી નાખીએ? તમે આ ક્રિયા માટે કરેલો છેલ્લો ફેરફાર રદ કરી શકશો નહીં."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"સામાન્ય કરતાં વધુ ઉપયોગમાં લેવાયેલું ટૅબ્લેટ"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"સામાન્ય કરતાં વધુ ઉપયોગમાં લેવાયેલું ઉપકરણ"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"બૅટરી સામાન્ય કરતાં વહેલી સમાપ્ત થઈ શકે છે"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"બૅટરીની આવરદા વધારે છે"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"બૅટરીની ક્ષમતા વધારવા ઑપ્ટિમાઇઝ કરી રહ્યાં છીએ"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"બૅટરીનો વપરાશ હંગામી રૂપે મર્યાદિત છે. વધુ જાણવા માટે ટૅપ કરો."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"તમારો ફોન સામાન્ય કરતાં વધુ ઉપયોગમાં લેવાયો છે. તમારી બૅટરી અપેક્ષા કરતાં વહેલી ખલાસ થઈ શકે છે.\n\nબૅટરી વપરાશ અનુસાર ટોચની ઍપ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"તમારું ટૅબ્લેટ સામાન્ય કરતાં વધુ ઉપયોગમાં લેવાયું છે. તમારી બૅટરી અપેક્ષા કરતાં વહેલી ખલાસ થઈ શકે છે.\n\nબૅટરી વપરાશ અનુસાર ટોચની ઍપ:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"જોઈ શકાતા મહત્તમ ડેટાસેટની સંખ્યા"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ડિફૉલ્ટ મૂલ્યો પર રીસેટ કરો"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ઑટોમૅટિક રીતે ભરવાના ડેવલપરના વિકલ્પો રીસેટ કરવામાં આવ્યા છે"</string>
+ <string name="location_category" msgid="3496759112306219062">"સ્થાન"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"સ્ટેટસ બાર પર સ્થાન સૂચક"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"નેટવર્ક અને કનેક્ટિવિટી સહિત બધા સ્થાનો માટે બતાવો"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"સંપૂર્ણ GNSS માપને લાગુ કરો"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"કોઈપણ ડ્યૂટી-સાઈક્લિંગ વગર બધા GNSS તારામંડળો અને આવર્તનો ટ્રૅક કરો"</string>
<string name="device_theme" msgid="5027604586494772471">"ઉપકરણની થીમ"</string>
<string name="default_theme" msgid="4815428567082263639">"ડિફૉલ્ટ"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"નેટવર્કનું નામ"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ધ્યાન કેન્દ્રિત કરવા માટે નોટિફિકેશન થોભાવો"</string>
<string name="disabled_feature" msgid="7151433782819744211">"સુવિધા ઉપલબ્ધ નથી"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"આ સુવિધા બંધ કરવામાં આવી છે કારણ કે તે તમારા ફોનની કામ કરવાની ગતિ ધીમી કરે છે"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"સંપૂર્ણ GNSS માપને લાગુ કરો"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"કોઈપણ ડ્યૂટી-સાઈક્લિંગ વગર બધા GNSS તારામંડળો અને આવર્તનો ટ્રૅક કરો"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"હંમેશા ક્રૅશ સંવાદ બતાવો"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"જયારે પણ કોઈ ઍપ ક્રૅશ થાય ત્યારે સંવાદ બતાવો"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE દ્વારા ચાલુ ઍપ્લિકેશન પસંદ કરો"</string>
@@ -4896,14 +4899,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"સિમ કાર્ડ સક્રિય કરી શકાતું નથી"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"સિમ કાર્ડ કાઢી નાખો અને તેને ફરીથી દાખલ કરો. તેમ છતાં સમસ્યા આવે, તો તમારું ડિવાઇસ ફરી શરૂ કરો."</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"સિમ કાર્ડ ફરીથી ચાલુ કરવાનો પ્રયાસ કરો. તેમ છતાં સમસ્યા આવે, તો તમારું ડિવાઇસ ફરી શરૂ કરો."</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"નેટવર્કનું સક્રિયકરણ"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> સક્રિય છે"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"સિમના સેટિંગ અપડેટ કરવા માટે ટૅપ કરો"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"સિમ કાર્ડ"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"આ ડાઉનલોડ કરેલું સિમ કાઢી નાખીએ?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"આ સિમ કાઢી નાખવાથી આ ડિવાઇસમાંથી <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> સેવા કાઢી નાખવામાં આવશે.\n\n<xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> માટેની સેવા રદ નહીં થાય."</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"કાઢી નાખો"</string>
@@ -5056,14 +5055,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"અમુક વાઇ-ફાઇ નેટવર્ક જેમ કે મોબાઇલ ઑપરેટર વિનાના નેટવર્ક પરથી વાઇ-ફાઇ કૉલિંગની સેવા તમને કૉલ કરવાની અને મેળવવાની સુવિધા આપે છે."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"કૉલ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"પસંદ કરેલું"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"કૉલ માટે પસંદ કરેલું સિમ કાર્ડ"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS માટે પસંદ કરેલું સિમ કાર્ડ"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ઉપલબ્ધ નથી"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"કોઈ સિમ કાર્ડ નથી"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"પસંદગીઓ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"સાર્વજનિક નેટવર્ક સાથે કનેક્ટ કરો"</string>
<string name="keywords_internet" msgid="7674082764898690310">"નેટવર્ક કનેક્શન, ઇન્ટરનેટ, વાયરલેસ, ડેટા, વાઇ-ફાઇ, સેલ્યુલર, મોબાઇલ, સેલ, મોબાઇલ ઑપરેટર, 4G, 3G, 2G, LTE"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"એરપ્લેન મોડમાં ઉપયોગ માટે સુરક્ષિત નેટવર્ક જુઓ"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"એરપ્લેન મોડ બંધ કરો"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ઉપલબ્ધ નથી કારણ કે બેડટાઇમ મોડ ચાલુ છે"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"નોટિફિકેશનનું મહત્ત્વ રીસેટ કરવાની પ્રક્રિયા પૂર્ણ થઈ."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ઍપ"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"અવિશ્વસનીય ડિવાઇસ તમારા સંદેશા ઍક્સેસ કરવા માગે છે. વિગતો માટે ટૅપ કરો."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"સંદેશા ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"અવિશ્વસનીય બ્લૂટૂથ ડિવાઇસ, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], તમારા સંદેશા ઍક્સેસ કરવા માગે છે.\n\nતમે પહેલાં ક્યારેય [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] સાથે કનેક્ટ થયા નથી."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"અવિશ્વસનીય ડિવાઇસ તમારા સંપર્કો અને કૉલ લૉગ ઍક્સેસ કરવા માગે છે. વિગતો માટે ટૅપ કરો."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"સંપર્કો અને કૉલ લૉગ ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"અવિશ્વસનીય બ્લૂટૂથ ડિવાઇસ, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], તમારા સંપર્કો અને કૉલ લૉગ ઍક્સેસ કરવા માગે છે. આમાં ઇનકમિંગ અને આઉટગોઇંગ કૉલ વિશેનો ડેટા શામેલ છે.\n\nતમે પહેલાં ક્યારેય [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] સાથે કનેક્ટ થયા નથી."</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 6244b45..aca9822 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 पते"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"सेव किए गए नेटवर्क"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"सदस्यता"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"अन्य नेटवर्क"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"आईपी सेटिंग"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"वाई-फ़ाई की बेहतर सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"सेव करें"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN मिटाएं"</string>
<string name="menu_new" msgid="6571230342655509006">"नया APN"</string>
<string name="menu_save" msgid="6611465355127483100">"सेव करें"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"रद्द करें"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"रद्द करें"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"नाम फ़ील्ड खाली मत छोड़िए."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN खाली नहीं हो सकता."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ऐप्लिकेशन रीसेट किए जा सकते हैं"</string>
<string name="reset_network_title" msgid="1395494440355807616">"वाई-फ़ाई, मोबाइल और ब्लूटूथ रीसेट करें"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"इससे सभी नेटवर्क सेटिंग रीसेट हो जाएंगी, जिनमें ये भी शामिल हैं:\n\n"<li>"वाई-फ़ाई"</li>\n<li>"मोबाइल डेटा"</li>\n<li>"ब्लूटूथ"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"हमेशा के लिए मिटाएं"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"डाउनलोड किए गए सिम मिटाएं"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"दूसरा सिम डाउनलोड करने के लिए अपने मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें. इससे कोई भी मोबाइल सेवा प्लान रद्द नहीं होगा."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"इससे मोबाइल सेवा का कोई भी प्लान रद्द नहीं होगा. दूसरा सिम डाउनलोड करने के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"सेटिंग रीसेट करें"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"नेटवर्क की सभी सेटिंग रीसेट करें? आप इस कार्रवाई को पहले जैसा नहीं कर सकते."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"क्या आप नेटवर्क से जुड़ी सभी सेटिंग और डाउनलोड किए गए सिम रीसेट करना चाहते हैं? आप इस कार्रवाई को पहले जैसा नहीं कर सकते."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"टैबलेट को सामान्य से ज़्यादा इस्तेमाल किया गया"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"डिवाइस को सामान्य से ज़्यादा इस्तेमाल किया गया"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"हो सकता है कि बैटरी सामान्य समय से पहले खत्म हो जाए"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"बैटरी की परफ़ॉर्मेंस बेहतर बनाई जा रही है"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"बैटरी की परफ़ॉर्मेंस बेहतर करने के लिए, ऑप्टिमाइज़ किया जा रहा है"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"कुछ समय के लिए, बैटरी पूरी तरह से चार्ज नहीं होगी. ज़्यादा जानने के लिए टैप करें."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"आपका फ़ोन सामान्य से ज़्यादा इस्तेमाल किया गया है. आपके फ़ोन की बैटरी समय से पहले खत्म हो सकती है.\n\nसबसे ज़्यादा बैटरी इस्तेमाल करने वाले ऐप्लिकेशन:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"आपका टैबलेट सामान्य से ज़्यादा इस्तेमाल हुआ है. आपके टैबलेट की बैटरी समय से पहले खत्म हो सकती है.\n\nसबसे ज़्यादा बैटरी इस्तेमाल करने वाले ऐप्लिकेशन:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"दिखने वाले डेटा सेट की ज़्यादा से ज़्यादा संख्या"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"डिफ़ॉल्ट मान पर रीसेट करें"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"डेवलपर के लिए अपने आप भरने की सुविधा (ऑटो फ़िल) सेटिंग और टूल रीसेट हो गए हैं"</string>
+ <string name="location_category" msgid="3496759112306219062">"जगह"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"स्टेटस बार पर जगह की जानकारी दिखाने वाला संकेत"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"सभी जगह की जानकारी दिखाएं. इसके लिए, नेटवर्क और कनेक्टिविटी का भी इस्तेमाल करें"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"जीएनएसएस माप को हर हाल में लागू करें"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"बिना ड्यूटी-साइक्लिंग के जीएनएसएस के सभी तारामंडल (कॉन्स्टलेशन) और फ़्रीक्वेंसी ट्रैक करें"</string>
<string name="device_theme" msgid="5027604586494772471">"डिवाइस की थीम"</string>
<string name="default_theme" msgid="4815428567082263639">"डिफ़ॉल्ट"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"नेटवर्क का नाम"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ध्यान भटकने से रोकने के लिए डिवाइस की सूचनाओं को कुछ समय के लिए रोकें"</string>
<string name="disabled_feature" msgid="7151433782819744211">"सुविधा उपलब्ध नहीं है"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"यह सुविधा बंद कर दी गई है क्योंकि इससे आपका फ़ोन धीमा हो जाता है"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"जीएनएसएस माप को हर हाल में लागू करें"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"बिना ड्यूटी-साइक्लिंग के जीएनएसएस के सभी तारामंडल (कॉन्स्टलेशन) और फ़्रीक्वेंसी ट्रैक करें"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"क्रैश होने की सूचना हर बार दिखाएं"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"जब भी कोई ऐप्लिकेशन क्रैश हो, उसकी सूचना दिखाएं"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"कोण की सुविधा वाला ऐप्लिकेशन चुनें"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"वाई-फ़ाई कॉलिंग आपको ऐसे नेटवर्क से कॉल करने और उन पर कॉल पाने की सुविधा देती है जो सिम का इस्तेमाल नहीं करते, जैसे कुछ वाई-फ़ाई नेटवर्क."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"कॉल"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"मैसेज (एसएमएस)"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"इस सिम का इस्तेमाल किया जाए"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"कॉल के लिए इस सिम का इस्तेमाल किया जाए"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"मैसेज (एसएमएस) के लिए इस सिम का इस्तेमाल किया जाए"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"उपलब्ध नहीं है"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"कोई सिम कार्ड नहीं लगाया गया है"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"प्राथमिकताएं"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"सार्वजनिक नेटवर्क से कनेक्ट करें"</string>
<string name="keywords_internet" msgid="7674082764898690310">"नेटवर्क कनेक्शन, इंटरनेट, वायरलेस, डेटा, वाईफ़ाई, सेल्युलर, मोबाइल, मोबाइल और इंटरनेट सेवा देने वाली कंपनी, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"बेडटाइम मोड चालू होने पर यह सुविधा काम नहीं करती है"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"सूचनाओं की प्राथमिकता को रीसेट करने की प्रक्रिया पूरी हुई."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ऐप्लिकेशन"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"एक डिवाइस आपके मैसेज ऐक्सेस करना चाहता है, लेकिन इस डिवाइस पर भरोसा नहीं किया जा सकता. जानकारी के लिए टैप करें."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"क्या आप मैसेज का ऐक्सेस देना चाहते हैं?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"एक ब्लूटूथ डिवाइस, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], आपके मैसेज ऐक्सेस करना चाहता है, लेकिन इस डिवाइस पर भरोसा नहीं किया जा सकता.\n\nआपने इसे पहले कभी [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] से कनेक्ट नहीं किया है."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"एक डिवाइस, आपके संपर्क और कॉल लॉग ऐक्सेस करना चाहता है. जानकारी के लिए टैप करें."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"क्या आप अपने संपर्क और कॉल लॉग का ऐक्सेस देना चाहते हैं?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"एक ब्लूटूथ डिवाइस, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], आपके संपर्क और कॉल लॉग ऐक्सेस करना चाहता है, लेकिन इस डिवाइस पर भरोसा नहीं किया जा सकता. इसमें आपके किए गए कॉल (आउटगोइंग) और आने वाले कॉल (इनकमिंग) से जुड़ा डेटा भी शामिल है.\n\nआपने पहले कभी अपने [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] को इससे कनेक्ट नहीं किया है."</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index f42ca50..2f4fddc 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -1042,8 +1042,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 adrese"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Spremljene mreže"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Pretplate"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Ostale mreže"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP postavke"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Napredne postavke Wi‑Fi-ja nisu dostupne za ovog korisnika"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Spremi"</string>
@@ -1618,7 +1617,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Izbriši APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Novi APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Spremi"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Odbaci"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Odustani"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Polje naziva ne može biti prazno."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ne može biti prazan."</string>
@@ -1633,8 +1632,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikacije se mogu vratiti na zadano"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Poništi Wi-Fi, mobilnu mrežu i Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Ovime će se poništiti sve postavke mreže, uključujući:\n\n"<li>"Wi‑Fi"</li>\n<li>"mobilne podatke"</li>\n<li>"Bluetooth."</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Izbriši"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Izbriši preuzete SIM-ove"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Da biste preuzeli zamjenske SIM-ove, obratite se mobilnom operateru. Time se neće otkazati paketi mobilnih usluga."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Time se neće poništiti ugovori o mobilnim uslugama. Za preuzimanje zamjenskih SIM-ova obratite se mobilnom operateru."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Poništi postavke"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Želite li poništiti sve postavke mreže? Ta se radnja ne može poništiti."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Želite li vratiti sve postavke mreže na zadano i izbrisati preuzete SIM-ove? Ta se radnja ne može poništiti."</string>
@@ -2487,7 +2487,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet se upotrebljava više nego obično"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Uređaj se upotrebljava više nego obično"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baterija bi se mogla isprazniti brže nego obično"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Očuvanje zdravlja baterije"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimiziranje radi zdravlja baterije"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Baterija je privremeno ograničena. Dodirnite da biste saznali više."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Vaš se telefon upotrebljavao više nego obično. Baterija bi se mogla isprazniti brže nego što očekujete.\n\nAplikacije koje najviše troše bateriju:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Vaš se tablet upotrebljavao više nego obično. Baterija bi se mogla isprazniti brže nego što očekujete.\n\nAplikacije koje najviše troše bateriju:"</string>
@@ -4731,6 +4731,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimalan broj vidljivih skupova podataka"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Vrati na zadane vrijednosti"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Opcije automatskog popunjavanja za razvojne programere vraćene su na zadano"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokacija"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Pokazivač lokacije trake statusa"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Prikaži za sve lokacije, uključujući mrežu i povezivost"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Primijeni potpuna mjerenja GNSS-a"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Prati sve konstelacije i frekvencije GNSS-a bez određivanja radnog omjera"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema uređaja"</string>
<string name="default_theme" msgid="4815428567082263639">"Zadano"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Naziv mreže"</string>
@@ -4747,8 +4752,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pauzirajte obavijesti da biste ostali usredotočeni"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Značajka nije dostupna"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ta je značajka isključena jer usporava telefon"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Primijeni potpuna mjerenja GNSS-a"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Prati sve konstelacije i frekvencije GNSS-a bez određivanja radnog omjera"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Uvijek prikaži dijaloški okvir o rušenju"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Prikaži dijaloški okvir svaki put kada se aplikacija sruši"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Upotrijebite aplikaciju omogućenu za ANGLE"</string>
@@ -5135,6 +5138,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi pozivi omogućuju vam da upućujete i odgovarate na pozive putem mreža koje ne pripadaju mobilnom operateru, kao što su neke Wi-Fi mreže."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Pozivi"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferirano"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferiraju se pozivi"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferiraju se SMS-ovi"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nije dostupno"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nema SIM kartice"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Postavke"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Poveži se s javnim mrežama"</string>
<string name="keywords_internet" msgid="7674082764898690310">"mrežna veza, internet, bežično, podaci, wifi, wi-fi, wi fi, mobilno, mobilni uređaj, mobilni operater, 4 g, 3 g, 2 g, lte"</string>
@@ -5143,4 +5151,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nije dostupno jer je uključen način rada u vrijeme spavanja"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Dovršeno je vraćanje važnosti obavijesti na zadano."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikacije"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Nepouzdani uređaj želi pristupiti vašim porukama. Dodirnite da biste vidjeli pojedinosti."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Dopustiti pristup porukama?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Nepouzdani Bluetooth uređaj [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] želi pristupiti vašim porukama.\n\nDo sad se niste povezali s uređajem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Nepouzdani uređaj želi pristupiti vašim kontaktima i zapisniku poziva. Dodirnite da biste vidjeli pojedinosti."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Dopustiti pristup kontaktima i zapisniku poziva?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Nepouzdani Bluetooth uređaj [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] želi pristupiti vašim kontaktima i zapisniku poziva. To uključuje podatke o dolaznim i odlaznim pozivima.\n\nDo sad se niste povezali s uređajem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 958e62c..fdd2ced 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-címek"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Mentett hálózatok"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Előfizetések"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Egyéb hálózatok"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-beállítások"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"A speciális Wi-Fi-beállítások nem állnak rendelkezésre ennél a felhasználónál"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Mentés"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN törlése"</string>
<string name="menu_new" msgid="6571230342655509006">"Új APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Mentés"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Elvetés"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Mégse"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"A Név mező nem lehet üres."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Az APN nem lehet üres."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Az Alkalmazások alaphelyzetbe állítható"</string>
<string name="reset_network_title" msgid="1395494440355807616">"A Wi-Fi, a mobiladatok és a Bluetooth beállításainak visszaállítása"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Az összes hálózati beállítást visszaállítja, például a következőket:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobiladat"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Törlés"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Letöltött SIM-ek törlése"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Csere SIM letöltése érdekében forduljon szolgáltatójához. Ezzel nem szűnik meg egyetlen mobil-előfizetési csomag sem."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Ezzel nem szűnik meg egyetlen mobil-előfizetési csomag sem. Csere-SIM letöltése érdekében forduljon szolgáltatójához."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Beállítások visszaállítása"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Alaphelyzetbe állítja az összes hálózati beállítást? Ez a művelet nem vonható vissza."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Visszaállítja az összes hálózati beállítást, és törli a letöltött SIM-eket? Ez a művelet nem vonható vissza."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"A táblagépet többet használja a megszokottnál"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Az eszközt többet használja a megszokottnál"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Az akkumulátor a szokásosnál hamarabb lemerülhet"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Az akkumulátor élettartamának megőrzése"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Akkumulátor-élettartam optimalizálása"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Az akkumulátor ideiglenesen korlátozva. A részletekért koppintson."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"A telefont többet használta a megszokottnál. A vártnál hamarabb lemerülhet az akkumulátor.\n\nAz akkumulátort leginkább igénybe vevő alkalmazások:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"A táblagépet többet használta a megszokottnál. A vártnál hamarabb lemerülhet az akkumulátor.\n\nAz akkumulátort leginkább igénybe vevő alkalmazások:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maximális látható adatkészletek"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Alapértelmezett értékek visszaállítása"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Az automatikus kitöltésre vonatkozó fejlesztői beállítások vissza lettek állítva"</string>
+ <string name="location_category" msgid="3496759112306219062">"Hely"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Helyadathasználat jelzése az állapotsoron"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Megjelenítés minden helyadathasználat esetén (pl. hálózat és kapcsolódás)"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Teljes GNSS-mérés indítása"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Az összes GNSS-műhold és -frekvencia nyomon követése aktívciklus-szabályozás nélkül"</string>
<string name="device_theme" msgid="5027604586494772471">"Eszköztéma"</string>
<string name="default_theme" msgid="4815428567082263639">"Alapértelmezett"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Hálózat neve"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Az összpontosításhoz szüneteltetheti az értesítéseket"</string>
<string name="disabled_feature" msgid="7151433782819744211">"A funkció nem áll rendelkezésre"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"A rendszer kikapcsolta ezt a funkciót, mert lelassítja a telefont"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Teljes GNSS-mérés indítása"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Az összes GNSS-műhold és -frekvencia nyomon követése aktívciklus-szabályozás nélkül"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Összeomlási párbeszédablak megjelenítése minden alkalommal"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mindig megjeleníti a párbeszédablakot, amikor valamelyik alkalmazás összeomlik"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE-kompatibilis alkalmazás kiválasztása"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"A Wi-Fi-hívás funkció segítségével hívásokat indíthat és fogadhat nem szolgáltatói hálózatokon, így például bizonyos Wi-Fi-hálózatokon."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Hívások"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"előnyben részesített"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"hívások előnyben részesítése"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS-ek előnyben részesítése"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nem áll rendelkezésre"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM-kártya nélkül"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Beállítások"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Csatlakozás nyilvános hálózatokhoz"</string>
<string name="keywords_internet" msgid="7674082764898690310">"hálózati kapcsolat, internet, vezeték nélküli, mobiladat, adat, wifi, wi-fi, mobil, mobiltelefon, szolgáltató, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nem áll rendelkezésre, mert be van kapcsolva az alvásidő mód"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Értesítés fontosságának visszaállítása befejezve."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Alkalmazások"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Egy nem megbízható eszköz hozzá szeretne férni az Ön üzeneteihez. Koppintson a részletekért."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Engedélyezi az üzenetekhez való hozzáférést?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Egy nem megbízható Bluetooth-eszköz ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) hozzá szeretne férni az Ön üzeneteihez.\n\nEddig még nem csatlakozott a következő eszközhöz: [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Egy nem megbízható eszköz hozzá szeretne férni az Ön névjegyeihez és hívásnaplójához. Koppintson a részletekért."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Engedélyezi a névjegyeihez és a hívásnaplójához való hozzáférést?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Egy nem megbízható Bluetooth-eszköz ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) hozzá szeretne férni az Ön névjegyeihez és hívásnaplójához. Ide tartoznak a bejövő és kimenő hívások adatai is.\n\nEddig még nem csatlakozott a következő eszközhöz: [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 4369c12..de8669c 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 հասցեներ"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Պահված ցանցեր"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Բաժանորդագրումներ"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Այլ ցանցեր"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP կարգավորումներ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi-Fi-ի լրացուցիչ կարգավորումներն անհասանելի են այս օգտատիրոջը"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Պահել"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Ջնջել APN-ը"</string>
<string name="menu_new" msgid="6571230342655509006">"Նոր APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Պահել"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Հրաժարվել"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Չեղարկել"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Անվանման դաշտը պետք է լրացված լինի:"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN-ը չի կարող դատարկ լինել:"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Հավելվածների կարգավորումները կարելի է զրոյացնել"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Զրոյացնել Wi-Fi-ի, բջջային թրաֆիկի և Bluetooth-ի կարգավորումները"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Արդյունքում կզրոյացվեն բոլոր ցանցային կարգավորումները, ներառյալ հետևյալը՝\n\n"<li>"Wi‑Fi"</li>\n<li>"Բջջային ինտերնետ"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Ջնջել"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Ջնջել ներբեռնված SIM-երը"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Նոր SIM քարտ ներբեռնելու համար դիմեք ձեր օպերատորին։ Բջջային կապի սակագնային պլանները չեն չեղարկվի:"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Բջջային կապի սակագնային պլանները չեն չեղարկվի։ Նոր SIM քարտ ներբեռնելու համար դիմեք ձեր օպերատորին։"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Զրոյացնել կարգավորումները"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Զրոյացնե՞լ ցանցի բոլոր կարգավորումները: Այս գործողությունը հնարավոր չի լինի հետարկել:"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Զրոյացնե՞լ ցանցի բոլոր կարգավորումները և ջնջել ներբեռնված SIM քարտերի տվյալները։ Այս գործողությունը չեք կարող հետարկել:"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Պլանշետը սովորականից շատ է էներգիա օգտագործել"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Սարքը սովորականից շատ է էներգիա օգտագործել"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Մարտկոցի լիցքը կարող է սովորականից շուտ սպառվել"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Մարտկոցի ծառայության ժամկետի երկարացում"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Օպտիմալացում՝ մարտկոցի ծառայության ժամկետը երկարացնելու համար"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Մարտկոցը ժամանակավորապես սահմանափակված է։ Հպեք՝ ավելին իմանալու համար։"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Ձեր հեռախոսը սովորականից շատ է էներգիա օգտագործել։ Մարտկոցի լիցքը կարող է սպասվածից շուտ սպառվել։\n\nԱմենից շատ էներգիա սպառող հավելվածներն են՝"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Ձեր պլանշետը սովորականից շատ է էներգիա օգտագործել։ Մարտկոցի լիցքը կարող է սպասվածից շուտ սպառվել։\n\nԱմենից շատ էներգիա սպառող հավելվածներն են՝"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Տեսանելի տվյալակազմերի առավելագույն քանակը"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Վերականգնել կանխադրված արժեքները"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Ինքնալրացման կարգավորումները զրոյացվեցին"</string>
+ <string name="location_category" msgid="3496759112306219062">"Տեղադրություն"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Տեղադրության ցուցիչ կարգավիճակի գոտում"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Ցուցադրել բոլոր վայրերի համար (ներառյալ ցանցի ու կապակցման միջոցով որոշվողները)"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS-ի չափումների ամբողջական բեռնում"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Հետագծել GNSS-ի բոլոր սխեմաներն ու հաճախականությունները՝ առանց աշխատաշրջանի"</string>
<string name="device_theme" msgid="5027604586494772471">"Սարքի թեման"</string>
<string name="default_theme" msgid="4815428567082263639">"Կանխադրված"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Ցանցի անունը"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Չցուցադրել շեղող ծանուցումները"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Գործառույթն անհասանելի է"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Այս գործառույթն անջատվել է, քանի որ այն դանդաղեցնում էր ձեր հեռախոսի աշխատանքը"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS-ի չափումների ամբողջական բեռնում"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Հետագծել GNSS-ի բոլոր սխեմաներն ու հաճախականությունները՝ առանց աշխատաշրջանի"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Միշտ ցույց տալ խափանման մասին ծանուցումը"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Ցույց տալ ծանուցումը հավելվածի խափանման դեպքում"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Ընտրեք ANGLE-ի աջակցմամբ հավելված"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"«Զանգեր Wi-Fi-ով» գործառույթը թույլ է տալիս ստանալ և կատարել զանգերը ոչ բջջային ցանցերի (օրինակ՝ որոշ Wi‑Fi ցանցերի) միջոցով։"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Զանգեր"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"նախընտրելի"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"նախընտրելի զանգեր"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"նախընտրելի SMS-ներ"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"անհասանելի է"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM քարտ չկա"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Կարգավորումներ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Միանալ հանրային ցանցերին"</string>
<string name="keywords_internet" msgid="7674082764898690310">"կապ, համացանց, անլար, ինտերնետ, wifi, wi-fi, wi fi, բջջային, շարժական, բջջային օպերատոր, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Անհասանելի է, քանի որ քնի ռեժիմը միացված է"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ծանուցումների կարևորության կարգավորումները զրոյացվեցին։"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Հավելվածներ"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Մի ոչ վստահելի սարք ուզում է հասանելիություն ստանալ ձեր հաղորդագրություններին։ Հպեք՝ ավելին իմանալու համար։"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Հասանելի դարձնե՞լ հաղորդագրությունները"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"[<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] սարքը, որը ոչ վստահելի Bluetooth սարք է, ուզում է հասանելիություն ստանալ ձեր հաղորդագրություններին։\n\nԴուք նախկինում չեք միացել [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] սարքին։"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Մի ոչ վստահելի սարք ուզում է հասանելիություն ստանալ ձեր կոնտակտներին և զանգերի մատյանին։ Հպեք՝ ավելին իմանալու համար։"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Հասանելի դարձնե՞լ կոնտակտներն ու զանգերի մատյանը"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"[<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] սարքը, որը ոչ վստահելի Bluetooth սարք է, ուզում է հասանելիություն ստանալ ձեր կոնտակտներին և զանգերի մատյանին, որը ներառում է մուտքային և ելքային զանգերի մասին տվյալներ։\n\nԴուք նախկինում չեք միացել [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] սարքին։"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index fdaf2c3..27e096e 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Alamat IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Jaringan tersimpan"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Langganan"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Jaringan lain"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Setelan IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Setelan lanjutan Wi-Fi tidak tersedia untuk pengguna ini"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Simpan"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Hapus APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN baru"</string>
<string name="menu_save" msgid="6611465355127483100">"Simpan"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Buang"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Batal"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Bidang Nama wajib diisi."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN wajib diisi."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikasi dapat direset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reset Wi-Fi, data seluler & Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Tindakan ini akan mereset semua setelan jaringan, termasuk:\n\n"<li>"Wi‑Fi"</li>\n<li>"Data seluler"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Hapus"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Hapus SIM hasil download"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Untuk mendownload SIM pengganti, hubungi operator Anda. Tindakan ini tidak akan membatalkan paket pembelian layanan seluler apa pun."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Tindakan ini tidak akan membatalkan paket pembelian seluler apa pun. Untuk mendownload SIM pengganti, hubungi operator Anda."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reset setelan"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Reset semua setelan jaringan? Anda tidak dapat mengurungkan tindakan ini."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reset semua setelan jaringan dan hapus SIM yang didownload? Anda tidak dapat mengurungkan tindakan ini."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet digunakan lebih lama dari biasanya"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Perangkat digunakan lebih lama dari biasanya"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baterai mungkin lebih cepat habis daripada biasanya"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Mempertahankan kesehatan baterai"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Mengoptimalkan untuk kesehatan baterai"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Daya baterai terbatas untuk sementara. Ketuk untuk mempelajari lebih lanjut."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Ponsel dipakai lebih lama dari biasanya. Baterai mungkin lebih cepat habis dari perkiraan.\n\nAplikasi yang paling banyak menggunakan baterai:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablet digunakan lebih sering dari biasanya. Baterai mungkin lebih cepat habis dari yang diperkirakan.\n\nAplikasi yang paling banyak menggunakan baterai:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Jumlah set data maks yang terlihat"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reset ke nilai default"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Opsi developer IsiOtomatis telah direset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokasi"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Status bar indikator lokasi"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Tampilkan untuk semua lokasi, termasuk jaringan dan konektivitas"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Paksa ukuran GNSS penuh"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Lacak semua konstelasi dan frekuensi GNSS tanpa siklus tugas"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema perangkat"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nama jaringan"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Jeda notifikasi agar tetap fokus"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Fitur tidak tersedia"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Fitur ini telah dinonaktifkan karena memperlambat ponsel Anda"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Paksa ukuran GNSS penuh"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Lacak semua konstelasi dan frekuensi GNSS tanpa siklus tugas"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Selalu tampilkan dialog error"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Tampilkan dialog setiap kali aplikasi tidak bekerja"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Pilih aplikasi yang berkemampuan ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Dengan Panggilan Wi-Fi, Anda dapat melakukan dan menerima panggilan melalui jaringan non-operator seperti jaringan Wi-Fi tertentu."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Panggilan Telepon"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"pilihan"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"panggilan pilihan"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS pilihan"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"tidak tersedia"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Tidak ada SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferensi"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Hubungkan ke jaringan publik"</string>
<string name="keywords_internet" msgid="7674082764898690310">"koneksi jaringan, internet, nirkabel, data, wifi, wi-fi, wi fi, seluler, (perangkat) seluler, operator seluler, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Tidak tersedia karena mode waktu tidur diaktifkan"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reset nilai penting notifikasi selesai."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikasi"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Perangkat tidak tepercaya ingin mengakses pesan Anda. Ketuk untuk melihat detailnya."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Izinkan akses ke pesan?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Perangkat Bluetooth yang tidak tepercaya, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ingin mengakses pesan Anda.\n\nAnda belum pernah terhubung ke [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] sebelumnya."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Perangkat yang tidak tepercaya ingin mengakses kontak dan log panggilan Anda. Ketuk untuk melihat detailnya."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Izinkan akses ke kontak dan log panggilan?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Perangkat Bluetooth yang tidak tepercaya, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ingin mengakses kontak dan log panggilan Anda. Ini mencakup data tentang panggilan masuk dan keluar.\n\nAnda belum pernah terhubung ke [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] sebelumnya."</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index aec7cd1..ba88954 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-tölur"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Vistuð net"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Áskriftir"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Önnur netkerfi"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-stillingar"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Ítarlegar Wi‑Fi stillingar eru ekki í boði fyrir þennan notanda"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Vista"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Eyða aðgangsstað"</string>
<string name="menu_new" msgid="6571230342655509006">"Nýr aðgangsstaður"</string>
<string name="menu_save" msgid="6611465355127483100">"Vista"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Fleygja"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Hætta við"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Reiturinn fyrir heiti má ekki vera auður."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Heiti aðgangsstaðar má ekki vera autt."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Hægt er að endurstilla forrit"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Endurstilla Wi-Fi, farsímagögn og Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Þetta mun endurstilla allar netkerfisstillingar, þar á meðal:\n\n"<li>"Wi‑Fi"</li>\n<li>"Farsímagögn"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Eyða"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Eyða sóttum SIM-kortum"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Til að sækja ný SIM-kort þarftu að hafa samband við símafyrirtækið þitt. Þetta segir ekki upp neinni áskrift hjá símafyrirtæki."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Þetta segir ekki upp neinni áskrift hjá símafyrirtæki. Til að sækja ný SIM-kort þarftu að hafa samband við símafyrirtækið þitt."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Endurstilla"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Endurstilla allar netstillingar? Ekki er hægt að afturkalla þessa aðgerð."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Viltu endurstilla allar netstillingar og hreinsa sótt SIM? Ekki er hægt að afturkalla þessa aðgerð."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Spjaldtölva notuð meira en venjulega"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Tæki notað meira en venjulega"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Rafhlaðan gæti tæmst fyrr en venjulega"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Stuðlar að rafhlöðuendingu"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Fínstillir fyrir rafhlöðuendingu"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Rafhlaða takmörkuð tímabundið. Ýttu til að fá frekari upplýsingar."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Síminn hefur verið notaður meira en venjulega. Rafhlaðan gæti tæmst fyrr en ella.\n\nForrit með mestu rafhlöðunotkunina:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Spjaldtölvan hefur verið notuð meira en venjulega. Rafhlaðan gæti tæmst fyrr en ella.\n\nForrit með mestu rafhlöðunotkunina:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Hámark sýnilegra gagnasafna"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Endurstilla á sjálfgildi"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Forritunarkostir sjálfvirkrar endurstillingar hafa verið endurstilltir"</string>
+ <string name="location_category" msgid="3496759112306219062">"Staðsetning"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Staðsetningarvísir stöðustiku"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Birta fyrir allar staðsetningar, þ. á m. netkerfi og tengigetu"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Full GNSS-mæling"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Rekja öll GNSS söfn og tíðnir með engum vinnulotum"</string>
<string name="device_theme" msgid="5027604586494772471">"Þema tækisins"</string>
<string name="default_theme" msgid="4815428567082263639">"Sjálfgefið"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Heiti nets"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Gera hlé á tilkynningum svo þær trufli ekki"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Eiginleikinn er ekki í boði"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Slökkt hefur verið á þessum eiginleika því hann hægir á símanum"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Full GNSS-mæling"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Rekja öll GNSS söfn og tíðnir með engum vinnulotum"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Sýna alltaf hrunglugga"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Sýna glugga í hvert sinn sem forrit hrynur"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Velja forrit sem styður ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Með Wi-Fi símtölum geturðu hringt og svarað símtölum utan farsímakerfis, t.d. á sumum Wi-Fi netum."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Símtöl"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"í forgangi"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"símtöl í forgangi"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS í forgangi"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ekki tiltækt"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Ekkert SIM-kort"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Kjörstillingar"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Tengjast opnum netum"</string>
<string name="keywords_internet" msgid="7674082764898690310">"nettenging, internetið, þráðlaust, gögn, wifi, wi-fi, wi fi, farsímakerfi, farsími, símafyrirtæki, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Ekki í boði vegna þess að kveikt er á háttatímastillingu"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Endurstilling forgangs tilkynninga tókst."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Forrit"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Ótraust tæki vill fá aðgang að skilaboðunum þínum. Ýttu til að fá frekari upplýsingar."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Leyfa aðgang að skilaboðum?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Ótraust Bluetooth-tæki, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vill fá aðgang að skilaboðunum þínum.\n\nÞú hefur ekki tengst [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] áður."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Ótraust tæki vill fá aðgang að tengiliðunum þínum og símtalaskránni. Ýttu til að fá frekari upplýsingar."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Leyfa aðgang að tengiliðum og símtalaskrá?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Ótraust Bluetooth-tæki, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vill fá aðgang að tengiliðum þínum og símtalaskrá. Þetta felur í sér gögn um móttekin og hringd símtöl.\n\nÞú hefur ekki tengst [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] áður."</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7377068..5e08e69 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Indirizzi IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Reti salvate"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Iscrizioni"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Altre reti"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Impostazioni IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Le impostazioni Wi‑Fi avanzate non sono disponibili per questo utente"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Salva"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Elimina APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nuovo APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Salva"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Ignora"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Annulla"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Il campo Nome non può essere vuoto."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Il campo APN non può essere vuoto."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Le app possono essere reimpostate"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Reimposta Wi-Fi, dati mobili e Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Verranno reimpostate tutte le impostazioni di rete, tra cui:\n\n"<li>"Wi‑Fi"</li>\n<li>"Dati mobili"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Resetta"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Cancella SIM scaricate"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Per scaricare le SIM sostitutive, contatta il tuo operatore. Ciò non annullerà alcun piano di servizio mobile."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Gli eventuali piani di servizio mobile non verranno annullati. Per scaricare SIM sostitutive, contatta il tuo operatore."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Reimposta"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Ripristinare tutte le impostazioni della rete? Questa azione non può essere annullata."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Reimpostare tutte le impostazioni di rete e resettare tutte le SIM scaricate? Questa azione non può essere annullata."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet utilizzato più del solito"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Dispositivo usato più del solito"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"La batteria potrebbe esaurirsi prima del solito"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Preservare l\'integrità della batteria"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Ottimizzazione per integrità batteria"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batteria momentaneamente limitata. Tocca per scoprire di più."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Hai utilizzato il telefono più del solito. La batteria potrebbe esaurirsi prima del previsto.\n\nApp con il maggior consumo di batteria:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Hai utilizzato il tablet più del solito. La batteria potrebbe esaurirsi prima del previsto.\n\nApp con il maggiore consumo di batteria:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Set di dati visibili massimi"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Reimposta i valori predefiniti"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Le opzioni di compilazione automatica per gli sviluppatori sono state reimpostate"</string>
+ <string name="location_category" msgid="3496759112306219062">"Posizione"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicatore di posizione nella barra di stato"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostra per tutte le posizioni, incluse quelle rilevate tramite rete e connettività"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forza esecuzione completa delle misurazioni GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Monitora tutte le costellazioni e le frequenze GNSS senza ciclo di lavoro utile"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema del dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Valore predefinito"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nome della rete"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Metti in pausa le notifiche per mantenere la concentrazione"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funzionalità non disponibile"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Questa funzionalità è stata disattivata perché rallenta il telefono"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forza esecuzione completa delle misurazioni GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Monitora tutte le costellazioni e le frequenze GNSS senza ciclo di lavoro utile"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Mostra sempre finestra di dialogo di arresti anomali"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostra finestra di dialogo a ogni arresto anomalo delle app"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Seleziona le app che supportano ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"La funzionalità Chiamate Wi-Fi consente di effettuare e ricevere chiamate tramite reti non dell\'operatore, come alcune reti Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Chiamate"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"Preferiti"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"Chiamate preferite"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS preferiti"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"Non disponibili"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nessuna SIM rilevata"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferenze"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Connetti a reti pubbliche"</string>
<string name="keywords_internet" msgid="7674082764898690310">"connessione rete, internet, wireless, dati, wifi, wi-fi, wi fi, cellulare, dispositivo mobile, operatore cellulare, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Non disponibili perché la modalità Riposo è attiva"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reimpostazione dell\'importanza delle notifiche completata."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"App"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un dispositivo non attendibile richiede l\'accesso ai tuoi messaggi. Tocca per conoscere i dettagli."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vuoi consentire l\'accesso ai messaggi?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un dispositivo Bluetooth non attendibile, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], richiede l\'accesso ai tuoi messaggi.\n\nNon hai mai effettuato la connessione al dispositivo [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un dispositivo non attendibile richiede l\'accesso ai tuoi contatti e al tuo registro chiamate. Tocca per conoscere i dettagli."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vuoi consentire l\'accesso a contatti e registro chiamate?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un dispositivo Bluetooth non attendibile, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], richiede l\'accesso ai tuoi contatti e al tuo registro chiamate, inclusi i dati relativi a chiamate in arrivo e in uscita.\n\nNon hai mai effettuato la connessione al dispositivo [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index a2b8d9b..2421999 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"כתובות IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"רשתות שנשמרו"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"מינויים"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"רשתות אחרות"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"הגדרות IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"הגדרות Wi-Fi מתקדמות אינן זמינות למשתמש הזה"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"שמירה"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"מחיקת APN"</string>
<string name="menu_new" msgid="6571230342655509006">"הוספת APN חדש"</string>
<string name="menu_save" msgid="6611465355127483100">"שמירה"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"מחיקה"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ביטול"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"השדה \'שם\' לא יכול להיות ריק."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"ה-APN לא יכול להיות ריק."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"אפשר לאפס את האפליקציות"</string>
<string name="reset_network_title" msgid="1395494440355807616">"איפוס ההגדרות של Wi-Fi, חבילת גלישה ו-Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"פעולה זו תאפס את כל הגדרות הרשת, כולל:\n\n"<li>"Wi‑Fi"</li>\n<li>"חבילת גלישה"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"מחיקה"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"מחיקת כרטיסי SIM שהורדת"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"כדי להוריד כרטיסי SIM חלופיים יש לפנות אל הספק. הפעולה הזו לא תבטל חבילות גלישה קיימות."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"פעולה זו לא תבטל אף אחריות מורחבת בתשלום. כדי להוריד כרטיסי SIM חלופיים, יש לפנות לספק חבילת הסלולר."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"איפוס הגדרות"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"לאפס את כל הגדרות הרשת? לא ניתן לבטל את הפעולה הזו."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"לאפס את כל הגדרות הרשת ולמחוק את כרטיסי ה-SIM שהורדת? לא ניתן לבטל את הפעולה הזו."</string>
@@ -1694,8 +1694,8 @@
<string name="tether_settings_title_wifi" msgid="4327056146425282159">"נקודה לשיתוף אינטרנט"</string>
<string name="tether_settings_title_bluetooth" msgid="8878813702520141084">"שיתוף אינטרנט דרך Bluetooth"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="4437274151658505496">"שיתוף אינטרנט בין ניידים"</string>
- <string name="tether_settings_title_all" msgid="6807525590937697228">"נקודה לשיתוף אינטרנט ושיתוף אינטרנט בין ניידים"</string>
- <string name="tether_settings_summary_hotspot_on_tether_on" msgid="6110241048260139633">"נקודה לשיתוף אינטרנט פועלת, שיתוף אינטרנט בין ניידים"</string>
+ <string name="tether_settings_title_all" msgid="6807525590937697228">"שיתוף אינטרנט (hotspot ו-tethering)"</string>
+ <string name="tether_settings_summary_hotspot_on_tether_on" msgid="6110241048260139633">"שיתוף האינטרנט פועל (hotspot ו-tethering)"</string>
<string name="tether_settings_summary_hotspot_on_tether_off" msgid="5057598961245943644">"נקודה לשיתוף אינטרנט פועלת"</string>
<string name="tether_settings_summary_hotspot_off_tether_on" msgid="7181518138494995888">"שיתוף אינטרנט"</string>
<string name="tether_settings_disabled_on_data_saver" msgid="9054069463426952689">"לא ניתן לשתף אינטרנט בין ניידים או להשתמש בנקודה ניידת לשיתוף אינטרנט כשחוסך הנתונים (Data Saver) פועל."</string>
@@ -1726,7 +1726,7 @@
<string name="disable_wifi_hotspot_when_usb_and_bluetooth_and_ethernet_on" msgid="3934609816834760008">"שיתוף אינטרנט רק באמצעות USB, Bluetooth ו-Ethernet"</string>
<string name="usb_title" msgid="1157283449840612901">"USB"</string>
<string name="usb_tethering_button_text" msgid="7364633823180913777">"שיתוף אינטרנט דרך USB"</string>
- <string name="usb_tethering_subtext" product="default" msgid="3168636595109044213">"שיתוף בחיבור לאינטרנט של הטלפון דרך USB"</string>
+ <string name="usb_tethering_subtext" product="default" msgid="3168636595109044213">"שיתוף האינטרנט של הטלפון דרך USB"</string>
<string name="usb_tethering_subtext" product="tablet" msgid="1749659335004856576">"שיתוף בחיבור לאינטרנט של הטאבלט דרך USB"</string>
<string name="bluetooth_tether_checkbox_text" msgid="6108398414967813545">"שיתוף אינטרנט דרך Bluetooth"</string>
<string name="bluetooth_tethering_subtext" product="tablet" msgid="2023654677593885805">"שיתוף החיבור לאינטרנט של הטאבלט דרך Bluetooth"</string>
@@ -1734,10 +1734,10 @@
<string name="bluetooth_tethering_off_subtext_config" msgid="6941934844527406581">"החיבור לאינטרנט של <xliff:g id="DEVICE_NAME">%1$d</xliff:g> זה משותף דרך Bluetooth"</string>
<string name="bluetooth_tethering_overflow_error" msgid="5292358672240161566">"לא ניתן לשתף אינטרנט בין למעלה מ-<xliff:g id="MAXCONNECTION">%1$d</xliff:g> מכשירים."</string>
<string name="bluetooth_untether_blank" msgid="5087548945727762308">"קשירת <xliff:g id="DEVICE_NAME">%1$s</xliff:g> תבוטל."</string>
- <string name="ethernet_tether_checkbox_text" msgid="959743110824197356">"שיתוף אינטרנט עם Ethernet"</string>
+ <string name="ethernet_tether_checkbox_text" msgid="959743110824197356">"שיתוף אינטרנט דרך Ethernet"</string>
<string name="ethernet_tethering_subtext" product="default" msgid="5998100693350351694">"שיתוף החיבור לאינטרנט של הטלפון דרך Ethernet"</string>
<string name="tethering_footer_info" msgid="6782375845587483281">"אפשר להשתמש בנקודה לשיתוף אינטרנט ובשיתוף אינטרנט בין ניידים כדי לאפשר למכשירים אחרים להתחבר לאינטרנט דרך חבילת הגלישה שלך. ניתן גם להשתמש באפליקציות כדי ליצור נקודה לשיתוף אינטרנט ולשתף תכנים בין מכשירים שנמצאים בקרבת מקום."</string>
- <string name="tethering_footer_info_sta_ap_concurrency" msgid="2079039077487477676">"ניתן להשתמש בנקודה לשיתוף אינטרנט ובשיתוף אינטרנט בין מכשירים כדי לאפשר למכשירים אחרים להתחבר לאינטרנט דרך ה-Wi-Fi או דרך חבילת הגלישה שלך. ניתן גם להשתמש באפליקציות כדי ליצור נקודה לשיתוף אינטרנט ולשתף תכנים בין מכשירים שנמצאים בקרבת מקום."</string>
+ <string name="tethering_footer_info_sta_ap_concurrency" msgid="2079039077487477676">"נקודה לשיתוף אינטרנט (Hotspot) ושיתוף אינטרנט בין מכשירים (tethering) מאפשרים למכשירים אחרים להתחבר לאינטרנט דרך Wi-Fi או דרך חבילת הגלישה שלך. יש גם אפליקציות שמאפשרות ליצור נקודה לשיתוף אינטרנט ולשתף תכנים עם מכשירים קרובים."</string>
<string name="tethering_help_button_text" msgid="2823655011510912001">"עזרה"</string>
<string name="network_settings_title" msgid="4663717899931613176">"רשתות סלולריות"</string>
<string name="manage_mobile_plan_title" msgid="5616930513733409064">"תכנית לנייד"</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"הטאבלט נמצא בשימוש יותר מהרגיל"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"המכשיר נמצא בשימוש יותר מהרגיל"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ייתכן שהסוללה תתרוקן מוקדם מהרגיל"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"שמירה על תקינות הסוללה"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"מופעלת אופטימיזציה לשמירה על תקינות הסוללה"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"הסוללה מוגבלת באופן זמני. למידע נוסף יש להקיש."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"השתמשת בטלפון יותר מהרגיל. ייתכן שהסוללה תתרוקן מוקדם מהצפוי.\n\nהאפליקציות המובילות לפי שימוש בסוללה:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"השתמשת בטאבלט יותר מהרגיל. ייתכן שהסוללה תתרוקן מוקדם מהצפוי.\n\nהאפליקציות המובילות לפי שימוש בסוללה:"</string>
@@ -3653,7 +3653,7 @@
<string name="lock_screen_notifications_interstitial_message_profile" msgid="1456262034599029028">"איך להציג התראות פרופיל כשהמכשיר נעול?"</string>
<string name="lock_screen_notifications_interstitial_title_profile" msgid="6950124772255324448">"התראות פרופיל"</string>
<string name="notifications_title" msgid="4221655533193721131">"התראות"</string>
- <string name="app_notifications_title" msgid="248374669037385148">"התראות אפליקציה"</string>
+ <string name="app_notifications_title" msgid="248374669037385148">"התראות של האפליקציה"</string>
<string name="notification_channel_title" msgid="8859880871692797611">"קטגוריית התראות"</string>
<string name="notification_group_title" msgid="7525666535695631538">"קבוצת קטגוריות של התראות"</string>
<string name="notification_importance_title" msgid="1545158655988342703">"התנהגות"</string>
@@ -4367,7 +4367,7 @@
<string name="condition_turn_on" msgid="3911077299444314791">"הפעלה"</string>
<string name="condition_expand_show" msgid="1501084007540953213">"הצג"</string>
<string name="condition_expand_hide" msgid="8347564076209121058">"הסתר"</string>
- <string name="condition_hotspot_title" msgid="7903918338790641071">"הנקודה לשיתוף אינטרנט פעילה"</string>
+ <string name="condition_hotspot_title" msgid="7903918338790641071">"נקודת ה-hotspot פעילה"</string>
<string name="condition_airplane_title" msgid="5847967403687381705">"מצב טיסה מופעל"</string>
<string name="condition_airplane_summary" msgid="1964500689287879888">"הרשתות לא זמינות"</string>
<string name="condition_zen_title" msgid="7674761111934567490">"מצב \'נא לא להפריע\' מופעל"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"מקסימום מערכי נתונים גלויים"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"איפוס לערכי ברירת המחדל"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"האפשרויות למפתחים למילוי האוטומטי אופסו"</string>
+ <string name="location_category" msgid="3496759112306219062">"מיקום"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"אינדיקטור מיקום של שורת סטטוס"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"הצגת כל המיקומים, כולל רשת וקישוריות"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"אילוץ של הרצה מלאה של מדידות Gnss"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"מעקב אחר כל מערכות הניווט והתדרים של GNSS ללא מחזור פעילות"</string>
<string name="device_theme" msgid="5027604586494772471">"עיצוב המכשיר"</string>
<string name="default_theme" msgid="4815428567082263639">"ברירת מחדל"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"שם הרשת"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"אפשר להשהות את ההתראות כדי שלא יפריעו לך"</string>
<string name="disabled_feature" msgid="7151433782819744211">"התכונה לא זמינה"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"התכונה הזו הושבתה מפני שהיא מאטה את הטלפון שלך"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"אילוץ של הרצה מלאה של מדידות Gnss"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"מעקב אחר כל מערכות הניווט והתדרים של GNSS ללא מחזור פעילות"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"הצג תמיד דו-שיח של קריסות מחשב"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"הצג דו-שיח בכל פעם שאפליקציה קורסת"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"בחירת אפליקציה המותאמת ל-ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"התכונה שיחות Wi-Fi מאפשרת להתקשר ולקבל שיחות באמצעות רשתות שאינן רשתות הספקים, כמו רשתות Wi‑Fi מסוימות."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"שיחות"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"מועדפות"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"שיחות מועדפות"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"הודעות SMS מועדפות"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"לא זמין"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"אין כרטיס SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"העדפות"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"חיבור לרשתות ציבוריות"</string>
<string name="keywords_internet" msgid="7674082764898690310">"חיבור לרשת, אינטרנט, אלחוטי, נתונים, Wi-Fi, wi-fi, wi fi, סלולרי, נייד, ספק סלולרי, 4g, 3g, 2g, lte"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"אינו זמין כאשר מצב שינה מופעל"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"הושלם איפוס הגדרת החשיבות של ההתראות."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"אפליקציות"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"מכשיר לא מהימן מבקש לקבל גישה להודעות. יש להקיש לקבלת פרטים."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"להעניק גישה להודעות?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"מכשיר Bluetooth לא מהימן, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], מבקש גישה להודעות.\n\nלא התחברת בעבר למכשיר [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"מכשיר לא מהימן מבקש גישה לאנשי הקשר וליומן השיחות. יש להקיש לקבלת פרטים."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"להעניק גישה לאנשי הקשר וליומן השיחות?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"מכשיר Bluetooth לא מהימן, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], מבקש גישה לאנשי הקשר וליומן השיחות. הגישה תכלול גם נתונים על שיחות נכנסות ויוצאות.\n\nלא התחברת בעבר למכשיר [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 5188a5f..b4eb687 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 アドレス"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"保存済みネットワーク"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"サブスクリプション"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"その他のネットワーク"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP 設定"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"このユーザーは Wi‑Fi 詳細設定を利用できません"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"保存"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APNを削除"</string>
<string name="menu_new" msgid="6571230342655509006">"新しい APN"</string>
<string name="menu_save" msgid="6611465355127483100">"保存"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"破棄"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"キャンセル"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"[名前]フィールドは必須です。"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APNは必ず指定してください。"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"アプリをリセットできます"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi、モバイル、Bluetooth をリセット"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"以下を含む、すべてのネットワーク設定がリセットされます。\n\n"<li>"Wi‑Fi"</li>\n<li>"モバイルデータ"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"消去"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ダウンロードされた eSIM の消去"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"別の eSIM をダウンロードするには、携帯通信会社にお問い合わせください。この操作でモバイルのサービスプランが解約されることはありません。"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"この操作でモバイルのサービスプランが解約されることはありません。交換用 SIM のダウンロードについては、携帯通信会社にお問い合わせください。"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"設定をリセット"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"すべてのネットワーク設定をリセットしますか?この操作を取り消すことはできません。"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"すべてのネットワーク設定をリセットして、ダウンロードされた eSIM を消去しますか?この操作を取り消すことはできません。"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"タブレットの電池使用量が通常より多くなっています"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"デバイスの電池使用量が通常より多くなっています"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"電池が通常より早くなくなる可能性があります"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"電池の状態を維持する"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"電池の状態を最適化"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"電池の使用が一時的に制限されています。タップして詳細をご確認ください。"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"スマートフォンの電池使用量が通常より多いため、予想より早く電池がなくなる可能性があります。\n\n電池を多く使用しているアプリ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"タブレットの電池使用量が通常より多いため、予想より早く電池がなくなる可能性があります。\n\n電池を多く使用しているアプリ:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"表示するデータセットの最大数"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"デフォルト値にリセット"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"自動入力の開発者向けオプションをリセットしました"</string>
+ <string name="location_category" msgid="3496759112306219062">"場所"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"ステータスバーの場所インジケーター"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ネットワークや接続を含め、すべての場所で表示されます"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS 計測の完全な実行"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"デューティ サイクリングを無効にした状態で、すべての GNSS コンステレーションと頻度をトラッキングします"</string>
<string name="device_theme" msgid="5027604586494772471">"デバイスのテーマ"</string>
<string name="default_theme" msgid="4815428567082263639">"デフォルト"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ネットワーク名"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"集中するために通知を一時停止する"</string>
<string name="disabled_feature" msgid="7151433782819744211">"この機能はご利用いただけません"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"この機能はスマートフォンのパフォーマンスを低下させるため OFF になっています"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS 計測の完全な実行"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"デューティ サイクリングを無効にした状態で、すべての GNSS コンステレーションと頻度をトラッキングします"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"クラッシュ ダイアログを常に表示"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"アプリのクラッシュが発生するごとにダイアログを表示します"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE 対応のアプリを選択してください"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi 通話では、携帯通信会社以外のネットワーク(一部の Wi-Fi ネットワークなど)を利用して通話の発信と着信を行えます。"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"通話"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"優先"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"通話優先"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS 優先"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"使用不可"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM なし"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"設定"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"パブリック ネットワークに接続する"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ネットワーク接続, インターネット, ワイヤレス, データ, wifi, Wi-Fi, ワイファイ, 携帯, モバイル, 携帯通信会社, 4G, 3G, 2G, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"おやすみ時間モードが ON のため利用できません"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"通知の重要度をリセットしました。"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"アプリ"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"信頼できないデバイスがメッセージにアクセスしようとしています。タップして詳細をご確認ください。"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"メッセージへのアクセスを許可しますか?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"信頼できない Bluetooth デバイス「<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>」がメッセージにアクセスしようとしています。\n\nこれまでに「<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>」に接続したことはありません。"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"信頼できないデバイスが連絡先と通話履歴にアクセスしようとしています。タップして詳細をご確認ください。"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"連絡先と通話履歴へのアクセスを許可しますか?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"信頼できない Bluetooth デバイス「<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>」が連絡先と通話履歴にアクセスしようとしています。これには着信や発信に関するデータも含まれます。\n\nこれまでに「<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>」に接続したことはありません。"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index bc2353a..64e214d 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 მისამართები"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"დამახსოვრ.ქსელები"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"გამოწერები"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"სხვა ქსელები"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP პარამეტრები"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"გაფართოებული Wi‑Fi პარამეტრები ამ მომხმარებლისთვის მიუწვდომელია"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"შენახვა"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN-ის წაშლა"</string>
<string name="menu_new" msgid="6571230342655509006">"ახალი APN"</string>
<string name="menu_save" msgid="6611465355127483100">"შენახვა"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"გაუქმება"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"გაუქმება"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"სახელის ველი არ შეიძლება იყოს ცარიელი."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN არ უნდა იყოს ცარიელი."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"შესაძლებელია აპების გადაყენება"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi-ს, მობილური ინტერნეტის და Bluetooth კავშირის გადაყენება"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ეს ქმედება ქსელის ყველა პარამეტრს გადააყენებს, მათ შორის, შემდეგს:\n\n"<li>"Wi‑Fi"</li>\n<li>"მობილური ინტერნეტი"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ამოშლა"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ჩამოტვირთული SIM-ების ამოშლა"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"შემცვლელი SIM ბარათების ჩამოსატვირთად დაუკავშირდით თქვენს ოპერატორს. ეს ქმედება არ გააუქმებს მობილური მომსახურების მოქმედ გეგმებს."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ეს არ გააუქმებს მობილური სერვისის მოქმედ გეგმებს. ჩამნაცვლებელი SIM-ების ჩამოსატვირთად დაუკავშირდით თქვენს ოპერატორს."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"პარამეტრების ჩამოყრა"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"გსურთ ქსელის ყველა პარამეტრის გადაყენება? ამ მოქმედებას ვერ გააუქმებთ."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"გსურთ ქსელის ყველა პარამეტრის გადაყენება და ჩამოტვირთული SIM ბარათების ამოშლა? ამ მოქმედებას ვერ გააუქმებთ."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ტაბლეტი ჩვეულებრივზე მეტად მოიხმარება"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"მოწყობილობა ჩვეულებრივზე მეტად მოიხმარება"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ბატარეა შესაძლოა ჩვეულებრივზე ადრე დაიცალოს"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ბატარეის გამართულობის შენარჩუნება"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"ოპტიმიზაცია ბატარეის გამართულობისთვის"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ბატარეა დროებით შეზღუდულია. შეეხეთ, რომ შეიტყოთ მეტი."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"თქვენი ტელეფონი ჩვეულებრივზე მეტად მოიხმარებოდა. ბატარეა შესაძლოა მოსალოდნელზე ადრე დაიცალოს.\n\nაპები, რომლებიც ბატარეას ყველაზე მეტად მოიხმარს:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"თქვენი ტაბლეტი ჩვეულებრივზე მეტად მოიხმარებოდა. ბატარეა შესაძლოა მოსალოდნელზე ადრე დაიცალოს.\n\nაპები, რომლებიც ბატარეას ყველაზე მეტად მოიხმარს:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"მონაცემთა ნაკრებების მაქსიმალური რაოდენობა"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ნაგულისხმევ მნიშვნელობებზე გადაყენება"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ავტომატური შევსების დეველოპერის პარამეტრები გადაყენებულია"</string>
+ <string name="location_category" msgid="3496759112306219062">"მდებარეობა"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"მდებარეობის ინდიკატორი სტატუსის ზოლში"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ხმოვანი სიგნალები ყველა მდებარეობისთვის, ქსელის და კავშირის ჩათვლით"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"სრული GNSS გაზომვის განხორციელების იძულება"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ყველა GNSS კონსტელაციისა და სიხშირის აღრიცხვა, დატვირთვის კოეფიციენტის გარეშე"</string>
<string name="device_theme" msgid="5027604586494772471">"მოწყობილობის თემა"</string>
<string name="default_theme" msgid="4815428567082263639">"ნაგულისხმევი"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ქსელის სახელი"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"შეტყობინებების დაპაუზება კონცენტრირების შესანარჩუნებლად"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ფუნქცია მიუწვდომელია"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ეს ფუნქცია გამოირთო, რადგან ის ტელეფონს ანელებს"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"სრული GNSS გაზომვის განხორციელების იძულება"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ყველა GNSS კონსტელაციისა და სიხშირის აღრიცხვა, დატვირთვის კოეფიციენტის გარეშე"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ავარიულად გათიშვის დიალოგური ფანჯრის ყოველთვის ჩვენება"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"დიალოგური ფანჯრის ყოველთვის ჩვენება, როცა აპი ავარიულად ითიშება"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"აირჩიეთ ANGLE-ის მხარდაჭერის მქონე აპი"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi დარეკვა საშუალებას გაძლევთ, დარეკოთ და მიიღოთ ზარები არაოპერატორის ქსელების, მაგალითად, ზოგიერთი Wi-Fi ქსელის მეშვეობით."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ზარები"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"უპირატესი"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"უპირატესია ზარები"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"უპირატესია SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"მიუწვდომელი"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM არ არის"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"პრიორიტეტები"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"საჯარო ქსელებთან დაკავშირება"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ქსელთან კავშირი, ინტერნეტი, უსადენო, მონაცემები, wifi, wi-fi, wi fi, ფიჭური, მობილური, ფიჭური ოპერატორი, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"მიუწვდომელია, რადგან ჩართულია ძილის დროის რეჟიმი"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"შეტყობინების მნიშვნელობის გადაყენება დასრულებულია."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"აპები"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"არასანდო მოწყობილობას თქვენს შეტყობინებებზე წვდომა სურს. შეეხეთ დეტალების სანახავად."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"დაუშვებთ შეტყობინებებზე წვდომას?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"არასანდო Bluetooth მოწყობილობას, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], თქვენს შეტყობინებებზე წვდომა სურს.\n\nაქამდე [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]-ს არ დაკავშირებიხართ."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"არასანდო მოწყობილობას თქვენს კონტაქტებსა და ზარების ჟურნალზე წვდომა სურს. შეეხეთ დეტალების სანახავად."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"დაუშვებთ წვდომას კონტაქტებსა და ზარების ჟურნალზე?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"არასანდო Bluetooth მოწყობილობას, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], თქვენს კონტაქტებსა და ზარების ჟურნალზე წვდომა სურს. ეს მოიცავს მონაცემებს შემომავალი და გამავალი ზარების შესახებ.\n\nაქამდე [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]-ს არ დაკავშირებიხართ."</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 162f331..a785e88 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 мекенжайлары"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Сақталған желілер"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Жазылымдар"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Басқа желілер"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP параметрлері"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi-Fi кеңейтілген параметрлері осы пайдаланушы үшін қолжетімді емес"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Сақтау"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN жою"</string>
<string name="menu_new" msgid="6571230342655509006">"Жаңа APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Сақтау"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Өшіру"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Бас тарту"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Атау жақтауы бос болмауы тиіс."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN (Apple хабар жіберу қызметі )бос болмауы тиіс."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Қолданбаларды бастапқы күйге қайтаруға болады."</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, мобильдік деректер және Bluetooth параметрлерін бастапқы күйіне қайтару"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Мұның нәтижесінде барлық желі параметрлері бастапқы күйіне қайтарылады, соның ішінде:\n\n"<li>"Wi‑Fi"</li>\n<li>"мобильдік деректер"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Жою"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Жүктеп алынған SIM карталарын тазарту"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Жаңа SIM карталарын жүктеп алу үшін операторға хабарласыңыз. Мобильдік қызмет жоспарларынан бас тартылмайды."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Бұл әрекет нәтижесінде мобильдік тарифтерден бас тартылмайды. Жаңа SIM карталарын жүктеп алу үшін операторға хабарласыңыз."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Параметрлерді бастапқы күйге қайтару"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Барлық желі параметрлері бастапқы күйіне қайтарылсын ба? Бұл әрекетті қайтару мүмкін емес."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Барлық желі параметрлері бастапқы күйіне қайтарылып, жүктеп алынған SIM карталары өшірілсін бе? Бұл әрекет кері қайтарылмайды."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Планшет әдеттегіден көп қолданылды"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Құрылғы әдеттегіден көп қолданылды"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Батареяның заряды тез бітуі мүмкін."</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Батареяның жұмысқа қабілеттігін сақтау"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Батареяның жұмыс істеу қабілеті оңтайландырылуда"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Батарея жұмысы уақытша шектелген. Толығырақ ақпарат алу үшін түртіңіз."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Телефоныңыз әдеттегіден көп қолданылды. Батареяның заряды тез бітуі мүмкін.\n\nБатареяны ең көп пайдаланатын қолданбалар:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Планшетіңіз әдеттегіден көп пайдаланылды. Батареяның заряды тез бітуі мүмкін.\n\nБатареяны ең көп пайдаланатын қолданбалар:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Көрсетілетін деректердің максималды көлемі"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Әдепкі мәндерге қайтару"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Автотолтыру бойынша Developer Options бастапқы күйіне қайтарылды"</string>
+ <string name="location_category" msgid="3496759112306219062">"Орын"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Күй жолағындағы орын индикаторы"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Желі және байланысты қоса алғанда, барлық орындар үшін көрсету"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS толық өлшемдерін қосу"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Жұмыс циклінсіз барлық GNSS тізбектері мен жиіліктерін қадағалау"</string>
<string name="device_theme" msgid="5027604586494772471">"Құрылғы тақырыбы"</string>
<string name="default_theme" msgid="4815428567082263639">"Әдепкі"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Желі атауы"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Алаңдататын хабарландыруларды кідірту"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функция қолжетімді емес."</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Бұл функция өшірілді, себебі телефоныңыздың жұмысына кедергі келтіреді."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS толық өлшемдерін қосу"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Жұмыс циклінсіз барлық GNSS тізбектері мен жиіліктерін қадағалау"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Ақау туралы хабарларды әрдайым көрсету"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Қолданбада ақау болған сайын, диалог көрсету"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE қолдайтын қолданбаны таңдау"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi қоңыраулары оператордан өзге желілер арқылы (мысалы, кейбір Wi‑Fi желілері) қоңырау шалуға не қабылдауға мүмкіндік береді."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Қоңыраулар"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"таңдаулы"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"қоңыраулар таңдалған"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS таңдалған"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"қолжетімді емес"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM картасы жоқ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Параметрлер"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Қоғамдық жерлердегі желілерге қосылу"</string>
<string name="keywords_internet" msgid="7674082764898690310">"желі байланысы, интернет, сымсыз байланыс, деректер, wifi, Wi-Fi, Wi Fi, ұялы, мобильдік, ұялы байланыс операторы, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Ұйықтау уақыты режимі қосулы болғандықтан, қолжетімді емес."</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Хабарландырулардың маңыздылық параметрлерін бастапқы күйге қайтару аяқталды."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Қолданбалар"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Күдікті құрылғы хабарларыңызды пайдаланғысы келеді. Толық мәлімет алу үшін түртіңіз."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Хабарларды пайдалануға рұқсат берілсін бе?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Күдікті Bluetooth құрылғысы ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) хабарларыңызды пайдаланғысы келеді.\n\nСіз бұрын-соңды [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] құрылғысына қосылмағансыз."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Күдікті құрылғы контактілер тізімі мен қоңыраулар журналын пайдаланғысы келеді. Толық мәлімет алу үшін түртіңіз."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Контактілер тізімі мен қоңыраулар журналын пайдалануға рұқсат берілсін бе?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Күдікті Bluetooth құрылғысы ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) контактілер тізімі мен қоңыраулар журналын пайдаланғысы келеді. Оған кіріс және шығыс қоңыраулары деректері кіреді.\n\nСіз бұрын-соңды [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] құрылғысына қосылмағансыз."</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 008aedb..2b0507c 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"អាសយដ្ឋាន IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"បណ្ដាញដែលបានរក្សាទុក"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"ការជាវ"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"បណ្តាញផ្សេងទៀត"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"ការកំណត់ IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ការកំណត់កម្រិតខ្ពស់នៃ Wi‑Fi មិនអាចប្រើបានសម្រាប់អ្នកប្រើនេះទេ"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"រក្សាទុក"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"លុប APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN ថ្មី"</string>
<string name="menu_save" msgid="6611465355127483100">"រក្សាទុក"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"បោះបង់"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"បោះបង់"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"វាលឈ្មោះមិនអាចទទេ។"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN មិនអាចទទេ។"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"អាចកំណត់កម្មវិធីឡើងវិញបាន"</string>
<string name="reset_network_title" msgid="1395494440355807616">"កំណត់ Wi-Fi ឧបករណ៍ចល័ត និងប៊្លូធូសឡើងវិញ"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"វានឹងកំណត់ការកំណត់បណ្តាញទាំងអស់ឡើងវិញ រួមមាន៖\n\n"<li>"Wi‑Fi"</li>\n<li>"ទិន្នន័យទូរសព្ទចល័ត"</li>\n<li>"ប៊្លូធូស"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"លុប"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"លុបស៊ីមដែលបានទាញយក"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ដើម្បីទាញយកស៊ីមជំនួស សូមទាក់ទងក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក។ សកម្មភាពនេះនឹងមិនបោះបង់គម្រោងសេវាទូរសព្ទចល័តណាមួយឡើយ។"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"សកម្មភាពនេះនឹងមិនបោះបង់គម្រោងសេវាទូរសព្ទចល័តណាមួយឡើយ។ ដើម្បីទាញយកស៊ីមជំនួស សូមទាក់ទងក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក។"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"កំណត់ការកំណត់ឡើងវិញ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"កំណត់ការកំណត់បណ្ដាញទាំងអស់ឡើងវិញ? អ្នកមិនអាចត្រឡប់សកម្មភាពនេះវិញបានទេ។"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"កំណត់ការកំណត់បណ្តាញទាំងអស់ឡើងវិញ និងលុបស៊ីមដែលបានទាញយក? អ្នកមិនអាចត្រឡប់សកម្មភាពនេះវិញបានទេ។"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ថេប្លេតត្រូវបានប្រើប្រាស់ច្រើនជាងធម្មតា"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ឧបករណ៍ត្រូវបានប្រើប្រាស់ច្រើនជាងធម្មតា"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"អាចនឹងឆាប់អស់ថ្មជាងធម្មតា"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ការរក្សាគុណភាពថ្ម"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"កំពុងបង្កើនប្រសិទ្ធភាពគុណភាពថ្ម"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"បានដាក់កម្រិតថ្មជាបណ្ដោះអាសន្ន។ សូមចុច ដើម្បីស្វែងយល់បន្ថែម។"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"ទូរសព្ទរបស់អ្នកត្រូវបានប្រើប្រាស់ច្រើនជាងធម្មតា។ ថ្មរបស់អ្នកអាចនឹងឆាប់អស់ជាងការរំពឹងទុក។\n\nកម្មវិធីដែលប្រើប្រាស់ច្រើនបំផុត តាមរយៈការប្រើប្រាស់ថ្ម៖"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"ថេប្លេតរបស់អ្នកត្រូវបានប្រើប្រាស់ច្រើនជាងធម្មតា។ ថ្មរបស់អ្នកអាចនឹងឆាប់អស់ជាងការរំពឹងទុក។\n\nកម្មវិធីដែលប្រើប្រាស់ច្រើនបំផុត តាមរយៈការប្រើប្រាស់ថ្ម៖"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"សំណុំទិន្នន័យមើលឃើញអតិបរមា"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"កំណត់ឡើងវិញទៅតម្លៃលំនាំដើម"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"បំពេញជម្រើសអ្នកអភិវឌ្ឍន៍ដែលបានកំណត់ឡើងវិញ"</string>
+ <string name="location_category" msgid="3496759112306219062">"ទីតាំង"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"សូចនាករទីតាំងនៅលើរបារស្ថានភាព"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"បង្ហាញទីតាំងទាំងអស់ រួមទាំងបណ្ដាញ និងការតភ្ជាប់"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ជំរុញការវាស់ GNSS ពេញលេញ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"តាមដានក្រុមរូបថត និងហ្រេ្វកង់ GNSS ទាំងអស់ដែលគ្មានការបែងចែករយៈពេលដំណើរការ"</string>
<string name="device_theme" msgid="5027604586494772471">"រចនាប័ទ្មឧបករណ៍"</string>
<string name="default_theme" msgid="4815428567082263639">"លំនាំដើម"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ឈ្មោះបណ្តាញ"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ផ្អាកការជូនដំណឹងដើម្បីផ្តោតអារម្មណ៍"</string>
<string name="disabled_feature" msgid="7151433782819744211">"មិនអាចប្រើមុខងារនេះបានទេ"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"មុខងារនេះត្រូវបានបិទ ដោយសារវាធ្វើឱ្យទូរសព្ទរបស់អ្នកដើរយឺត"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ជំរុញការវាស់ GNSS ពេញលេញ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"តាមដានក្រុមរូបថត និងហ្រេ្វកង់ GNSS ទាំងអស់ដែលគ្មានការបែងចែករយៈពេលដំណើរការ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"បង្ហាញប្រអប់បញ្ចូលនៃការគាំងជានិច្ច"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"បង្ហាញប្រអប់បញ្ចូលរាល់ពេលដែលកម្មវិធីគាំង"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ជ្រើសរើសកម្មវិធីដែលអាចប្រើ ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ការហៅតាម Wi-Fi អនុញ្ញាតឱ្យអ្នកហៅ និងទទួលទូរសព្ទតាមបណ្ដាញដែលមិនមានប្រភពមកពីក្រុមហ៊ុនសេវាទូរសព្ទដូចជា បណ្ដាញ Wi‑Fi មួយចំនួនជាដើម។"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ការហៅទូរសព្ទ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"សារ SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ជាអាទិភាព"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ការហៅទូរសព្ទជាអាទិភាព"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ជាអាទិភាព"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"មិនអាចប្រើបានទេ"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"មិនមានស៊ីមទេ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ចំណូលចិត្ត"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ភ្ជាប់ជាមួយបណ្ដាញសាធារណៈ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ការតភ្ជាប់បណ្ដាញ, អ៊ីនធឺណិត, ឥតខ្សែ, ទិន្នន័យ, wifi, wi-fi, wi fi, បណ្ដាញចល័ត, ឧបករណ៍ចល័ត, ក្រុមហ៊ុនសេវាទូរសព្ទចល័ត, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"មិនអាចប្រើបានទេ ដោយសារបើកមុខងារម៉ោងគេង"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"បានបញ្ចប់ការកំណត់កម្រិតសំខាន់នៃការជូនដំណឹងឡើងវិញ។"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"កម្មវិធី"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"ឧបករណ៍ដែលមិនគួរឱ្យទុកចិត្តចង់ចូលប្រើសាររបស់អ្នក។ សូមចុចដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"អនុញ្ញាតឱ្យចូលប្រើសារឬ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"ឧបករណ៍ប៊្លូធូសដែលមិនគួរឱ្យទុកចិត្ត [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] ចង់ចូលប្រើសាររបស់អ្នក។\n\nអ្នកមិនបានភ្ជាប់ទៅ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ពីមុនទេ។"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"ឧបករណ៍ដែលមិនគួរឱ្យទុកចិត្តចង់ចូលប្រើទំនាក់ទំនង និងកំណត់ហេតុហៅទូរសព្ទរបស់អ្នក។ សូមចុចដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"អនុញ្ញាតឱ្យចូលប្រើទំនាក់ទំនង និងកំណត់ហេតុហៅទូរសព្ទឬ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"ឧបករណ៍ប៊្លូធូសដែលមិនគួរឱ្យទុកចិត្ត [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] ចង់ចូលប្រើទំនាក់ទំនង និងកំណត់ហេតុហៅទូរសព្ទរបស់អ្នក។ សកម្មភាពនេះរួមបញ្ចូលទិន្នន័យអំពីការហៅចូល និងការហៅចេញ។\n\nអ្នកមិនបានភ្ជាប់ទៅ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ពីមុនទេ។"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 6fbdef5..5d9f06f 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ವಿಳಾಸಗಳು"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"ಉಳಿಸಿದ ನೆಟ್ವರ್ಕ್"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"ಸಬ್ಸ್ಕ್ರಿಪ್ಶನ್ಗಳು"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"ಇತರ ನೆಟ್ವರ್ಕ್ಗಳು"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ಈ ಬಳಕೆದಾರರಿಗೆ ವೈ ಫೈ ಸುಧಾರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ಉಳಿಸಿ"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ಅಳಿಸಿ"</string>
<string name="menu_new" msgid="6571230342655509006">"ಹೊಸ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"ಉಳಿಸಿ"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ತ್ಯಜಿಸಿ"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ರದ್ದುಮಾಡಿ"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"ಹೆಸರಿನ ಕ್ಷೇತ್ರವು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ಖಾಲಿ ಇರುವಂತಿಲ್ಲ."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ಆ್ಯಪ್ಗಳನ್ನು ಮರುಹೊಂದಿಸಬಹುದಾಗಿದೆ"</string>
<string name="reset_network_title" msgid="1395494440355807616">"ವೈ-ಫೈ, ಮೊಬೈಲ್ ಮತ್ತು ಬ್ಲೂಟೂತ್ ಮರುಹೊಂದಿಸಿ"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ಕೆಳಗಿನವುಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ಇದು ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಹೊಂದಿಸುತ್ತದೆ:\n\n"<li>"ವೈ-ಫೈ"</li>\n<li>"ಮೊಬೈಲ್ ಡೇಟಾ"</li>\n<li>"ಬ್ಲೂಟೂತ್"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ಅಳಿಸಿ"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ಡೌನ್ಲೋಡ್ ಮಾಡಿದ SIM ಅಳಿಸಿ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ಬದಲಿ SIM ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು, ನಿಮ್ಮ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ. ಇದು ಯಾವುದೇ ಮೊಬೈಲ್ ಸೇವಾ ಪ್ಲಾನ್ಗಳನ್ನು ರದ್ದುಗೊಳಿಸುವುದಿಲ್ಲ."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ಇದು ಯಾವುದೇ ಮೊಬೈಲ್ ಸೇವಾ ಪ್ಲಾನ್ಗಳನ್ನು ರದ್ದುಗೊಳಿಸುವುದಿಲ್ಲ. ಬದಲಾಯಿಸಿದ SIM ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿಕೊಳ್ಳಲು, ನಿಮ್ಮ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಹೊಂದಿಸುವುದೇ? ನೀವು ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಹೊಂದಿಸುವುದೇ ಹಾಗೂ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾದ SIM ಗಳನ್ನು ಅಳಿಸುವುದೇ? ನೀವು ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ಟ್ಯಾಬ್ಲೆಟ್ ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನದನ್ನು ಬಳಸಿದೆ"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ಸಾಧನವು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನದನ್ನು ಬಳಸಿದೆ"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ಬ್ಯಾಟರಿ ಸಾಮಾನ್ಯ ಅವಧಿಗಿಂತ ಮೊದಲೇ ಖಾಲಿಯಾಗಬಹುದು"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ಬ್ಯಾಟರಿಯ ಆರೋಗ್ಯವನ್ನು ಸಂರಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"ಬ್ಯಾಟರಿಯ ಆರೋಗ್ಯಕ್ಕಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ಬ್ಯಾಟರಿಯನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಸೀಮಿತಗೊಳಿಸಲಾಗಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಲಾಗಿದೆ. ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಆಧರಿಸಿ ಇವುಗಳು ಟಾಪ್ ಆ್ಯಪ್ಗಳಾಗಿವೆ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಲಾಗಿದೆ. ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಆಧರಿಸಿ ಇವುಗಳು ಟಾಪ್ ಆ್ಯಪ್ಗಳಾಗಿವೆ:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"ಗರಿಷ್ಠ ಗೋಚರಿಸುವ ಡೇಟಾ ಸೆಟ್ಗಳು"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ಡಿಫಾಲ್ಟ್ ಮೌಲ್ಯಗಳಿಗೆ ಮರುಹೊಂದಿಸಿ"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ಸ್ವಯಂ ಭರ್ತಿ ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳನ್ನು ಮರುಹೊಂದಿಸಲಾಗಿದೆ"</string>
+ <string name="location_category" msgid="3496759112306219062">"ಸ್ಥಳ"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"ಸ್ಥಿತಿ ಪಟ್ಟಿ ಸ್ಥಳ ಸೂಚಕ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಸಂಪರ್ಕ ಕಲ್ಪಿಸುವಿಕೆಯನ್ನು ಒಳಗೊಂಡಂತೆ ಎಲ್ಲಾ ಸ್ಥಳಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ಫೋರ್ಸ್ ಫುಲ್ GNSS ಅಳತೆಗಳು"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ಯಾವುದೇ ಡ್ಯೂಟಿ ಸೈಕ್ಲಿಂಗ್ ಇಲ್ಲದೆ ಎಲ್ಲಾ GNSS ಕಾನ್ಸ್ಟಲೇಶನ್ಗಳು ಮತ್ತು ಆವರ್ತನೆಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ"</string>
<string name="device_theme" msgid="5027604586494772471">"ಸಾಧನದ ಥೀಮ್"</string>
<string name="default_theme" msgid="4815428567082263639">"ಡಿಫಾಲ್ಟ್"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ನೆಟ್ವರ್ಕ್ ಹೆಸರು"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ಫೋಕಸ್ ಆಗಿ ಇರಲು ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಿ"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ನಿಮ್ಮ ಫೋನ್ನ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿಧಾನಗೊಳಿಸುತ್ತದೆ"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ಫೋರ್ಸ್ ಫುಲ್ GNSS ಅಳತೆಗಳು"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ಯಾವುದೇ ಡ್ಯೂಟಿ ಸೈಕ್ಲಿಂಗ್ ಇಲ್ಲದೆ ಎಲ್ಲಾ GNSS ಕಾನ್ಸ್ಟಲೇಶನ್ಗಳು ಮತ್ತು ಆವರ್ತನೆಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ಯಾವಾಗಲೂ ಕ್ರ್ಯಾಶ್ ಸಂವಾದವನ್ನು ತೋರಿಸಿ"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"ಅಪ್ಲಿಕೇಶನ್ ಕ್ರ್ಯಾಶ್ ಆಗುವಾಗ ಪ್ರತಿ ಬಾರಿ ಸಂವಾದವನ್ನು ತೋರಿಸಿ"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE ಸಕ್ರಿಯಗೊಳಿಸಿದ ಆ್ಯಪ್ ಆಯ್ಕೆಮಾಡಿ"</string>
@@ -4896,14 +4899,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"ಸಿಮ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ ಹಾಗೂ ಅದನ್ನು ಮತ್ತೆ ಸೇರಿಸಿ. ಸಮಸ್ಯೆ ಮುಂದುವರಿದರೆ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"ಸಿಮ್ ಅನ್ನು ಮತ್ತೆ ಆನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ. ಸಮಸ್ಯೆ ಮುಂದುವರಿದರೆ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"ನೆಟ್ವರ್ಕ್ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> ಸಕ್ರಿಯವಾಗಿದೆ"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"SIM ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"ಸಿಮ್ ಕಾರ್ಡ್"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಈ ಸಿಮ್ ಅನ್ನು ಅಳಿಸುವುದೇ?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"ಈ ಸಿಮ್ ಅನ್ನು ಅಳಿಸುವುದರಿಂದ, ಅದು ಈ ಸಾಧನದಿಂದ <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> ಸೇವೆಯನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ.\n\n<xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> ಗಾಗಿ ಇರುವ ಸೇವೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ."</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"ಅಳಿಸಿ"</string>
@@ -5056,14 +5055,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ವೈ-ಫೈ ಕರೆಮಾಡುವಿಕೆಯು, ಕೆಲವು ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ವಾಹಕ-ರಹಿತ ನೆಟ್ವರ್ಕ್ಗಳ ಮೂಲಕ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ಕರೆಗಳು"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ಆದ್ಯತೆ ನೀಡಲಾಗಿದೆ"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ಕರೆಗಳಿಗೆ ಆದ್ಯತೆ ನೀಡಲಾಗಿದೆ"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"ಯಾವುದೇ ಸಿಮ್ ಇಲ್ಲ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ಪ್ರಾಶಸ್ತ್ಯಗಳು"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ಸಾರ್ವಜನಿಕ ನೆಟ್ವರ್ಕ್ಗಳಿಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ನೆಟ್ವರ್ಕ್ ಕನೆಕ್ಷನ್, ಇಂಟರ್ನೆಟ್, ವೈರ್ಲೆಸ್, ಡೇಟಾ, ವೈಫೈ, ವೈ-ಫೈ, ವೈ ಫೈ, ಸೆಲ್ಯುಲಾರ್, ಮೊಬೈಲ್, ಸೆಲ್ ವಾಹಕ, 4g, 3g, 2g, LTE"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"ಏರೋಪ್ಲೇನ್-ಸುರಕ್ಷಿತ ನೆಟ್ವರ್ಕ್ ನೋಡಿ"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಮಾಡಿ"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ಬೆಡ್ಟೈಮ್ ಮೋಡ್ ಆನ್ ಇರುವುದರಿಂದ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"ಮರುಹೊಂದಿಕೆ ಅಧಿಸೂಚನೆ ಪ್ರಾಮುಖ್ಯತೆ ಪೂರ್ಣಗೊಂಡಿದೆ."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ಆ್ಯಪ್ಗಳು"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"ವಿಶ್ವಾಸಾರ್ಹವಲ್ಲದ ಸಾಧನವು ನಿಮ್ಮ ಸಂದೇಶಗಳಿಗೆ ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತದೆ. ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"ಸಂದೇಶಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"ಒಂದು ವಿಶ್ವಾಸಾರ್ಹವಲ್ಲದ ಬ್ಲೂಟೂತ್ ಸಾಧನ, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ನಿಮ್ಮ ಸಂದೇಶಗಳಿಗೆ ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತದೆ.\n\nನೀವು ಈ ಮೊದಲು [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿರಲಿಲ್ಲ."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"ವಿಶ್ವಾಸಾರ್ಹವಲ್ಲದ ಸಾಧನವು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆಯ ಲಾಗ್ಗೆ ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತದೆ. ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆಯ ಲಾಗ್ಗೆ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸಬೇಕೇ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"ಒಂದು ವಿಶ್ವಾಸಾರ್ಹವಲ್ಲದ ಬ್ಲೂಟೂತ್ ಸಾಧನ, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆಯ ಲಾಗ್ಗೆ ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತದೆ. ಇದು ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ.\n\nನೀವು ಈ ಮೊದಲು [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿರಲಿಲ್ಲ."</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index a99076b..098f6d2 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 주소"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"저장된 네트워크"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"구독"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"기타 네트워크"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP 설정"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"이 사용자는 Wi‑Fi 고급 설정을 사용할 수 없습니다."</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"저장"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN 삭제"</string>
<string name="menu_new" msgid="6571230342655509006">"새 APN"</string>
<string name="menu_save" msgid="6611465355127483100">"저장"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"취소"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"취소"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"이름 입력란은 비워둘 수 없습니다."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN을 비워둘 수 없습니다."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"앱을 재설정할 수 있습니다."</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, 모바일, 블루투스 초기화"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"다음을 포함한 모든 네트워크 설정이 초기화됩니다.\n\n"<li>"Wi‑Fi"</li>\n<li>"모바일 데이터"</li>\n<li>"블루투스"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"삭제"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"다운로드한 SIM 삭제"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"교체 SIM을 다운로드하려면 이동통신사에 문의하세요. 이렇게 해도 모바일 서비스 요금제는 취소되지 않습니다."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"이렇게 해도 모바일 서비스 요금제는 취소되지 않습니다. 교체 SIM을 다운로드하려면 이동통신사에 문의하세요."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"설정 초기화"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"네트워크 설정을 모두 초기화하시겠습니까? 이 작업은 실행취소할 수 없습니다."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"모든 네트워크 설정을 초기화하고 다운로드한 SIM을 삭제하시겠습니까? 이 작업은 실행취소할 수 없습니다."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"태블릿을 평소보다 더 많이 사용함"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"기기를 평소보다 더 많이 사용함"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"배터리가 평소보다 빨리 소진될 수 있습니다."</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"배터리 상태 유지"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"배터리 상태 최적화 중"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"일시적으로 배터리 사용이 제한됩니다. 자세히 알아보려면 탭하세요."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"휴대전화를 평소보다 더 많이 사용했습니다. 배터리가 예상보다 빨리 소진될 수 있습니다.\n\n배터리 사용량이 가장 많은 앱:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"태블릿을 평소보다 더 많이 사용했습니다. 배터리가 예상보다 빨리 소진될 수 있습니다.\n\n배터리 사용량이 가장 많은 앱:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"표시할 데이터세트 최대 개수"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"기본값으로 초기화"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"개발자 옵션 자동완성 기능이 초기화되었습니다."</string>
+ <string name="location_category" msgid="3496759112306219062">"위치"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"상태 표시줄 위치 표시기"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"네트워크 및 연결 등 모든 센서를 통해 위치 표시"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"전체 GNSS 측정 강제 사용"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"듀티 사이클 없이 모든 GNSS 배열 및 빈도를 추적"</string>
<string name="device_theme" msgid="5027604586494772471">"기기 테마"</string>
<string name="default_theme" msgid="4815428567082263639">"기본값"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"네트워크 이름"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"방해받지 않도록 알림 일시중지"</string>
<string name="disabled_feature" msgid="7151433782819744211">"제공되지 않는 기능"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"이 기능은 휴대전화의 속도를 느리게 하므로 사용 중지되었습니다."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"전체 GNSS 측정 강제 사용"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"듀티 사이클 없이 모든 GNSS 배열 및 빈도를 추적"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"비정상 종료 대화상자 항상 표시"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"앱이 비정상 종료될 때마다 대화상자 표시"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE 사용 앱 선택"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi 통화를 사용하면 Wi‑Fi 네트워크와 같은 비이동통신사 네트워크를 통해 전화를 주고받을 수 있습니다."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"통화"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"기본"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"기본 전화"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"기본 SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"사용할 수 없음"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM 없음"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"환경설정"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"공용 네트워크에 연결"</string>
<string name="keywords_internet" msgid="7674082764898690310">"네트워크 연결, 인터넷, 무선, 데이터, Wifi, Wi-Fi, Wi Fi, 셀룰러, 모바일, 이동통신사, 4G, 3G, 2G, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"취침 모드가 켜져 있으므로 사용할 수 없습니다."</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"알림 중요도가 재설정되었습니다."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"앱"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"신뢰할 수 없는 기기에서 메시지에 액세스하려고 합니다. 세부정보를 확인하려면 탭하세요."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"메시지 액세스를 허용하시겠습니까?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"신뢰할 수 없는 블루투스 기기 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]에서 메시지에 액세스하려고 합니다.\n\n전에는 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]에 연결한 적이 없습니다."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"신뢰할 수 없는 기기에서 연락처와 통화 기록에 액세스하려고 합니다. 세부정보를 확인하려면 탭하세요."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"연락처와 통화 기록 액세스를 허용하시겠습니까?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"신뢰할 수 없는 블루투스 기기 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]에서 연락처와 통화 기록에 액세스하려고 합니다. 여기에는 수신 전화와 발신 전화에 관한 데이터도 포함됩니다.\n\n전에는 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]에 연결한 적이 없습니다."</string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 80ab6f6..709f21d 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 даректери"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Сакталган тармактар"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Жазылуулар"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Башка тармактар"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP жөндөөлөрү"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Бул колдонуучу үчүн Wi‑Fi өздөштүрүлгөн жөндөөлөрү жеткиликсиз"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Сактоо"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN жок кылуу"</string>
<string name="menu_new" msgid="6571230342655509006">"Жаңы APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Сактоо"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Сакталбасын"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Жокко чыгаруу"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Аталыш сабы бош болбошу керек."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN бош болбошу керек."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Колдонмону баштапкы абалга келтирүүгө болот"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi\'ды, мобилдик түзмөктү жана Bluetooth\'ду баштапкы абалга келтирүү"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Ушуну менен тармактын бардык жөндөөлөрү баштапкы абалга келет. Тактап айтканда: \n\n"<li>"Wi‑Fi"</li>\n<li>"Мобилдик Интернет"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Тазалоо"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Жүктөп алган SIM’дерди өчүрүү"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Ордуна башка SIM карта жүктөп алуу үчүн, операторуңуз менен байланышыңыз. Тарифтик пландарыңыз өзгөрбөйт."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Тарифтик пландарыңыз өзгөрбөйт. Башка SIM-карталарды жүктөп алуу үчүн байланыш операторуна кайрылыңыз."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Жөндөөлөрдү кайра коюу"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Тармак жөндөөлөрүн баштапкы абалга келтирсеңиз, аларды артка кайтара албайсыз. Уланта бересизби?"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Тармак жөндөөлөрүнүн баарын баштапкы абалга келтирип, жүктөлүп алынган SIM карталарды өчүрөсүзбү? Бул аракетти артка кайтара албайсыз."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Планшет адаттагыдан көбүрөөк колдонулду"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Түзмөк адаттагыдан көбүрөөк колдонулду"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Батарея эртерээк отуруп калышы мүмкүн"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Батареяны көбүрөөк убакытка жеткирүү"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Батареянын кубатын үнөмдөө иштетилди"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Батареяны колдонуу убактылуу чектелген. Кененирээк маалымат алуу үчүн таптап коюңуз."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Телефонуңузду адаттагыдан көбүрөөк колдонуп жатасыз. Ушундан улам батареяңыз тез отуруп калышы мүмкүн.\n\nБатареяны эң көп пайдаланган колдонмолор:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Планшетиңизди адаттагыдан көбүрөөк колдонуп жатасыз. Ушундан улам батареяңыз тез отуруп калышы мүмкүн.\n\nБатареяны эң көп пайдаланган колдонмолор:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Көрүнүп турган дайындар топтомунун эң жогорку саны"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Демейки маанилерге кайтаруу"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Иштеп чыгуучунун параметрлерин автотолтуруу жөндөөсү кайра коюлду"</string>
+ <string name="location_category" msgid="3496759112306219062">"Жайгашкан жер"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Абал тилкесинин жайгашкан жеринин индикатору"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Бардык жерлер, ошондой эле байланыш жана тармактарда көрсөтүлөт"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS көрсөткүчтөрүнө толук көз салууну иштетүү"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Иштөө цикли өчүрүлүп, бардык GNSS топторуна жана жыштыктарга көз салынат"</string>
<string name="device_theme" msgid="5027604586494772471">"Түзмөктүн темасы"</string>
<string name="default_theme" msgid="4815428567082263639">"Демейки"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Тармактын аталышы"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Алагды кылбоо үчүн билдирмелерди тындыруу"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функция жеткиликтүү эмес"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Бул функция телефонуңузду жай иштетип жаткандыктан өчүрүлгөн"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS көрсөткүчтөрүнө толук көз салууну иштетүү"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Иштөө цикли өчүрүлүп, бардык GNSS топторуна жана жыштыктарга көз салынат"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Ката диалогун ар дайым көрсөтүү"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Колдонмо бузулган сайын диалог көрүнөт"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE иштетилген колдонмону тандоо"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi аркылуу чалуу менен мобилдик байланыш оператору аркылуу эмес, айрым Wi‑Fi тармактарын колдонуп чала аласыз."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Чалуулар"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"артыкчылыктуу"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"чалуулар артыкчылыктуу"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS артыкчылыктуу"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"жеткиликсиз"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM-карта жок"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Жеке жөндөөлөр"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Жалпыга ачык тармактарга туташуу"</string>
<string name="keywords_internet" msgid="7674082764898690310">"тармакка туташуу, интернет, зымсыз, маалымат, wifi, wi-fi, wi fi, уюлдук, мобилдик, байланыш оператору, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Уйку режиминде иштебейт"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Билдирмелердин маанилүүлүгүн баштапкы абалга келтирүү аяктады."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Колдонмолор"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Кооптуу түзмөк билдирүүлөрүңүздү көргөнү жатат. Чоо-жайын көрүү үчүн таптап коюңуз."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Билдирүүлөрдү көрүүгө уруксат берилсинби?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Кооптуу Bluetooth түзмөгү, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], билдирүүлөрүңүздү көргөнү жатат.\n\n[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] түзмөгүнө буга чейин туташкан эмессиз."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Кооптуу түзмөк байланыштарыңызды жана чалуулар тизмесин көргөнү жатат. Чоо-жайын көрүү үчүн таптап коюңуз."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Байланыштар менен чалуулар тизмесин көрүүгө уруксат берилсинби?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Кооптуу Bluetooth түзмөгү, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], байланыштарыңызды жана чалуулар тизмесин көргөнү жатат. Буга кирүүчү жана чыгуучу чалуулар кирет.\n\n[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] түзмөгүнө буга чейин туташкан эмессиз."</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index b0e4a59..1f97968 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"ທີ່ຢູ່ IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"ເຄືອຂ່າຍທີ່ບັນທຶກໄວ້"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"ການສະໝັກໃຊ້"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"ເຄືອຂ່າຍອື່ນໆ"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"ການຕັ້ງຄ່າ IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ບໍ່ສາມາດໃຊ້ການຕັ້ງຄ່າ Wi‑Fi ຂັ້ນສູງກັບຜູ້ໃຊ້ນີ້ໄດ້"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ບັນທຶກ"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"ລຶບ APN"</string>
<string name="menu_new" msgid="6571230342655509006">"ເພີ່ມ APN ໃໝ່"</string>
<string name="menu_save" msgid="6611465355127483100">"ບັນທຶກ"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ຍົກເລີກ"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ຍົກເລີກ"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"ແຖບຂໍ້ມູນຊື່ບໍ່ສາມາດປ່ອຍຫວ່າງໄດ້."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ບໍ່ສາມາດປ່ອຍໃຫ້ຫວ່າງໄດ້."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ແອັບສາມາດຣີເຊັດໄດ້"</string>
<string name="reset_network_title" msgid="1395494440355807616">"ຣີເຊັດ Wi-Fi, ມືຖື ແລະ Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ນີ້ຈະເປັນການຣີເຊັດການຕັ້ງຄ່າເຄືອຂ່າຍທັງໝົດ, ຮວມເຖິງ:\n\n"<li>"Wi‑Fi"</li>\n<li>"ອິນເຕີເນັດມືຖື"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ລຶບ"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ລຶບ SIM ທີ່ດາວໂຫລດມາແລ້ວອອກ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ເພື່ອດາວໂຫລດ SIM ແທນທີ່, ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການຂອງທ່ານ. ນີ້ຈະບໍ່ເປັນການຍົກເລີກແພັກເກດບໍລິການມືຖືໃດໆ."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ນີ້ຈະບໍ່ເປັນການຍົກເລີກແພັກເກດບໍລິການມືຖືໃດໆ. ເພື່ອດາວໂຫຼດຊິມທົດແທນ, ໃຫ້ຕິດຕໍ່ຫາຜູ້ໃຫ້ບໍລິການຂອງທ່ານ."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ຣີເຊັດການຕັ້ງຄ່າ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ຣີເຊັດການຕັ້ງຄ່າເຄືອຂ່າຍທັງໝົດບໍ? ທ່ານຈະບໍ່ສາມາດຍົກເລີກຄຳສັ່ງນີ້ໄດ້."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ຣີເຊັດການຕັ້ງຄ່າເຄືອຂ່າຍທັງໝົດ ແລະ ລຶບລ້າງ SIM ທີ່ດາວໂຫລດມາແລ້ວອອກບໍ? ທ່ານບໍ່ສາມາດຍົກເລີກຄຳສັ່ງນີ້ໄດ້."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ໃຊ້ແທັບເລັດຫຼາຍກວ່າປົກກະຕິ"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ໃຊ້ອຸປະກອນຫຼາຍກວ່າປົກກະຕິ"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ແບັດເຕີຣີອາດໝົດໄວກວ່າປົກກະຕິ"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ກຳລັງຖະໜອມອາຍຸແບັດເຕີຣີ"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"ກຳລັງເພີ່ມປະສິດທິພາບເພື່ອສຸຂະພາບແບັດເຕີຣີ"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ຈຳກັດແບັດເຕີຣີຊົ່ວຄາວ. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"ມີການນຳໃຊ້ໂທລະສັບຂອງທ່ານຫຼາຍກວ່າປົກກະຕິ. ແບັດເຕີຣີອາດໝົດໄວກວ່າທີ່ຄາດໄວ້.\n\nແອັບທີ່ໃຊ້ແບັດເຕີຣີຫຼາຍສຸດແມ່ນ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"ມີການນຳໃຊ້ແທັບເລັດຂອງທ່ານຫຼາຍກວ່າປົກກະຕິ. ແບັດເຕີຣີອາດໝົດໄວກວ່າທີ່ຄາດໄວ້.\n\nແອັບທີ່ໃຊ້ແບັດເຕີຣີຫຼາຍສຸດແມ່ນ:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"ຊຸດຂໍ້ມູນທີ່ສະແດງສູງສຸດ"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ຣີເຊັດເປັນຄ່າເລີ່ມຕົ້ນ"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ຣີເຊັດຕົວເລືອກການຕື່ມຂໍ້ມູນນັກພັດທະນາໂດຍອັດຕະໂນມັດແລ້ວ"</string>
+ <string name="location_category" msgid="3496759112306219062">"ສະຖານທີ່"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"ຕົວລະບຸສະຖານທີ່ແຖບສະຖານະ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ສະແດງສຳລັບສະຖານທີ່ທັງໝົດ, ຮວມທັງເຄືອຂ່າຍ ແລະ ການເຊື່ອມຕໍ່"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ບັງຄັບການກວດສອບ GNSS ເຕັມຮູບແບບ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ຕິດຕາມກຸ່ມ ແລະ ຄວາມຖີ່ GNSS ທັງໝົດໂດຍບໍ່ມີຮອບຕາມພັນທະ"</string>
<string name="device_theme" msgid="5027604586494772471">"ຮູບແບບສີສັນອຸປະກອນ"</string>
<string name="default_theme" msgid="4815428567082263639">"ຄ່າເລີ່ມຕົ້ນ"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ຊື່ເຄືອຂ່າຍ"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ຢຸດການແຈ້ງເຕືອນຊົ່ວຄາວເພື່ອໃຫ້ມີສະມາທິ"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ບໍ່ສາມາດໃຊ້ຄຸນສົມບັດໄດ້"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ຄຸນສົມບັດນີ້ຖືກປິດໄວ້ແລ້ວເນື່ອງຈາກມັນເຮັດໃຫ້ໂທລະສັບຂອງທ່ານຊ້າ"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ບັງຄັບການກວດສອບ GNSS ເຕັມຮູບແບບ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ຕິດຕາມກຸ່ມ ແລະ ຄວາມຖີ່ GNSS ທັງໝົດໂດຍບໍ່ມີຮອບຕາມພັນທະ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ສະແດງກ່ອງຂໍ້ຄວາມການເຮັດວຽກລົ້ມເຫລວທຸກເທື່ອ"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"ສະແດງກ່ອງຂໍ້ຄວາມທຸກເທື່ອທີ່ແອັບເຮັດວຽກລົ້ມເຫລວ"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ເລືອກແອັບທີ່ໃຊ້ ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ການໂທ Wi‑Fi ຈະເຮັດໃຫ້ທ່ານສາມາດໂທ ແລະ ຮັບສາຍຜ່ານເຄືອຂ່າຍທີ່ບໍ່ແມ່ນຂອງຜູ້ໃຫ້ບໍລິການໄດ້ ເຊັ່ນ: ເຄືອຂ່າຍ Wi‑Fi ບາງບ່ອນ."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ການໂທ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ຕ້ອງການ"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ຕ້ອງການການໂທ"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"ຕ້ອງການ SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ບໍ່ມີຂໍ້ມູນ"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"ບໍ່ມີຊິມ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ການຕັ້ງຄ່າ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍສາທາລະນະ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ການເຊື່ອມຕໍ່ເຄືອຂ່າຍ, ອິນເຕີເນັດ, ໄຮ້ສາຍ, ອິນເຕີເນັດມືຖື, wifi, wi-fi, wi fi, ເຄືອຂ່າຍທືຖື, ມືຖື, ຜູ້ໃຫ້ບໍລິການມືຖື, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ບໍ່ສາມາດໃຊ້ໄດ້ເນື່ອງຈາກເປີດໂໝດເວລານອນຢູ່"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"ຣີເຊັດຄວາມສຳຄັນການແຈ້ງເຕືອນສຳເລັດແລ້ວ."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ແອັບ"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"ມີອຸປະກອນທີ່ບໍ່ເຊື່ອຖືຕ້ອງການເຂົ້າເຖິງຂໍ້ຄວາມຂອງທ່ານ. ແຕະເພື່ອເບິ່ງລາຍລະອຽດ."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"ອະນຸຍາດການເຂົ້າເຖິງຂໍ້ຄວາມບໍ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"ອຸປະກອນ Bluetooth ທີ່ບໍ່ເຊື່ອຖື, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ຕ້ອງການເຂົ້າເຖິງຂໍ້ຄວາມຂອງທ່ານ.\n\nທ່ານບໍ່ເຄີຍເຊື່ອມຕໍ່ຫາ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ມາກ່ອນ."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"ມີອຸປະກອນທີ່ບໍ່ເຊື່ອຖືຕ້ອງການເຂົ້າເຖິງລາຍຊື່ຜູ້ຕິດຕໍ່ ແລະ ບັນທຶກການໂທຂອງທ່ານ. ແຕະເພື່ອເບິ່ງລາຍລະອຽດ."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"ອະນຸຍາດການເຂົ້າເຖິງລາຍຊື່ຜູ້ຕິດຕໍ່ ແລະ ບັນທຶກການໂທບໍ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"ອຸປະກອນ Bluetooth ທີ່ບໍ່ເຊື່ອຖື, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ຕ້ອງການເຂົ້າເຖິງລາຍຊື່ຜູ້ຕິດຕໍ່ ແລະ ບັນທຶກການໂທຂອງທ່ານ. ນີ້ຮວມເຖິງຂໍ້ມູນກ່ຽວກັບການໂທເຂົ້າ ແລະ ໂທອອກນຳ.\n\nທ່ານບໍ່ເຄີຍເຊື່ອມຕໍ່ຫາ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ມາກ່ອນ."</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 068188d..f18d429 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"„IPv6“ adresai"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Išsaugoti tinklai"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Prenumeratos"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Kiti tinklai"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP nustatymai"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"„Wi‑Fi“ išplėstiniai nustatymai nepasiekiami šiam naudotojui"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Išsaugoti"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Ištrinti APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Naujas APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Išsaugoti"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Atmesti"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Atšaukti"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Pavadinimo laukas negali būti tuščias."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN negali būti tuščias."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Programas galima nustatyti iš naujo"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Iš naujo nustatyti „Wi-Fi“, mobiliųjų duomenų ir „Bluetooth“ nustatymus"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Bus iš naujo nustatyti visi tinklo nustatymai, įskaitant:\n\n"<li>"„Wi‑Fi“;"</li>\n<li>"mobiliojo ryšio duomenis;"</li>\n<li>"„Bluetooth“."</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Ištrinti"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Ištrinti atsisiųstas SIM kort."</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Jei norite atsisiųsti pakaitinių SIM kortelių, susisiekite su operatoriumi. Tai atlikus mobiliojo ryšio paslaugų planai nebus atšaukti."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Šiuo veiksmu neatšauksite jokio mobiliųjų paslaugų plano. Jei norite atsisiųsti pakaitinių SIM kortelių, susisiekite su operatoriumi."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Nustatyti iš naujo"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Iš naujo nustatyti visus tinklo nustatymus? Negalite anuliuoti šio veiksmo."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Iš naujo nustatyti visus tinklo nustatymus ir ištrinti atsisiųstas SIM korteles? Negalite anuliuoti šio veiksmo."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Planšetinis kompiuteris buvo naudojamas daugiau nei įprasta"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Įrenginys buvo naudojamas daugiau nei įprasta"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Akumuliatoriaus energija gali išsekti greičiau nei įprasta"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Akumuliatoriaus apsauga"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimizuojama siekiant apsaugoti akumuliatorių"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Akumuliatorius laikinai apribotas. Palieskite, kad sužinotumėte daugiau."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefonas buvo naudojamas daugiau nei įprastai. Akumuliatoriaus energija gali išsekti greičiau, nei tikėjotės.\n\nDaugiausiai akumuliatoriaus energijos suvartojančios programos:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Planšetinis kompiuteris buvo naudojamas daugiau nei įprastai. Akumuliatoriaus energija gali išsekti greičiau, nei tikėjotės.\n\nDaugiausiai akumuliatoriaus energijos suvartojančios programos:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maks. matomų duomenų rinkinių"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Nustatyti numatytąsias vertes iš naujo"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Automatinio pildymo kūrėjo parinktys nustatytos iš naujo"</string>
+ <string name="location_category" msgid="3496759112306219062">"Vieta"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Būsenos juostos vietos indikatorius"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Rodyti visoms vietoms, įskaitant tinklą ir ryšį"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Priversti vykdyti visus GNSS matavimus"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Stebėti visas GNSS konferencijas ir visus dažnius netaikant darbo ciklų"</string>
<string name="device_theme" msgid="5027604586494772471">"Įrenginio tema"</string>
<string name="default_theme" msgid="4815428567082263639">"Numatytoji"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Tinklo pavadinimas"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pristabdyti pranešimus, kad neblaškytų dėmesio"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcija negalima"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ši funkcija buvo išjungta, nes, kai ji įjungta, telefonas veikia lėčiau"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Priversti vykdyti visus GNSS matavimus"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Stebėti visas GNSS konferencijas ir visus dažnius netaikant darbo ciklų"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Visada rodyti strigčių dialogo langą"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Rodyti dialogo langą kiekvieną kartą, kai programa užstringa"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Pasirinkti programą, kurioje įgalinta ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Naudodami „Wi-Fi“ skambinimą galite atlikti ir gauti skambučius ne operatoriaus tinklais, pvz., kai kuriais „Wi‑Fi“ tinklais."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Skambučiai"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"pageidaujama"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"pageidaujami skambučiai"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"pageidaujami SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nepasiekiama"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nėra SIM kortelės"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Nuostatos"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Prisijungti prie viešųjų tinklų"</string>
<string name="keywords_internet" msgid="7674082764898690310">"tinklo ryšys, internetas, belaidis ryšys, duomenys, „Wifi“, „Wi-Fi“, „Wi Fi“, mobilusis ryšys, mobilusis, mobiliojo ryšio operatorius, 4G, 3G, 2G, LTE"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nepasiekiama, nes įjungtas laiko eiti miegoti režimas"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Pranešimų svarba nustatyta iš naujo."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Programos"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Nepatikimas įrenginys nori pasiekti jūsų pranešimus. Palieskite, jei reikia išsamios informacijos."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Leisti pasiekti pranešimus?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Nepatikimas „Bluetooth“ įrenginys „<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>“ nori pasiekti jūsų pranešimus.\n\nPrie „<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>“ dar niekada nebuvote prisijungę."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Nepatikimas įrenginys nori pasiekti jūsų kontaktus ir skambučių žurnalą. Palieskite, jei reikia išsamios informacijos."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Leisti pasiekti kontaktus ir skambučių žurnalą?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Nepatikimas „Bluetooth“ įrenginys „<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>“ nori pasiekti jūsų kontaktus ir skambučių žurnalą. Tai apima duomenis apie gaunamuosius ir siunčiamuosius skambučius.\n\nPrie „<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>“ dar niekada nebuvote prisijungę."</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 58f1423..be467ed 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -1042,8 +1042,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 adreses"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saglabātie tīkli"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonementi"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Citi tīkli"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP iestatījumi"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi papildu iestatījumi šim lietotājam nav pieejami."</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Saglabāt"</string>
@@ -1618,7 +1617,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Dzēst APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Jauns APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Saglabāt"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Atmest"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Atcelt"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Lauks Nosaukums nedrīkst būt tukšs."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN nedrīkst būt tukšs."</string>
@@ -1633,8 +1632,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Lietotnes var atiestatīt"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Atiestatīt Wi-Fi, mobilo datu un Bluetooth iestatījumus"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Tādējādi tiks atiestatīti visi tīkla iestatījumi, tostarp:\n\n"<li>"Wi‑Fi;"</li>\n<li>"mobilie dati;"</li>\n<li>"Bluetooth."</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Dzēst"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Dzēst lejupielādētās SIM k."</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Lai lejupielādētu nomaiņas SIM kartes, sazinieties ar mobilo sakaru operatoru. Ar šo darbību netiks anulēti mobilo sakaru pakalpojumu plāni."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Ar šo darbību netiks anulēti mobilo sakaru pakalpojumu plāni. Lai lejupielādētu nomaiņas SIM kartes, sazinieties ar mobilo sakaru operatoru."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Atiestatīt iestatījumus"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Vai vēlaties atiestatīt visus tīkla iestatījumus? Šo darbību nevar atsaukt."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Vai vēlaties atiestatīt visus tīkla iestatījumus un izdzēst lejupielādētās SIM kartes? Šo darbību nevar atsaukt."</string>
@@ -2487,7 +2487,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Planšetdators tika izmantots vairāk nekā parasti."</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Ierīce tika izmantota vairāk nekā parasti."</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Akumulators var izlādēties ātrāk nekā parasti"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Akumulatora darbības laika paildzināšana"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Akumulatora darbības optimizēšana"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Akumulatora uzlādes līmenis ir īslaicīgi ierobežots. Pieskarieties, lai uzzinātu vairāk."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Jūsu tālrunis tika izmantots vairāk nekā parasti. Akumulators var izlādēties ātrāk, nekā paredzēts.\n\nLietotnes, kas izmanto visvairāk akumulatora enerģijas:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Jūsu planšetdators tika izmantots vairāk nekā parasti. Akumulators var izlādēties ātrāk, nekā paredzēts.\n\nLietotnes, kas izmanto visvairāk akumulatora enerģijas:"</string>
@@ -4731,6 +4731,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimālais redzamo datu kopu skaits"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Atiestatīt uz noklusējuma vērtībām"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Izstrādātājiem paredzēto opciju automātiskā aizpilde ir atiestatīta."</string>
+ <string name="location_category" msgid="3496759112306219062">"Atrašanās vieta"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Atrašanās vietas indikators statusa joslā"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Rādīt vienmēr, kad tiek noteikta atrašanās vieta, tostarp tad, ja tā var tikt atklāta, izmantojot tīklu vai savienojamību"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Veikt pilnus GNSS mērījumus"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Izsekot visas GNSS konstelācijas un frekvences bez darba cikliem"</string>
<string name="device_theme" msgid="5027604586494772471">"Ierīces motīvs"</string>
<string name="default_theme" msgid="4815428567082263639">"Noklusējums"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Tīkla nosaukums"</string>
@@ -4747,8 +4752,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pārtraukt paziņojumus, lai ilglaicīgi koncentrētos"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcija nav pieejama"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Šī funkcija ir izslēgta, jo tā palēnina jūsu tālruņa darbību."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Veikt pilnus GNSS mērījumus"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Izsekot visas GNSS konstelācijas un frekvences bez darba cikliem"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Vienmēr rādīt avārijas dialoglodziņu"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Rādīt dialoglodziņu katru reizi, kad lietotne avarē"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Atlasiet lietotni, kam ANGLE ir iespējots"</string>
@@ -5135,6 +5138,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Izmantojot Wi-Fi zvanus, varat veikt un saņemt zvanus tīklos, ko nenodrošina mobilo sakaru operatori, piemēram, dažos Wi-Fi tīklos."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Zvani"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Īsziņas"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"vēlamie"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"vēlamie zvani"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"vēlamās īsziņas"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nav pieejami"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nav SIM kartes"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferences"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Izveidot savienojumu ar publiskiem tīkliem"</string>
<string name="keywords_internet" msgid="7674082764898690310">"tīkla savienojums, internets, bezvadu, dati, Wi-Fi, mobilais tīkls, mobilie sakari, mobilo sakaru operators, 4G, 3G, 2G, LTE"</string>
@@ -5143,4 +5151,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Šī preference nav pieejama, jo ir ieslēgts naktsmiera režīms."</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Paziņojumu svarīguma līmeņa atiestatīšana ir pabeigta."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Lietotnes"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Ierīce, kas nav saglabāta uzticamo ierīču sarakstā, pieprasa atļauju piekļūt jūsu ziņojumiem. Pieskarieties, lai skatītu detalizētu informāciju."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vai atļaujat piekļūt ziņojumiem?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Bluetooth ierīce [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], kas nav saglabāta uzticamo ierīču sarakstā, pieprasa atļauju piekļūt jūsu ziņojumiem.\n\nJūs neesat iepriekš veidojis savienojumu ar ierīci [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Ierīce, kas nav saglabāta uzticamo ierīču sarakstā, pieprasa atļauju piekļūt jūsu kontaktpersonu datiem un zvanu žurnālam. Pieskarieties, lai skatītu detalizētu informāciju."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vai atļaujat piekļūt kontaktpersonu datiem un zvanu žurnālam?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Bluetooth ierīce [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], kas nav saglabāta uzticamo ierīču sarakstā, pieprasa atļauju piekļūt jūsu kontaktpersonu datiem un zvanu žurnālam. Tas attiecas arī uz datiem par ienākošajiem un izejošajiem zvaniem.\n\nJūs neesat iepriekš veidojis savienojumu ar ierīci [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index dacc056..9c58cde 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-адреси"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Зачувани мрежи"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Претплати"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Други мрежи"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Поставки за IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Напредни поставки за Wi‑Fi не се достапни за корисников"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Зачувај"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Избриши APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Нов APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Зачувај"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Отфрли"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Откажи"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Полето за име не може да биде празно."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN не може да биде празна."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Апликациите може да се ресетираат"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Ресетирај Wi-Fi, мобилен интернет и Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Ова ќе ги ресетира сите мрежни поставки, вклучувајќи:\n\n"<li>"Wi‑Fi"</li>\n<li>"Мобилен интернет"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Избриши"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Избриши преземени SIM-картички"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"За да преземете SIM-картички за замена, контактирајте со операторот. Со ова не се откажуваат пакети за мобилни услуги."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Ова нема да ги откаже пакетите за мобилни услуги. За да преземете SIM-картички за замена, контактирајте со операторот."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Ресетирај поставки"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Да се ресетираат сите мрежни поставки? Ова дејство не може да се врати."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Да се ресетираат сите мрежни поставки и да се избришат преземените SIM-картички? Ова дејство не може да се врати."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Таблетот се користи повеќе од вообичаено"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Уредот се користи повеќе од вообичаено"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Батеријата може да се потроши порано од вообичаено"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Се задржува состојбата на батеријата"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Се оптимизира за состојба на батеријата"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Батеријата е привремено ограничена. Допрете за да дознаете повеќе."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Телефонот сте го користеле повеќе од вообичаено. Батеријата може да се потроши порано од очекуваното.\n\nАпликации што најмногу ја користеле батеријата:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Таблетот сте го користеле повеќе од вообичаено. Батеријата може да се потроши порано од очекуваното.\n\nАпликации што најмногу ја користеле батеријата:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Максимум видливи збирови на податоци"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Ресетирај на стандардните вредности"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Опциите за програмери за автоматско пополнување се ресетирани"</string>
+ <string name="location_category" msgid="3496759112306219062">"Локација"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Индикатор за локација на статусната лента"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Прикажи за сите локации, вклучително и за мрежата и поврзливоста"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Присилување целосни мерења со GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Следете ги сите констелации и фреквенции со GNSS без работен циклус"</string>
<string name="device_theme" msgid="5027604586494772471">"Тема на уредот"</string>
<string name="default_theme" msgid="4815428567082263639">"Стандардно"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Име на мрежата"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Паузирајте ги известувањата за да останете фокусирани"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функцијата не е достапна"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Функцијава е исклучена бидејќи го успорува телефонот"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Присилување целосни мерења со GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Следете ги сите констелации и фреквенции со GNSS без работен циклус"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Секогаш прикажувај дијалог на пад"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Прикажи дијалог при секој пад на апликација"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Избери апликација овозможена за ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Функцијата „Повици преку Wi-Fi“ ви овозможува да упатувате и примате повици преку мрежи што не се на операторот, на пр., некои Wi‑Fi мрежи."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Повици"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"претпочитано"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"претпочитани се повици"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"претпочитана е SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"недостапно"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Нема SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Поставки"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Поврзувајте се на јавни мрежи"</string>
<string name="keywords_internet" msgid="7674082764898690310">"мрежна врска, интернет, безжичен, мобилен, Wi-Fi, мобилна, мобилен оператор, 4G, 3G, 2G, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Недостапно бидејќи е вклучен „Режимот за спиење“"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ресетирањето на важноста на известувањата е завршено."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Апликации"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Недоверлив уред сака да пристапи до вашите пораки. Допрете за детали."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Да се дозволи пристап до пораките?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Недоверлив уред со Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], сака да пристапи до вашите пораки.\n\nДосега не сте се поврзале со [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Недоверлив уред сака да пристапи до вашите контакти и евиденцијата на повици. Допрете за детали."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Да се дозволи пристап до контактите и евиденцијата на повици?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Недоверлив уред со Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], сака да пристапи до вашите контакти и евиденцијата на повици. Ова ги опфаќа податоците за дојдовните и појдовните повици.\n\nДосега не сте се поврзале со [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index f5ac477..78d8f7a 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 വിലാസങ്ങൾ"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"സംരക്ഷിച്ച നെറ്റ്വർക്ക്"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"സബ്സ്ക്രിപ്ഷനുകൾ"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"മറ്റ് നെറ്റ്വർക്കുകൾ"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ക്രമീകരണങ്ങൾ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ഈ ഉപയോക്താവിന് വൈഫൈ വിപുല ക്രമീകരണം ലഭ്യമല്ല"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"സംരക്ഷിക്കുക"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ഇല്ലാതാക്കുക"</string>
<string name="menu_new" msgid="6571230342655509006">"പുതിയ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"സംരക്ഷിക്കുക"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"നിരസിക്കുക"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"റദ്ദാക്കുക"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"പേരിന്റെ ഫീൽഡ് ശൂന്യമായിരിക്കരുത്."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ശൂന്യമായിരിക്കരുത്."</string>
@@ -1612,8 +1611,11 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ആപ്പുകൾ റീസെറ്റ് ചെയ്യാനാകും"</string>
<string name="reset_network_title" msgid="1395494440355807616">"വൈഫൈ, മൊബൈൽ, Bluetooth റീസെറ്റ് ചെയ്യുക"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ഇനിപ്പറയുന്നവ ഉൾപ്പെടെ എല്ലാ നെറ്റ്വർക്ക് ക്രമീകരണങ്ങളും ഇത് റീസെറ്റ് ചെയ്യും:\n\n"<li>"വൈഫൈ"</li>\n<li>"മൊബൈൽ ഡാറ്റ"</li>\n<li>"Bluetooth"</li></string>
+ <!-- no translation found for erase_euicc_data_button (728078969563311737) -->
+ <skip />
<string name="reset_esim_title" msgid="6152167073280852849">"ഡൗൺലോഡ് ചെയ്ത SIM-കൾ മായ്ക്കൂ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"പകരം വയ്ക്കാനുള്ള SIM-കൾ ഡൗൺലോഡ് ചെയ്യാൻ, നിങ്ങളുടെ സേവനദാതാവിനെ ബന്ധപ്പെടുക. ഇത് മൊബൈൽ സേവന പ്ലാനുകളൊന്നും റദ്ദാക്കില്ല."</string>
+ <!-- no translation found for reset_esim_desc (3662444090563399131) -->
+ <skip />
<string name="reset_network_button_text" msgid="2281476496459610071">"ക്രമീകരണം റീസെറ്റ് ചെയ്യുക"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"എല്ലാ നെറ്റ്വർക്കിംഗ് ക്രമീകരണവും പുനഃസജ്ജീകരിക്കണോ? നിങ്ങൾക്ക് ഈ പ്രവർത്തനം പഴയപടിയാക്കാനാവില്ല."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"എല്ലാ നെറ്റ്വർക്കിംഗ് ക്രമീകരണവും റീസെറ്റ് ചെയ്യുകയും ഡൗൺലോഡ് ചെയ്ത സിമ്മുകൾ മായ്ക്കുകയും ചെയ്യണോ? ഇത് പഴയപടിയാക്കാനാകില്ല."</string>
@@ -2456,7 +2458,8 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ടാബ്ലെറ്റ്, സാധാരണയിൽ കൂടുതൽ ഉപയോഗിച്ചു"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ഉപകരണം, സാധാരണയിൽ കൂടുതൽ ഉപയോഗിച്ചു"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"സാധാരണയിലും നേരത്തെ ബാറ്ററി ചാർജ് തീർന്നേക്കാം"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ബാറ്ററി നില സംരക്ഷിക്കുന്നു"</string>
+ <!-- no translation found for battery_tip_limited_temporarily_title (7152799456221596915) -->
+ <skip />
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ബാറ്ററി താൽക്കാലം പരിമിതപ്പെടുത്തി. കൂടുതലറിയാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"നിങ്ങളുടെ ഫോൺ സാധാരണയിൽ കൂടുതൽ ബാറ്ററി ഉപയോഗിച്ചു. നിങ്ങളുടെ ബാറ്ററിയുടെ ചാർജ് പ്രതീക്ഷിച്ചതിനേക്കാൾ വേഗത്തിൽ തീർന്നേക്കാം\n\nബാറ്ററി ഉപയോഗമനുസരിച്ചുള്ള മുൻനിര ആപ്പുകൾ ഇനിപ്പറയുന്നു:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"നിങ്ങളുടെ ടാബ്ലെറ്റ് സാധാരണയിൽ കൂടുതൽ ബാറ്ററി ഉപയോഗിച്ചു. നിങ്ങളുടെ ബാറ്ററിയുടെ ചാർജ് പ്രതീക്ഷിച്ചതിനേക്കാൾ വേഗത്തിൽ തീർന്നേക്കാം\n\nബാറ്ററി ഉപയോഗമനുസരിച്ചുള്ള മുൻനിര ആപ്പുകൾ ഇനിപ്പറയുന്നു:"</string>
@@ -4651,6 +4654,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"കാണാനാവുന്ന പരമാവധി ഡാറ്റാസെറ്റുകൾ"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ഡിഫോൾട്ട് മൂല്യങ്ങളിലേക്ക് പുനഃക്രമീകരിക്കുക"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"സ്വമേധയാ പൂരിപ്പിക്കുന്ന ഡെവലപ്പർ ഓപ്ഷനുകൾ പുനഃക്രമീകരിച്ചു"</string>
+ <string name="location_category" msgid="3496759112306219062">"ലൊക്കേഷൻ"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"സ്റ്റാറ്റസ് ബാർ ലൊക്കേഷൻ ഇൻഡിക്കേറ്റർ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"നെറ്റ്വർക്കും കണക്റ്റിവിറ്റിയും ഉൾപ്പെടെ, എല്ലാ ലൊക്കേഷനുകൾക്കും കാണിക്കുക"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"പൂർണ്ണ GNSS അളവുകൾ നടപ്പിലാക്കുക"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"നോ ഡ്യൂട്ടി സൈക്ലിംഗ് ഉപയോഗിച്ച് മുഴുവൻ GNSS കോൺസ്റ്റലേഷനുകളും ആവൃത്തികളും ട്രാക്ക് ചെയ്യൂ"</string>
<string name="device_theme" msgid="5027604586494772471">"ഉപകരണത്തിന്റെ തീം"</string>
<string name="default_theme" msgid="4815428567082263639">"ഡിഫോൾട്ട്"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"നെറ്റ്വർക്കിന്റെ പേര്"</string>
@@ -4667,8 +4675,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ഫോക്കസ് ചെയ്ത നിലയിൽ തുടരാൻ, അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തുക"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ഫീച്ചർ ലഭ്യമല്ല"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"നിങ്ങളുടെ ഫോണിൻ്റെ വേഗത കുറയ്ക്കുന്നതിനാൽ ഈ ഫീച്ചർ ഓഫാക്കി"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"പൂർണ്ണ GNSS അളവുകൾ നടപ്പിലാക്കുക"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"നോ ഡ്യൂട്ടി സൈക്ലിംഗ് ഉപയോഗിച്ച് മുഴുവൻ GNSS കോൺസ്റ്റലേഷനുകളും ആവൃത്തികളും ട്രാക്ക് ചെയ്യൂ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"എപ്പോഴും ക്രാഷ് ഡയലോഗ് കാണിക്കുക"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"ആപ്പ് ക്രാഷാകുമ്പോഴെല്ലാം ഡയലോഗ് കാണിക്കുക"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE പ്രവർത്തനക്ഷമമാക്കിയ ആപ്പ് തിരഞ്ഞെടുക്കുക"</string>
@@ -5052,6 +5058,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ചില വൈ-ഫൈ നെറ്റ്വർക്കുകൾ പോലുള്ള കാരിയർ ഇതര നെറ്റ്വർക്കുകളിലൂടെ കോളുകൾ വിളിക്കാനും സ്വീകരിക്കാനും വൈഫൈ കോളിംഗ് നിങ്ങളെ അനുവദിക്കുന്നു."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"കോളുകൾ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"തിരഞ്ഞെടുത്തത്"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"തിരഞ്ഞെടുത്ത കോളുകൾ"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"തിരഞ്ഞെടുത്ത SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ലഭ്യമല്ല"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"സിം ഇല്ല"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"മുൻഗണനകൾ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"പൊതു നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
<string name="keywords_internet" msgid="7674082764898690310">"നെറ്റ്വർക്ക് കണക്ഷൻ, ഇന്റര്നെറ്റ്, വയർലെസ്, ഡാറ്റ, വൈഫൈ, വൈഫൈ, വൈഫൈ, സെല്ലുലാർ, മൊബൈൽ, സെൽ കാരിയർ, 4g, 3g, 2g, LTE"</string>
@@ -5060,4 +5071,16 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ഉറക്ക സമയ മോഡ് ഓണായതിനാൽ ലഭ്യമല്ല"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"അറിയിപ്പുകളുടെ പ്രാധാന്യം റീസെറ്റ് ചെയ്യുന്നത് പൂർത്തിയാക്കി."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ആപ്പുകൾ"</string>
+ <!-- no translation found for bluetooth_message_access_notification_content (2986108412562309009) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_title (9009836130395061579) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_content (6004506637437582983) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_notification_content (4280361621526852063) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_title (7624607995928968721) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_content (2235876209172857819) -->
+ <skip />
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 5bc2861..ffae982 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 хаяг"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Хадгалсан сүлжээ"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Захиалга"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Бусад сүлжээ"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP тохиргоо"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Энэ хэрэглэгчид Wi-Fi дэлгэрэнгүй тохиргоо боломжгүй байна"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Хадгалах"</string>
@@ -1178,10 +1177,10 @@
<string name="color_mode_option_automatic" msgid="2281217686509980870">"Дасан зохицох"</string>
<string name="color_mode_summary_natural" msgid="8298840714001791628">"Зөвхөн оновчтой өнгийг ашиглах"</string>
<string name="color_mode_summary_automatic" msgid="8157885594041700275">"Тод болон оновчтой өнгө хооронд тохируулах"</string>
- <string name="accelerometer_summary_on" product="tablet" msgid="6413384391658481700">"Таблетыг эргүүлбэл харагдацыг автоматаар эргүүлэх"</string>
- <string name="accelerometer_summary_on" product="default" msgid="7117139542131700779">"Утсыг эргүүлбэл харагдацыг автоматаар эргүүлэх"</string>
- <string name="accelerometer_summary_off" product="tablet" msgid="3747370091309939684">"Таблетыг эргүүлбэл харагдацыг автоматаар эргүүлэх"</string>
- <string name="accelerometer_summary_off" product="default" msgid="4451125241783158763">"Утсыг эргүүлбэл харагдацыг автоматаар эргүүлэх"</string>
+ <string name="accelerometer_summary_on" product="tablet" msgid="6413384391658481700">"Таблетыг эргүүлбэл харагдцыг автоматаар эргүүлэх"</string>
+ <string name="accelerometer_summary_on" product="default" msgid="7117139542131700779">"Утсыг эргүүлбэл харагдцыг автоматаар эргүүлэх"</string>
+ <string name="accelerometer_summary_off" product="tablet" msgid="3747370091309939684">"Таблетыг эргүүлбэл харагдцыг автоматаар эргүүлэх"</string>
+ <string name="accelerometer_summary_off" product="default" msgid="4451125241783158763">"Утсыг эргүүлбэл харагдцыг автоматаар эргүүлэх"</string>
<string name="brightness" msgid="6216871641021779698">"Гэрэлтүүлгийн түвшин"</string>
<string name="brightness_title" msgid="5457874893085305155">"Тодролт"</string>
<string name="brightness_summary" msgid="6309641759293018049">"Дэлгэцийн тодролыг тохируулах"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN устгах"</string>
<string name="menu_new" msgid="6571230342655509006">"Шинэ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Хадгалах"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Цуцлах"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Цуцлах"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Нэр оруулах талбар хоосон байж болохгүй."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN хоосон байж болохгүй."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Аппуудыг шинэчлэх боломжтой"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, мобайл & Bluetooth-г шинэчлэх"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Энэ нь дараах бүх сүлжээний тохиргоог шинэчилнэ: \n\n"<li>"Wi‑Fi"</li>\n<li>"мобайл дата"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Устгах"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Татаж авсан СИМ-үүдийг устгах"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Солих СИМ-г татаж авахын тулд оператор компанитайгаа холбогдоно уу. Энэ нь мобайл үйлчилгээний ямар ч багцыг цуцлахгүй."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Энэ нь мобайл үйлчилгээний аливаа төлөвлөгөөг цуцлахгүй. Орлуулах SIM татахын тулд оператор компанитайгаа холбогдоно уу."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Дахин тохируулах"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Сүлжээний бүх тохиргоог шинэчлэх үү? Та энэ үйлдлийг буцаах боломжгүй."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Сүлжээний бүх тохиргоог шинэчилж, татсан СИМ-үүдийг устгах уу? Та энэ үйлдлийг буцаах боломжгүй."</string>
@@ -2166,7 +2166,7 @@
<string name="accessibility_screen_magnification_short_summary" msgid="2207048420669939150">"Томруулахын тулд 3 удаа дар"</string>
<string name="accessibility_screen_magnification_navbar_short_summary" msgid="4885018322430052037">"Томруулахын тулд товчлуурыг товшино уу"</string>
<string name="accessibility_screen_magnification_summary" msgid="2023126829553044999">"Контентыг илүү тодорхой үзүүлэхийн тулд дэлгэц дээр хурдан томруулна уу.<br/><br/> <b>Томруулахын тулд:</b><br/> 1. Томруулах онцлогийг эхлүүлэхийн тулд товчлол ашиглана уу<br/> 2. Дэлгэцийг товшино уу<br/> 3. Дэлгэц дээр шилжихийн тулд 2 хуруугаар чирнэ үү<br/> 4. Томруулалтыг тохируулахын тулд 2 хуруугаар чимхэнэ үү<br/> 5. Томруулах онцлогийг зогсоохын тулд товчлол ашиглана уу<br/><br/> <b>Түр хугацаанд томруулахын тулд:</b><br/> 1. Томруулах онцлогийг эхлүүлэхийн тулд товчлол ашиглана уу<br/> 2. Дэлгэцийн аль нэг хэсэгт удаан дарна уу<br/> 3. Дэлгэц дээр шилжихийн тулд хуруугаар чирнэ үү<br/> 4. Томруулах онцлогийг зогсоохын тулд хуруугаа өргөнө үү"</string>
- <string name="accessibility_screen_magnification_navbar_summary" msgid="807985499898802296">"Томруулах сонголт асаалттай үед та дэлгэцээ томруулж болно.\n\n"<b>"Томруулахын тулд "</b>" томруулах сонголтыг эхлүүлж, дэлгэцийн аль нэг хэсгийг товшино уу.\n"<ul><li>"Гүйлгэхийн тулд 2 эсвэл түүнээс дээш хуруугаараа чирнэ үү"</li>\n<li>"Томруулах хэмжээг тохируулахын тулд 2 эсвэл түүнээс дээш хуруугаараа чимхэнэ үү"</li></ul>\n\n<b>"Түр хугацаанд томруулахын тулд "</b>" томруулах сонголтыг эхлүүлээд, дэлгэцийн аль нэг хэсэг дээр удаан дарна уу.\n"<ul><li>"Дэлгэцийн эргэн тойронд очихын тулд чирнэ үү"</li>\n<li>"Жижигрүүлэхийн тулд хуруугаа авна уу"</li></ul>\n\n"Та гар эсвэл навигацийн самбарт томруулах боломжгүй."</string>
+ <string name="accessibility_screen_magnification_navbar_summary" msgid="807985499898802296">"Томруулах сонголт асаалттай үед та дэлгэцээ томруулж болно.\n\n"<b>"Томруулахын тулд "</b>" томруулах сонголтыг эхлүүлж, дэлгэцийн аль нэг хэсгийг товшино уу.\n"<ul><li>"Гүйлгэхийн тулд 2 эсвэл түүнээс дээш хуруугаараа чирнэ үү"</li>\n<li>"Томруулах хэмжээг тохируулахын тулд 2 эсвэл түүнээс дээш хуруугаараа чимхэнэ үү"</li></ul>\n\n<b>"Түр хугацаанд томруулахын тулд "</b>" томруулах сонголтыг эхлүүлээд, дэлгэцийн аль нэг хэсэг дээр удаан дарна уу.\n"<ul><li>"Дэлгэцийн эргэн тойронд очихын тулд чирнэ үү"</li>\n<li>"Жижигрүүлэхийн тулд хуруугаа авна уу"</li></ul>\n\n"Та гар эсвэл навигацын самбарт томруулах боломжгүй."</string>
<string name="accessibility_tutorial_pager" msgid="8461939455728454061">"<xliff:g id="NUM_PAGES">%2$d</xliff:g>-н <xliff:g id="CURRENT_PAGE">%1$d</xliff:g>-р хуудас"</string>
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Нээхийн тулд хандалтын товчлуурыг ашиглах"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Нээхийн тулд дууны түвшний түлхүүрүүдийг удаан дар"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Таблетыг ердийнхөөс их хэмжээгээр ашигласан"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Төхөөрөмжийг ердийнхөөс их хэмжээгээр ашигласан"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Батарей ердийн үеийнхээс хурдан дуусаж болзошгүй"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Батарей барилтыг хадгалах"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Батарейн барилтыг оновчилж байна"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Батарейг түр хугацаанд хязгаарласан. Нэмэлт мэдээлэл авахын тулд товшино уу."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Таны утсыг ердийн үеийнхээс их хэмжээгээр ашигласан байна. Таны батарей тооцоолж байснаас хурдан дуусаж болзошгүй.\n\nБатарейг хамгийн их ашигласан аппууд:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Таны таблетыг ердийн үеийнхээс их хэмжээгээр ашигласан байна. Таны батарей тооцоолж байснаас хурдан дуусаж болзошгүй.\n\nБатарейг хамгийн их ашигласан аппууд:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Харагдах өгөгдлийн багцийн дээд хэмжээ"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Өгөгдмөл утга руу шинэчлэх"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Хөгжүүлэгчийн тохиргоог автоматаар бөглөх хэсгийг шинэчилсэн"</string>
+ <string name="location_category" msgid="3496759112306219062">"Байршил"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Статус самбарын байршлын заалт"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Сүлжээ болон холболтыг оруулаад бүх байршлыг харуулна"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Бүтэн GNSS хэмжилтийг хүчлэх"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Бүх GNSS орд болон давтамжийг давтамжийн түвшингүйгээр шинжлэх"</string>
<string name="device_theme" msgid="5027604586494772471">"Төхөөрөмжийн загвар"</string>
<string name="default_theme" msgid="4815428567082263639">"Өгөгдмөл"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Сүлжээний нэр"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Төвлөрсөн хэвэрэ байхын тулд мэдэгдлийг түр зогсоох"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Онцлог боломжгүй байна"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Энэ онцлог таны утсыг удаашруулж буй тул үүнийг унтраасан"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Бүтэн GNSS хэмжилтийг хүчлэх"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Бүх GNSS орд болон давтамжийг давтамжийн түвшингүйгээр шинжлэх"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Гэмтлийн харилцах цонхыг тогтмол харуулах"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Харилцах цонхыг апп гэмтэх бүрд харуулах"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ӨНЦӨГ идэвхжүүлсэн аппыг сонгох"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi дуудлага нь танд зарим Wi-Fi сүлжээ гэх мэт оператор компанийн бус сүлжээгээр дуудлага хийх болон хүлээн авах боломжийг олгодог."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Дуудлага"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"сонгосон"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"дуудлагыг сонгосон"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS-г сонгосон"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"боломжгүй"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM байхгүй"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Сонголт"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Олон нийтийн Wi-Fi сүлжээнд холбогдох"</string>
<string name="keywords_internet" msgid="7674082764898690310">"сүлжээний холболт, интернэт, утасгүй интернэт, дата, wifi, wi-fi, wi fi, үүрэн холбоо, мобайл, үүрэн холбооны оператор, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Унтлагын цагийн горим асаалттай байгаа тул боломжгүй"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Мэдэгдлийн ач холбогдлыг шинэчилж дууссан."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Аппууд"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Итгэмжлэгдээгүй төхөөрөмж таны мессежид хандахыг хүсэж байна. Дэлгэрэнгүйг харахын тулд товшино уу."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Мессежид хандахыг зөвшөөрөх үү?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Итгэмжлэгдээгүй Bluetooth төхөөрөмж болох [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] таны мессежид хандахыг хүсэж байна.\n\nТа өмнө нь [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]-д холбогдож байгаагүй."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Итгэмжлэгдээгүй төхөөрөмж таны харилцагчид болон дуудлагын жагсаалтад хандахыг хүсэж байна. Дэлгэрэнгүйг харахын тулд товшино уу."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Харилцагчид болон дуудлагын жагсаалтад хандахыг зөвшөөрөх үү?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Итгэмжлэгдээгүй Bluetooth төхөөрөмж болох [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] таны харилцагчид болон дуудлагын жагсаалтад хандахыг хүсэж байна. Үүнд ирж буй болон залгасан дуудлагын талаарх өгөгдөл багтана.\n\nТа өмнө нь [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]-д холбогдож байгаагүй."</string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 0c3174f..fdd5bac 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 अॅड्रेस"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"सेव्ह केलेली नेटवर्क"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"सदस्यत्वे"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"इतर नेटवर्क"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP सेटिंग्ज"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"वाय‑फाय प्रगत सेटिंग्ज या वापरकर्त्यासाठी उपलब्ध नाहीत"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"सेव्ह करा"</string>
@@ -1598,7 +1597,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN हटवा"</string>
<string name="menu_new" msgid="6571230342655509006">"नवीन APN"</string>
<string name="menu_save" msgid="6611465355127483100">"सेव्ह करा"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"टाकून द्या"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"रद्द करा"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"नाव फील्ड रिक्त असू शकत नाही."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN रिक्त असू शकत नाही."</string>
@@ -1613,8 +1612,11 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ॲप्स रीसेट केली जाऊ शकतात"</string>
<string name="reset_network_title" msgid="1395494440355807616">"वाय-फाय, मोबाइल आणि ब्लूटूथ रीसेट करा"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"हे यांसह सर्व नेटवर्क सेटिंग्ज रीसेट करेल:\n\n"<li>"वाय‑फाय"</li>\n<li>"मोबाइल डेटा"</li>\n<li>"ब्लूटुथ"</li></string>
+ <!-- no translation found for erase_euicc_data_button (728078969563311737) -->
+ <skip />
<string name="reset_esim_title" msgid="6152167073280852849">"डाउनलोड केलेली सिम मिटवा"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"बदली सिम डाउनलोड करण्यासाठी तुमच्या वाहकाशी संपर्क साधा. हे केल्याने कोणतेही मोबाइल सेवा प्लॅन रद्द होणार नाहीत."</string>
+ <!-- no translation found for reset_esim_desc (3662444090563399131) -->
+ <skip />
<string name="reset_network_button_text" msgid="2281476496459610071">"सेटिंग्ज रीसेट करा"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"सर्व नेटवर्क सेटिंग्ज रीसेट करायची? तुम्ही ही कृती पहिल्यासारखी करू शकत नाही."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"सर्व नेटवर्क सेटिंग्ज रीसेट करायची आणि डाउनलोड केलेली सिम मिटवायची? तुम्ही ही कृती पहिल्यासारखी करू शकत नाही."</string>
@@ -2457,10 +2459,9 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"टॅबलेट नेहमीपेक्षा जास्त वापरले गेला"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"डिव्हाइस नेहमीपेक्षा जास्त वापरले गेले"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"बॅटरी नेहमीपेक्षा लवकर संपू शकते"</string>
- <!-- no translation found for battery_tip_limited_temporarily_title (3532338978617826383) -->
+ <!-- no translation found for battery_tip_limited_temporarily_title (7152799456221596915) -->
<skip />
- <!-- no translation found for battery_tip_limited_temporarily_summary (6837061824463128857) -->
- <skip />
+ <string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"बॅटरी तात्पुरती मर्यादित आहे. अधिक जाणून घेण्यासाठी टॅप करा."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"तुमचा फोन नेहमीपेक्षा जास्त वापरला गेला आहे. तुमची बॅटरी अपेक्षेपेक्षा लवकर संपू शकते.\n\nबॅटरीच्या वापरावर आधारित टॉप अॅप्स:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"तुमचा टॅबलेट नेहमीपेक्षा जास्त वापरला गेला आहे. तुमची बॅटरी अपेक्षेपेक्षा लवकर संपू शकते.\n\nबॅटरीच्या वापरावर आधारित टॉप अॅप्स:"</string>
<string name="battery_tip_dialog_message" product="device" msgid="2620789680336796054">"तुमचे डिव्हाइस नेहमीपेक्षा जास्त वापरले गेले आहे. तुमची बॅटरी अपेक्षेपेक्षा लवकर संपू शकते.\n\nबॅटरीच्या वापरावर आधारित टॉप अॅप्स:"</string>
@@ -4654,6 +4655,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"कमाल दृश्यमान डेटासेट"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"डीफॉल्ट मूल्यांवर रीसेट करा"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ऑटोफिल डेव्हलपर पर्याय रीसेट केले गेले आहेत"</string>
+ <string name="location_category" msgid="3496759112306219062">"स्थान"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"स्टेटस बारचा स्थान इंडिकेटर"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"नेटवर्क आणि कनेक्टिव्हिटीसह सर्व स्थानांसाठी दाखवा"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"पूर्ण GNSS मापांची सक्ती करा"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"कुठल्याही ड्युटी सायकलिंग शिवाय सर्व GNSS तारामंडळे आणि वारंवारता ट्रॅक करा"</string>
<string name="device_theme" msgid="5027604586494772471">"डिव्हाइस थीम"</string>
<string name="default_theme" msgid="4815428567082263639">"डीफॉल्ट"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"नेटवर्कचे नाव"</string>
@@ -4670,8 +4676,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"लक्ष केंद्रित केलेले राहण्यासाठी सूचना थांंबवा"</string>
<string name="disabled_feature" msgid="7151433782819744211">"वैशिष्ट्य उपलब्ध नाही"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"हे वैशिष्ट्य बंद केले गेले आहे कारण, ते तुमच्या फोनला धीमे करते"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"पूर्ण GNSS मापांची सक्ती करा"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"कुठल्याही ड्युटी सायकलिंग शिवाय सर्व GNSS तारामंडळे आणि वारंवारता ट्रॅक करा"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"नेहमी क्रॅश डायलॉग दाखवा"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"अॅप क्रॅश झाल्यावर प्रत्येक वेळी डायलॉग दाखवा"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE सुरू केलेले अॅप निवडा"</string>
@@ -4899,14 +4903,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"सिम ॲक्टिव्हेट करू शकत नाही"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"सिम काढा आणि ते पुन्हा घाला. समस्या कायम राहिल्यास, तुमचे डिव्हाइस रीस्टार्ट करा."</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"सिम पुन्हा सुरू करून पाहा. समस्या सुरू राहिल्यास, तुमचे डिव्हाइस रीस्टार्ट करा."</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"नेटवर्क अॅक्टिव्हेशन"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> अॅक्टिव्ह आहे"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"सिमची सेटिंग्ज अपडेट करण्यासाठी टॅप करा"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"सिम कार्ड"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"हे डाउनलोड केलेले सिम मिटवायचे?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"हे सिम मिटवल्याने या डिव्हाइसवरून <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> सेवा काढली जाते.\n\n<xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> ची सेवा रद्द केली जाणार नाही."</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"मिटवा"</string>
@@ -5059,14 +5059,29 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"वाय-फाय कॉलिंग तुम्हाला वाय-फाय यांसारख्या वाहक नसलेल्या नेटवर्कवरून कॉल करण्याची आणि घेण्याची अनुमती देते."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"कॉल"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"एसएमएस"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"प्राधान्य दिलेले"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"कॉलला प्राधान्य आहे"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ला प्राधान्य आहे"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"उपलब्ध नाही"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"सिम नाही"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"प्राधान्ये"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"सार्वजनिक नेटवर्कशी कनेक्ट करा"</string>
<string name="keywords_internet" msgid="7674082764898690310">"नेटवर्क कनेक्शन, इंटरनेट, वायरलेस, डेटा, वायफाय, वाय-फाय, वाय फाय, सेल्युलर, मोबाइल, सेल वाहक, 4g, 3g, 2g, LTE"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"विमानात वापरण्यास सुरक्षित नेटवर्क पहा"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"विमान मोड बंद करा"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"बेडटाइम मोड सुरू असल्यामुळे उपलब्ध नाही"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"सूचनांचे महत्त्व रीसेट करणे पूर्ण झाले."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ॲप्स"</string>
+ <!-- no translation found for bluetooth_message_access_notification_content (2986108412562309009) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_title (9009836130395061579) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_content (6004506637437582983) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_notification_content (4280361621526852063) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_title (7624607995928968721) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_content (2235876209172857819) -->
+ <skip />
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 5f4ae54..f3170e5 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Alamat IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Rangkaian disimpan"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Langganan"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Rangkaian lain"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Tetapan IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Tetapan terperinci Wi-Fi tidak tersedia untuk pengguna ini"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Simpan"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Padam APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN Baharu"</string>
<string name="menu_save" msgid="6611465355127483100">"Simpan"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Buang"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Batal"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Medan Nama tidak boleh kosong."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN tidak boleh kosong."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apl boleh ditetapkan semula"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Tetapkan semula Wi-Fi, mudah alih & Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Tindakan ini akan menetapkan semula semua tetapan rangkaian, termasuk:\n\n"<li>"Wi‑Fi"</li>\n<li>"Data mudah alih"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Padam"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Padamkan SIM yang dimuat turun"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Untuk memuat turun SIM gantian, hubungi pembawa anda. Tindakan ini tidak akan membatalkan sebarang pelan perkhidmatan mudah alih."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Tindakan ini tidak akan membatalkan mana-mana pelan perkhidmatan mudah alih. Untuk memuat turun SIM gantian, hubungi pembawa anda."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Tetapkan semula tetapan"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Tetapkan semula semua tetapan rangkaian? Tindakan ini tidak boleh dibuat asal."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Tetapkan semula semua tetapan rangkaian dan padamkan SIM yang dimuat turun? Tindakan ini tidak boleh dibuat asal."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet digunakan lebih kerap berbanding biasa"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Peranti digunakan lebih kerap berbanding biasa"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Bateri mungkin kehabisan lebih awal daripada biasa"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Memelihara kesihatan bateri"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Pengoptimuman untuk kesihatan bateri"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateri terhad untuk sementara. Ketik untuk mengetahui lebih lanjut."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefon anda telah digunakan lebih kerap berbanding biasa. Bateri anda mungkin kehabisan lebih cepat daripada jangkaan.\n\nApl yang paling banyak digunakan mengikut penggunaan bateri:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablet anda telah digunakan lebih kerap berbanding biasa. Bateri anda mungkin kehabisan lebih cepat daripada jangkaan.\n\nApl yang paling banyak digunakan mengikut penggunaan bateri:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Set data maksimum yang kelihatan"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Tetapkan semula kepada nilai lalai"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Ciri autolengkapkan pilihan pembangun telah ditetapkan semula"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokasi"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Penunjuk lokasi bar status"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Tunjukkan untuk semua lokasi, termasuk rangkaian dan kesambungan"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Paksa ukuran GNSS penuh"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Jejak semua gugusan dan kekerapan GNSS tanpa kitaran tugas"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema peranti"</string>
<string name="default_theme" msgid="4815428567082263639">"Lalai"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nama rangkaian"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Jeda pemberitahuan untuk mengekalkan tumpuan"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Ciri tidak tersedia"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ciri ini telah dimatikan kerana memperlahankan telefon anda"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Paksa ukuran GNSS penuh"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Jejak semua gugusan dan kekerapan GNSS tanpa kitaran tugas"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Sentiasa tunjukkan dialog ranap sistem"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Tunjukkan dialog setiap kali apl ranap"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Pilih apl didayakan ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Panggilan Wi-Fi membolehkan anda membuat dan menerima panggilan melalui rangkaian bukan pembawa seperti sesetengah rangkaian Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Panggilan"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"diutamakan"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"panggilan diutamakan"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS diutamakan"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"tidak tersedia"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Tiada SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Pilihan"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Sambungkan kepada rangkaian awam"</string>
<string name="keywords_internet" msgid="7674082764898690310">"sambungan rangkaian, internet, wayarles, data, wifi, wi-fi, wi fi, selular, mudah alih, pembawa selular, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Tidak tersedia kerana mod waktu tidur dihidupkan"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Selesai menetapkan semula kepentingan pemberitahuan."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apl"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Peranti yang tidak dipercayai ingin mengakses mesej anda. Ketik untuk mendapatkan butiran."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Benarkan akses kepada mesej?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Peranti Bluetooth yang tidak dipercayai, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ingin mengakses mesej anda.\n\nAnda belum pernah disambungkan kepada [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Peranti yang tidak dipercayai ingin mengakses kenalan dan log panggilan anda. Ketik untuk mendapatkan butiran."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Benarkan akses kepada kenalan dan log panggilan?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Peranti Bluetooth yang tidak dipercayai, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ingn mengakses kenalan dan log panggilan anda. Ini termasuk data tentang panggilan masuk dan keluar.\n\nAnda belum pernah disambungkan kepada [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 0d02451..d5fec3a 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 လိပ်စာများ"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"သိမ်းထား ကွန်ရက်များ"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"စာရင်းသွင်းခြင်းများ"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"အခြားကွန်ရက်များ"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ဆက်တင်များ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Wi‑Fi အဆင့်မြှင့်ဆက်တင်များ ဤအသုံးပြုသူအတွက် မရပါ။"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"သိမ်းရန်"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APNကိုဖျက်မည်"</string>
<string name="menu_new" msgid="6571230342655509006">"APN အသစ်"</string>
<string name="menu_save" msgid="6611465355127483100">"သိမ်းရန်"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ဖယ်ပစ်ရန်"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"မလုပ်တော့"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"အမည်အကွက်မှာ ကွက်လပ်ဖြစ်မနေစေရပါ"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APNမှာ ကွက်လပ်ဖြစ်မနေစေရပါ"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"အက်ပ်များကို ပြင်ဆင်သတ်မှတ်နိုင်သည်"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi၊ မိုဘိုင်း၊ ဘလူးတုသ် ပြင်ဆင်သတ်မှတ်ရန်"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"၎င်းသည် အောက်ပါတို့အပါအဝင် ကွန်ရက်ဆက်တင်များအားလုံးကို ပြင်ဆင်သတ်မှတ်လိုက်ပါမည်−\n\n"<li>"Wi‑Fi"</li>\n<li>"မိုဘိုင်းဒေတာ"</li>\n<li>"ဘလူးတုသ်"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ဖျက်ရန်"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ဒေါင်းလုဒ်လုပ်ထားသောကတ် ဖျက်ပါ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"အစားထိုး ဆင်းမ်ကတ်များ ဒေါင်းလုဒ်လုပ်ရန် သင့်ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။ ၎င်းက မိုဘိုင်းဝန်ဆောင်မှု အစီအစဉ်များကို ပယ်ဖျက်မည်မဟုတ်ပါ။"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"၎င်းက မိုဘိုင်းဝန်ဆောင်မှု အစီအစဉ်များကို ပယ်ဖျက်မည်မဟုတ်ပါ။ အစားထိုး ဆင်းမ်ကတ်များ ဒေါင်းလုဒ်လုပ်ရန် သင့်ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ဆက်တင်များ ပြင်ဆင်သတ်မှတ်ရန်"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ကွန်ရက်ဆက်တင်များ အားလုံးကို ပြင်ဆင်သတ်မှတ်လိုပါသလား။ ဤလုပ်ဆောင်ချက်ကို ပြန်ပြင်၍ မရပါ။"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ကွန်ရက်ဆက်တင်အားလုံး ပြင်ဆင်သတ်မှတ်ပြီး ဒေါင်းလုဒ်လုပ်ထားသော ဆင်းမ်ကတ်များကို ဖျက်လိုသလား။ ဤလုပ်ဆောင်ချက်ကို ပြန်ပြင်၍ မရပါ။"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"တက်ဘလက်ကို ပုံမှန်ထက် ပိုသုံးထားသည်"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"စက်ပစ္စည်းကို ပုံမှန်ထက် ပိုသုံးထားသည်"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ပုံမှန်ထက် ဘက်ထရီ အကုန်မြန်နိုင်သည်"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ဘက်ထရီအခြေအနေ ထိန်းသိမ်းခြင်း"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"ဘက်ထရီအခြေအနေကို အကောင်းဆုံးဖြစ်အောင် လုပ်နေသည်"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ဘက်ထရီ ယာယီကန့်သတ်ထားသည်။ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"သင့်ဖုန်းကို ပုံမှန်ထက် ပိုသုံးထားသည်။ သင့်ဘက်ထရီသည် ခန့်မှန်းထားသည်ထက် စောလျင်စွာ ကုန်နိုင်ပါသည်။\n\nဘက်ထရီ အများဆုံး အသုံးပြုနေသည့် အက်ပ်များမှာ−"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"သင့်တက်ဘလက်ကို ပုံမှန်ထက် ပိုသုံးထားသည်။ သင့်ဘက်ထရီသည် ခန့်မှန်းထားသည်ထက် စောလျင်စွာ ကုန်နိုင်ပါသည်။\n\nဘက်ထရီ အများဆုံး အသုံးပြုနေသည့် အက်ပ်များမှာ−"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"အများဆုံးမြင်နိုင်သည့် ဒေတာအတွဲ အရေအတွက်"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"မူရင်းတန်ဖိုးများသို့ ပြင်ဆင်သတ်မှတ်ထားသည်"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"တီထွင်သူများရွေးစရာ အလိုအလျောက်ဖြည့်ခြင်းကို ပြင်ဆင်သတ်မှတ်ထားသည်"</string>
+ <string name="location_category" msgid="3496759112306219062">"တည်နေရာ"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"အခြေအနေပြဘား တည်နေရာအညွှန်း"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ကွန်ရက်နှင့် ချိတ်ဆက်နိုင်မှုတို့ ပါဝင်သည့် တည်နေရာအားလုံးအတွက် ပြသည်"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS အတိုင်းအတာအပြည့် သက်ရောက်ရန်"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"လည်ပတ်ချိန်မပါဘဲ GNSS စက်ဝိုင်းပုံမြင်ကွင်းကျယ်ပုံများနှင့် ကြိမ်နှုန်းအားလုံးကို ခြေရာခံပါ"</string>
<string name="device_theme" msgid="5027604586494772471">"စက်ပစ္စည်း အပြင်အဆင်"</string>
<string name="default_theme" msgid="4815428567082263639">"မူရင်း"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ကွန်ရက် အမည်"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"အာရုံစူးစိုက်နိုင်ရန် အကြောင်းကြားချက်များကို ခေတ္တရပ်ထားပါ"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ဝန်ဆောင်မှု မရနိုင်ပါ။"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ဤဝန်ဆောင်မှုသည် သင့်ဖုန်းကို နှေးစေသောကြောင့် ၎င်းကို ပိတ်ထားပါသည်"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS အတိုင်းအတာအပြည့် သက်ရောက်ရန်"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"လည်ပတ်ချိန်မပါဘဲ GNSS စက်ဝိုင်းပုံမြင်ကွင်းကျယ်ပုံများနှင့် ကြိမ်နှုန်းအားလုံးကို ခြေရာခံပါ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ရပ်တန့်သွားမှု ဒိုင်ယာလော့ကို အမြဲပြရန်"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"အက်ပ်ရပ်တန့်သွားသည့်အခါတိုင်း ဒိုင်ယာလော့ကို ပြရန်"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE ကို ဖွင့်ထားသည့်အက်ပ်ကို ရွေးပါ"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi‑Fi ခေါ်ဆိုမှုက Wi-Fi ကွန်ရက်အချို့ကဲ့သို့သော ဖုန်းဝန်ဆောင်မှုပေးသူမဟုတ်သည့် ကွန်ရက်များတွင် ဖုန်းခေါ်ဆိုရန်နှင့် လက်ခံရန် ခွင့်ပြုပေးသည်။"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ခေါ်ဆိုမှုများ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ဦးစားပေး"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ခေါ်ဆိုမှုများ ဦးစားပေး"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ဦးစားပေး"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"မရနိုင်ပါ"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM မရှိပါ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ရွေးချယ်မှုများ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"အများသုံးကွန်ရက်များသို့ ချိတ်ဆက်လိုက်သည်"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ကွန်ရက်ချိတ်ဆက်မှု၊ အင်တာနက်၊ ကြိုးမဲ့၊ ဒေတာ၊ wifi၊ wi-fi၊ wi fi၊ ဆယ်လူလာ၊ မိုဘိုင်း၊ ဖုန်းဝန်ဆောင်မှုပေးသူ၊ 4g၊ 3g၊ 2g၊ lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"အိပ်ချိန်မုဒ်ကို ဖွင့်ထားသောကြောင့် မရရှိနိုင်ပါ"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"အကြောင်းကြားချက်၏ အရေးပါမှုကို ပြင်ဆင်သတ်မှတ်ပြီးပါပြီ။"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"အက်ပ်များ"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"မယုံကြည်ရသော စက်ပစ္စည်းက သင်၏ မက်ဆေ့ဂျ်များကို အသုံးပြုလိုသည်။ အသေးစိတ်အချက်အလက်များအတွက် တို့ပါ။"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"မက်ဆေ့ဂျ်များကို အသုံးပြုခွင့်ပေးမလား။"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"မယုံကြည်ရသော ဘလူးတုသ်သုံးစက်၊ [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]၊ က သင်၏ မက်ဆေ့ဂျ်များကို အသုံးပြုလိုသည်။\n\nသင်သည် [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ကို ယခင်က မချိတ်ဆက်ဖူးပါ။"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"မယုံကြည်ရသော စက်ပစ္စည်းက သင်၏ အဆက်အသွယ်များနှင့် ခေါ်ဆိုမှုမှတ်တမ်းကို အသုံးပြုလိုသည်။ အသေးစိတ်အချက်အလက်များအတွက် တို့ပါ။"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"အဆက်အသွယ်များနှင့် ခေါ်ဆိုမှုမှတ်တမ်းကို အသုံးပြုခွင့်ပေးမလား။"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"မယုံကြည်ရသော ဘလူးတုသ်သုံးစက်၊ [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]၊ က သင်၏ အဆက်အသွယ်များနှင့် ခေါ်ဆိုမှုမှတ်တမ်းကို အသုံးပြုလိုသည်။ ၎င်းတွင် အဝင်နှင့် အထွက်ခေါ်ဆိုမှုများဆိုင်ရာ ဒေတာ ပါဝင်သည်။\n\nသင်သည် [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ကို ယခင်က မချိတ်ဆက်ဖူးပါ။"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 7683bec..f8b0ab1 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-adresser"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Lagrede nettverk"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonnementer"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Andre nettverk"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-innstillinger"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"De avanserte innstillingene for Wi-Fi er ikke tilgjengelig for denne brukeren"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Lagre"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Slett APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nytt APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Lagre"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Forkast"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Avbryt"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Navnefeltet kan ikke være tomt."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN kan ikke være tomt."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apper kan tilbakestilles"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Tilbakestill Wi-Fi, mobil og Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Dette tilbakestiller alle nettverksinnstillinger, inkludert\n\n"<li>"Wi‑Fi"</li>\n<li>"mobildata"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Tøm"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Slett nedlastede SIM-kort"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Kontakt operatøren din for å laste ned erstatnings-SIM-kort. Dette kansellerer ingen mobilabonnementer."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Dette kansellerer ingen mobilabonnementer. Kontakt operatøren din for å laste ned erstatnings-SIM-kort."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Tilbakestill innstillingene"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Vil du tilbakestille alle nettverksinnstillingene? Denne handlingen kan ikke angres."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Vil du tilbakestille alle nettverksinnstillingene og slette nedlastede SIM-kort? Denne handlingen kan ikke angres."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Nettbrettet brukes mer enn vanlig"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Enheten brukes mer enn vanlig"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batteriet kan gå tomt raskere enn vanlig"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Bevarer batteritilstanden"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimaliserer batteritilstanden"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batteriet er midlertidig begrenset. Trykk for å finne ut mer."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefonen din har blitt brukt mer enn vanlig. Batteriet kan gå tomt raskere enn forventet.\n\nApper med høyest batteribruk:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Nettbrettet ditt har blitt brukt mer enn vanlig. Batteriet kan gå tomt raskere enn forventet.\n\nApper med høyest batteribruk:"</string>
@@ -2695,7 +2695,7 @@
<string name="tts_reset" msgid="9047681050813970031">"Tilbakestill"</string>
<string name="tts_play" msgid="2945513377250757221">"Spill av"</string>
<string name="vpn_settings_title" msgid="9131315656202257272">"VPN"</string>
- <string name="adaptive_connectivity_title" msgid="7464959640138428192">"Selvjusterende tilkobling"</string>
+ <string name="adaptive_connectivity_title" msgid="7464959640138428192">"Adaptive Connectivity"</string>
<string name="adaptive_connectivity_summary" msgid="3648731530666326885">"Forlenger batterilevetiden og enhetsytelsen ved å administrere nettverkstilkoblingene automatisk"</string>
<string name="credentials_title" msgid="7535942196886123656">"Legitimasjonslager"</string>
<string name="credentials_install" msgid="3933218407598415827">"Installer et sertifikat"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimalt antall synlige datasett"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Tilbakestill til standardverdier"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Autofyll av utvikleralternativer er tilbakestilt"</string>
+ <string name="location_category" msgid="3496759112306219062">"Posisjon"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Statusfelt for posisjonsindikator"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Vis for alle posisjoner, inkludert nettverk og tilkobling"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Tving fullstendige GNSS-målinger"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spor alle GNSS-konstellasjoner og -frekvenser uten syklus for oppgaver"</string>
<string name="device_theme" msgid="5027604586494772471">"Enhetstema"</string>
<string name="default_theme" msgid="4815428567082263639">"Standard"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nettverksnavn"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Sett varsler på pause for å holde deg fokusert"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funksjonen er ikke tilgjengelig"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Denne funksjonen er slått av fordi den gjør telefonen din tregere"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Tving fullstendige GNSS-målinger"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spor alle GNSS-konstellasjoner og -frekvenser uten syklus for oppgaver"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Vis alltid krasjdialogboksen"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Vis dialogboksen hver gang en app krasjer"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Velg en ANGLE-aktivert app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Med Wi-Fi-anrop kan du ringe og motta anrop via nettverk utenfor operatøren, for eksempel noen Wi-Fi-nettverk."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Anrop"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"foretrukket"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"anrop foretrekkes"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS foretrekkes"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"utilgjengelig"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Uten SIM-kort"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Innstillinger"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Koble til offentlige nettverk"</string>
<string name="keywords_internet" msgid="7674082764898690310">"nettverkstilkobling, internett, trådløs, data, wifi, wi-fi, wi fi, mobilnett, mobil, mobiloperatør, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Utilgjengelig fordi sengetidsmodus er på"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Tilbakestilling av viktighet for varsler er fullført."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apper"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"En enhet som ikke er klarert, vil ha tilgang til meldingene dine. Trykk for å se mer informasjon."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vil du gi tilgang til meldinger?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"En Bluetooth-enhet som ikke er klarert, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vil ha tilgang til meldingene dine.\n\nDu har ikke koblet til [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] tidligere."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"En enhet som ikke er klarert, vil ha tilgang til kontaktene dine og samtaleloggen din. Trykk for å se mer informasjon."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vil du gi tilgang til kontaktene og samtaleloggen?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"En Bluetooth-enhet som ikke er klarert, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vil ha tilgang til kontaktene dine og samtaleloggen din. Dette inkluderer data om innkommende og utgående anrop.\n\nDu har ikke koblet til [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] tidligere."</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 32d25d8..3a811d9 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ठेगानाहरू"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"सेभ गरिएका नेटवर्कहरू"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"सदस्यताहरू"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"अन्य नेटवर्कहरू"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP सेटिङहरू"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"यस प्रयोगकर्ताका लागि Wi‑Fi उन्नत सम्बन्धी सेटिङहरू उपलब्ध छैनन्"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"सुरक्षित गर्नुहोस्"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN मेटाउनुहोस्"</string>
<string name="menu_new" msgid="6571230342655509006">"नयाँ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"सुरक्षित गर्नुहोस्"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"त्याग्नुहोस्"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"रद्द गर्नु…"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"नाम फिल्ड खाली हुन सक्तैन।"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN खाली हुन सक्तैन।"</string>
@@ -1612,8 +1611,11 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"एपहरू रिसेट गरिन सक्छ"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, मोबाइल र ब्लुटुथ रिसेट गर्नुहोस्"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"यसले निम्न सेटिङहरू लगायत सम्पूर्ण नेटवर्क सम्बन्धी सेटिहरूलाई रिसेट गर्ने छ:\n\n"<li>"Wi‑Fi"</li>\n<li>"मोबाइल डेटा"</li>\n<li>"ब्लुटुथ"</li></string>
+ <!-- no translation found for erase_euicc_data_button (728078969563311737) -->
+ <skip />
<string name="reset_esim_title" msgid="6152167073280852849">"डाउनलोड गरिएका SIM हरू मेट्नुहोस्"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"प्रतिस्थापनका लागि SIM हरू डाउनलोड गर्न आफ्ना सेवा प्रदायकसँग सम्पर्क गर्नुहोस्। यसले मोबाइल सेवाको कुनै पनि योजना रद्द गर्ने छैन।"</string>
+ <!-- no translation found for reset_esim_desc (3662444090563399131) -->
+ <skip />
<string name="reset_network_button_text" msgid="2281476496459610071">"सेटिङहरू रिसेट गर्नुहोस्"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"नेटवर्कसम्बन्धी सबै सेटिङहरू रिसेट गर्ने हो? तपाईं यो कार्य उल्टाउन सक्नुहुन्न।"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"नेटवर्कसम्बन्धी सबै सेटिङहरू रिसेट गर्ने र डाउनलोड गरिएका SIM हरू मेटाउने हो? तपाईं यस कार्यलाई अन्डू गर्न सक्नुहुन्न!"</string>
@@ -2456,7 +2458,8 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ट्याब्लेट सामान्यभन्दा बढी प्रयोग भयो"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"यन्त्रलाई सामान्यभन्दा बढी प्रयोग भयो"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ब्याट्री अरू बेलाभन्दा छिटै सकिन सक्छ"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ब्याट्री लामो समयसम्म टिक्ने बनाइँदै छ"</string>
+ <!-- no translation found for battery_tip_limited_temporarily_title (7152799456221596915) -->
+ <skip />
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"केही समयका लागि ब्याट्रीको प्रयोग सीमित गरिएको छ। थप जान्न ट्याप गर्नुहोस्।"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"तपाईंको फोन सामान्यभन्दा धेरै प्रयोग भएको छ। तपाईंको ब्याट्रीको चार्ज अपेक्षा गरिएभन्दा चाँडो सकिन सक्छ।\n\nसबैभन्दा बढी ब्याट्री उपयोग गर्ने एपहरू:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"तपाईंको ट्याब्लेट सामान्यभन्दा धेरै प्रयोग भएको छ। तपाईंको ब्याट्रीको चार्ज अपेक्षा गरिएभन्दा चाँडो सकिन सक्छ।\n\nसबैभन्दा बढी ब्याट्री उपयोग गर्ने एपहरू:"</string>
@@ -4651,6 +4654,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"देख्न सकिने डेटासेटहरूको सङ्ख्या अधिकतम पार्नुहोस्"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"पूर्वनिर्धारित मानहरूमा रिसेट गर्नुहोस्"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"स्वतः भरणसम्बन्धी विकासकर्ताका विकल्पहरू रिसेट गरिएको छ"</string>
+ <string name="location_category" msgid="3496759112306219062">"स्थान"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"स्ट्याटस बारमा रहेको स्थानसम्बन्धी जानकारी दिने सूचक"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"नेटवर्क र कनेक्टिभिटीसहित सबै स्थानहरूको जानकारी देखाइयोस्"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"पूर्ण GNSS मापनहरू बलपूर्वक लागू गर्नुहोस्"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"कुनै उपयोगिता अनुपात बिना नै सबै GNSS कन्स्टेलेसन तथा फ्रिक्वेन्सीहरूलाई ट्र्याक गर्नुहोस्"</string>
<string name="device_theme" msgid="5027604586494772471">"यन्त्रको विषयवस्तु"</string>
<string name="default_theme" msgid="4815428567082263639">"पूर्वनिर्धारित"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"नेटवर्कको नाम"</string>
@@ -4667,8 +4675,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"केन्द्रित रहन सूचनाहरू पज गर्नुहोस्"</string>
<string name="disabled_feature" msgid="7151433782819744211">"सुविधा उपलब्ध छैन"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"यो सुविधाले तपाईंको फोन ढिलो बनाउने हुनाले यसलाई निष्क्रिय पारिएको छ"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"पूर्ण GNSS मापनहरू बलपूर्वक लागू गर्नुहोस्"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"कुनै उपयोगिता अनुपात बिना नै सबै GNSS कन्स्टेलेसन तथा फ्रिक्वेन्सीहरूलाई ट्र्याक गर्नुहोस्"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"सधैँ क्र्याससम्बन्धी संवाद देखाउनुस्"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"प्रत्येकपटक एप क्र्यास हुँदा संवाद देखाउनुहोस्"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"कोण सक्षम पारिएको एप चयन गर्नुहोस्"</string>
@@ -4896,14 +4902,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"SIM सक्रिय गर्न सकिएन"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"SIM बाहिर झिकेर फेरि हाल्नुहोस्। अझै समस्या रहिरह्यो भने आफ्नो यन्त्र रिस्टार्ट गर्नुहोस्।"</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"फेरि SIM सक्रिय गरी हेर्नुहोस्। अझै समस्या रहिरह्यो भने आफ्नो यन्त्र रिस्टार्ट गर्नुहोस्।"</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"नेटवर्क सक्रिय गर्ने प्रक्रिया"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> सक्रिय छ"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"SIM का सेटिङ परिवर्तन गर्न ट्याप गर्नुहोस्"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"SIM कार्ड"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"डाउनलोड गरिएको यो SIM मेटाउने हो?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"तपाईंले यो SIM मेटाउनुभयो भने यस यन्त्रबाट <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> सेवा हटाइने छ।\n\n <xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> को सेवा भने रद्द गरिने छैन।"</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"मेट्नुहोस्"</string>
@@ -5056,14 +5058,29 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"तपाईं Wi-Fi कलिङ सुविधा प्रयोग गरी केही Wi-Fi नेटवर्क जस्ता SIM रहित नेटवर्कमार्फत कल गर्न र कल प्राप्त गर्न सक्नुहुन्छ।"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"कलहरू"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"यो SIM कार्ड प्रयोग गरियोस्"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"यो SIM कार्ड कल गर्न प्रयोग गरियोस्"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"यो SIM कार्ड SMS पठाउन प्रयोग गरियोस्"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"उपलब्ध छैन"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM कार्ड छैन"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"प्राथमिकताहरू"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"सार्वजनिक Wi-Fi नेटवर्कमा कनेक्ट गरियोस्"</string>
<string name="keywords_internet" msgid="7674082764898690310">"नेटवर्क कनेक्सन, इन्टरनेट, वायरलेस, डेटा, wifi, wi-fi, wi fi, सेलुलर, मोबाइल, सेल सेवा प्रदायक, 4g, 3g, 2g, lte"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"हवाइजहाजमा सुरक्षित रूपमा प्रयोग गर्न सकिने नेटवर्कहरू हेर्नु…"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"हवाइजहाज मोड अफ गर्नुहोस्"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"बेडटाइम मोड अन हुँदा यो सुविधाले काम गर्दैन"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"सूचनाको प्राथमिकता रिसेट गर्ने कार्य पूरा भयो।"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"एपहरू"</string>
+ <!-- no translation found for bluetooth_message_access_notification_content (2986108412562309009) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_title (9009836130395061579) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_content (6004506637437582983) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_notification_content (4280361621526852063) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_title (7624607995928968721) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_content (2235876209172857819) -->
+ <skip />
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 8f39ccb..06d7c71 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-adressen"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Opgeslagen netwerken"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonnementen"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Andere netwerken"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-instellingen"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Geavanceerde wifi-instellingen zijn niet beschikbaar voor deze gebruiker"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Opslaan"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN verwijderen"</string>
<string name="menu_new" msgid="6571230342655509006">"Nieuwe APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Opslaan"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Weggooien"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Annuleren"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Het veld \'Naam\' mag niet leeg zijn."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"De APN mag niet leeg zijn."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Apps kunnen worden gereset"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wifi, mobiel en bluetooth resetten"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Hiermee worden alle netwerkinstellingen gereset, waaronder:\n\n"<li>"wifi"</li>\n<li>"mobiele data"</li>\n<li>"bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Wissen"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Gedownloade simkaarten wissen"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Neem contact op met je provider als je vervangende simkaarten wilt downloaden. Hiermee worden geen mobiele abonnementen opgezegd."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Hiermee zeg je geen mobiele abonnementen op. Neem contact op met je provider als je vervangende simkaarten wilt downloaden."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Instellingen resetten"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Alle netwerkinstellingen resetten? Je kunt deze actie niet ongedaan maken."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Alle netwerkinstellingen resetten en gedownloade simkaarten wissen? Je kunt deze actie niet ongedaan maken."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet heeft meer verbruikt dan normaal"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Apparaat heeft meer verbruikt dan normaal"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batterij is mogelijk eerder leeg dan normaal"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Batterij sparen"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimaliseren voor batterijduur"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batterij tijdelijk beperkt. Tik voor meer informatie."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Je telefoon is vaker gebruikt dan normaal. De batterij is mogelijk eerder leeg dan verwacht.\n\nTop-apps op basis van batterijgebruik:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Je tablet is vaker gebruikt dan normaal. De batterij is mogelijk eerder leeg dan verwacht.\n\nTop-apps op basis van batterijgebruik:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max. zichtbare gegevenssets"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Resetten naar standaardwaarden"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Ontwikkelaarsopties voor automatisch invullen zijn gereset"</string>
+ <string name="location_category" msgid="3496759112306219062">"Locatie"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Locatie-indicator in statusbalk"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Tonen voor alle locaties, inclusief netwerk en connectiviteit"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Volledige GNSS-metingen afdwingen"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Alle GNSS-constellaties en -frequenties bijhouden zonder duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Apparaatthema"</string>
<string name="default_theme" msgid="4815428567082263639">"Standaard"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Netwerknaam"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Meldingen onderbreken om gefocust te blijven"</string>
<string name="disabled_feature" msgid="7151433782819744211">"De functie is niet beschikbaar"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Deze functie is uitgeschakeld omdat je telefoon erdoor wordt vertraagd"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Volledige GNSS-metingen afdwingen"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Alle GNSS-constellaties en -frequenties bijhouden zonder duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Altijd een crashvenster weergeven"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Bij gecrashte apps altijd een venster weergeven"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"App met ANGLE-functionaliteit selecteren"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Met bellen via wifi kun je bellen en gebeld worden via niet-providernetwerken zoals bepaalde wifi-netwerken."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Gesprekken"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Sms"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"voorkeur"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"voorkeur voor gesprekken"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"voorkeur voor sms"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"niet beschikbaar"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Geen simkaart"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Voorkeuren"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Verbinden met openbare netwerken"</string>
<string name="keywords_internet" msgid="7674082764898690310">"netwerkverbinding, internet, draadloos, data, wifi, wi-fi, wi fi, mobiel, mobiele provider, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Niet beschikbaar omdat de bedtijdstand is ingeschakeld"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Belang van meldingen is gereset."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Een niet-vertrouwd apparaat wil toegang tot je berichten. Tik voor details."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Toegang tot berichten toestaan?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Een niet-vertrouwd bluetooth-apparaat, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wil toegang tot je berichten.\n\nJe hebt niet eerder verbinding gemaakt met [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Een niet-vertrouwd apparaat wil toegang tot je contacten en gesprekslijst. Tik voor details."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Toegang tot contacten en gesprekslijst toestaan?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Een niet-vertrouwd bluetooth-apparaat, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], wil toegang tot je contacten en gesprekslijst. Dit omvat gegevens over inkomende en uitgaande gesprekken.\n\nJe hebt niet eerder verbinding gemaakt met [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 1c8b072..f9094fb 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ଠିକଣା"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"ସେଭ୍ ହୋଇଥିବା ନେଟ୍ୱାର୍କ"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"ସଦସ୍ୟତା"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"ଅନ୍ୟ ନେଟୱାର୍କ"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ସେଟିଂସ୍"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ୱାଇ-ଫାଇ ଉନ୍ନତ ସେଟିଙ୍ଗ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ସେଭ୍ କରନ୍ତୁ"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ଡିଲିଟ୍ କରନ୍ତୁ"</string>
<string name="menu_new" msgid="6571230342655509006">"ନୂଆ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"ସେଭ୍ କରନ୍ତୁ"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ପରିତ୍ୟାଗ"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ବାତିଲ୍ କରନ୍ତୁ"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"ନାମ ସ୍ଥାନ ଶୂନ୍ୟ ରହିପାରିବ ନାହିଁ।"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APNକୁ ଖାଲି ରଖାଯାଇପାରିବ ନାହିଁ।"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ଆପ୍ଗୁଡ଼ିକୁ ରିସେଟ୍ କରାଯାଇପାରିବ"</string>
<string name="reset_network_title" msgid="1395494440355807616">"ୱାଇ-ଫାଇ, ମୋବାଇଲ ଓ ବ୍ଲୁଟୁଥ୍ ରିସେଟ୍ କରନ୍ତୁ"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ଏହା ସମସ୍ତ ନେଟୱାର୍କ ସେଟିଂସକୁ ରିସେଟ୍ କରିବ, ଯେଉଁଥିରେ ଏସବୁ ରହିଛି:\n\n"<li>"ୱାଇ-ଫାଇ"</li>\n<li>"ମୋବାଇଲ୍ ଡାଟା"</li>\n<li>"ବ୍ଲୁଟୁଥ୍"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ଖାଲି କରନ୍ତୁ"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ଡାଉନଲୋଡ୍ ହୋଇଥିବା SIMକୁ ଖାଲି କରନ୍ତୁ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ରିପ୍ଲେସମ୍ୟାଣ୍ଟ୍ SIMଗୁଡ଼ିକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ, ଆପଣଙ୍କର କ୍ୟାରିଅରଙ୍କୁ ଯୋଗାଯୋଗ କରନ୍ତୁ। ଏହା କୌଣସି ମୋବାଇଲ୍ ସେବା ପ୍ଲାନ୍ ବାତିଲ୍ କରିବ ନାହିଁ।"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ଏହା କୌଣସି ମୋବାଇଲ ସେବା ପ୍ଲାନକୁ ବାତିଲ୍ କରିବ ନାହିଁ। ରିପ୍ଲେସମେଣ୍ଟ SIMଗୁଡ଼ିକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଆପଣଙ୍କ କ୍ୟାରିଅରଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ସେଟିଂସ୍ ରିସେଟ୍ କରନ୍ତୁ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ସମସ୍ତ ନେଟ୍ୱାର୍କ ସେଟିଂ ରିସେଟ୍ କରିବେ? ଏହାକୁ ଆପଣ ଆଉ ପୂର୍ବବତ୍ କରିପାରିବେ ନାହିଁ।"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ସମସ୍ତ ନେଟ୍ୱର୍କ ସେଟିଂ ରିସେଟ୍ ଏବଂ ଡାଉନଲୋଡ୍ ହୋଇଥିବା SIMକୁ ଖାଲି କରିବେ କି? ଆପଣ ଏହି କାର୍ଯ୍ୟକୁ ପୂର୍ବବତ୍ କରିପାରିବେ ନାହିଁ।"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ଟାବଲେଟ୍ ସାଧାରଣ ତୁଳନାରେ ଅଧିକ ବ୍ୟବହାର କରାଯାଇଛି"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ଡିଭାଇସ୍ ସାଧାରଣ ତୁଳନାରେ ଅଧିକ ବ୍ୟବହାର କରାଯାଇଛି"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ଅନୁମାନ କରାଯାଉଥିବା ସମୟର ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"ବ୍ୟାଟେରୀ ହେଲ୍ଥ ସଂରକ୍ଷଣ ହେଉଛି"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"ବ୍ୟାଟେରୀ ହେଲ୍ଥ ପାଇଁ ଅପ୍ଟିମାଇଜ୍ ହେଉଛି"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ବ୍ୟାଟେରୀ ଅସ୍ଥାୟୀ ଭାବେ ସୀମିତ ଅଛି। ଅଧିକ ଜାଣିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"ଆପଣଙ୍କ ଫୋନ୍ ସାଧାରଣ ତୁଳନାରେ ଅଧିକ ବ୍ୟବହାର କରାଯାଇଛି। ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ହୁଏତ ଆଶା କରାଯାଉଥିବା ସମୟ ଠାରୁ ଶୀଘ୍ର ସରି ଯାଇପାରେ।\n\n ବ୍ୟାଟେରୀର ବ୍ୟବହାର ଦ୍ୱାରା ଶ୍ରେଷ୍ଠ ଆପ୍ସ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"ଆପଣଙ୍କର ଟାବ୍ଲେଟ୍ ସାଧାରଣ ତୁଳନାରେ ଅଧିକ ବ୍ୟବହାର କରାଯାଇଛି। ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ହୁଏତ ଆଶା କରାଯାଉଥିବା ସମୟ ଠାରୁ ଶୀଘ୍ର ସରି ଯାଇପାରେ।\n\n ବ୍ୟାଟେରୀର ବ୍ୟବହାର ଦ୍ୱାରା ଶ୍ରେଷ୍ଠ ଆପ୍ସ:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"ସର୍ବାଧିକ ଦେଖାଯାଉଥିବା ଡାଟାସେଟ୍ଗୁଡିକ"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ଡିଫଲ୍ଟ ମୂଲ୍ୟକୁ ରିସେଟ୍ କରନ୍ତୁ"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ଅଟୋଫିଲ୍ ଡେଭଲପର୍ ବିକଳ୍ପଗୁଡିକ ରିସେଟ୍ ହୋଇଛି"</string>
+ <string name="location_category" msgid="3496759112306219062">"ଲୋକେସନ୍"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"ଷ୍ଟାଟସ୍ ବାରରେ ଲୋକେସନ୍ ସୂଚକ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ନେଟୱାର୍କ ଏବଂ ସଂଯୋଗ ସମେତ, ସମସ୍ତ ଲୋକେସନ୍ ଦେଖାନ୍ତୁ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ପୂର୍ଣ୍ଣ GNSS ପରିମାପ ବାଧ୍ୟ କରନ୍ତୁ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ଡ୍ୟୁଟି ସାଇକିଲିଂ ନଥାଇ ସମସ୍ତ GNSS ତାରାମଣ୍ଡଳ ଓ ଫ୍ରିକ୍ୱେନ୍ସୀକୁ ଟ୍ରାକ୍ କରନ୍ତୁ"</string>
<string name="device_theme" msgid="5027604586494772471">"ଡିଭାଇସ୍ ଥିମ୍"</string>
<string name="default_theme" msgid="4815428567082263639">"ପ୍ରାକ୍-ନିର୍ଦ୍ଧାରିତ"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ନେଟୱାର୍କ ନାମ"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ଫୋକସ୍ ରହିବା ପାଇଁ ବିଜ୍ଞପ୍ତି ବିରତି କରନ୍ତୁ"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ଫିଚର୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ଏହି ଫିଚର୍ ଆପଣଙ୍କ ଫୋନ୍କୁ ଧିମା କରୁଥିବାରୁ ଏହାକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"ପୂର୍ଣ୍ଣ GNSS ପରିମାପ ବାଧ୍ୟ କରନ୍ତୁ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ଡ୍ୟୁଟି ସାଇକିଲିଂ ନଥାଇ ସମସ୍ତ GNSS ତାରାମଣ୍ଡଳ ଓ ଫ୍ରିକ୍ୱେନ୍ସୀକୁ ଟ୍ରାକ୍ କରନ୍ତୁ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"କ୍ରାଶ୍ ହୋଇଥିବା ଡାୟଲଗ୍କୁ ସର୍ବଦା ଦେଖାନ୍ତୁ"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"ପ୍ରତ୍ୟେକ ଥର ଗୋଟିଏ ଆପ୍ କ୍ରାଶ୍ ହେବାପରେ ଡାୟଲଗ୍ ଦେଖାନ୍ତୁ"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE ସକ୍ଷମ ଥିବା ଆପ୍ ଚୟନ କରନ୍ତୁ"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ୱାଇ‑ଫାଇ କଲିଂ ଆପଣଙ୍କୁ କେତେକ ୱାଇ‑ଫାଇ ନେଟୱାର୍କ ପରି ନନ୍‑କ୍ୟାରିଅର୍ ନେଟୱାର୍କରେ କଲ୍ କରିବା ଓ ପ୍ରାପ୍ତ କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"କଲଗୁଡ଼ିକ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ପସନ୍ଦ କରାଯାଇଛି"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"କଲଗୁଡ଼ିକୁ ପସନ୍ଦ କରାଯାଇଛି"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ପସନ୍ଦ କରାଯାଇଛି"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"କୌଣସି SIM ନାହିଁ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ପସନ୍ଦଗୁଡ଼ିକ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ସାର୍ବଜନୀନ ନେଟୱାର୍କଗୁଡ଼ିକ ସହ ସଂଯୋଗ କରନ୍ତୁ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ନେଟୱାର୍କ ସଂଯୋଗ, ଇଣ୍ଟରନେଟ୍, ୱାୟାରଲେସ୍, ଡାଟା, ୱାଇଫାଇ, ୱାଇ-ଫାଇ, ୱାଇ ଫାଇ, ସେଲ୍ୟୁଲାର୍, ମୋବାଇଲ, ସେଲ୍ କ୍ୟାରିଅର୍, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ଶୋଇବା ସମୟ ମୋଡ୍ ଚାଲୁ ଥିବା ଯୋଗୁଁ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"ବିଜ୍ଞପ୍ତିର ପ୍ରାଥମିକତା ରିସେଟ୍ କରିବା ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି।"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ଆପଗୁଡ଼ିକ"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"ଅବିଶ୍ୱସ୍ତ ଡିଭାଇସଟି ଆପଣଙ୍କ ମେସେଜଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହୁଁଛି। ବିବରଣୀ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"ମେସେଜଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"ଏକ ଅବିଶ୍ୱସ୍ତ ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ଆପଣଙ୍କ ମେସେଜଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହେଁ।\n\nଆପଣ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ସହ ପୂର୍ବରୁ ସଂଯୁକ୍ତ ହୋଇନାହାଁନ୍ତି।"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"ଅବିଶ୍ୱସ୍ତ ଡିଭାଇସଟି ଆପଣଙ୍କ ଯୋଗାଯୋଗ ଏବଂ କଲ୍ ଲଗକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହେଁ। ବିବରଣୀ ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"ଯୋଗାଯୋଗ ଏବଂ କଲ୍ ଲଗକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"ଏକ ଅବିଶ୍ୱସ୍ତ ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ଆପଣଙ୍କ ଯୋଗାଯୋଗ ଏବଂ କଲ୍ ଲଗକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହେଁ। ଏଥିରେ ଇନକମିଂ ଏବଂ ଆଉଟଗୋଇଂ କଲଗୁଡ଼ିକ ବିଷୟରେ ଡାଟା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।\n\nଆପଣ ପୂର୍ବରୁ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ସହ ସଂଯୁକ୍ତ ହୋଇନାହାଁନ୍ତି।"</string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 85bdc23..d3bc5e4 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ਪਤੇ"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"ਰੱਖਿਅਤ ਕੀਤੇ ਨੈੱਟਵਰਕ"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"ਗਾਹਕੀਆਂ"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"ਹੋਰ ਨੈੱਟਵਰਕ"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ਸੈਟਿੰਗਾਂ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ਵਾਈ-ਫਾਈ ਉੱਨਤ ਸੈਟਿੰਗਾਂ ਇਸ ਵਰਤੋਂਕਾਰ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ਰੱਖਿਅਤ ਕਰੋ"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ਮਿਟਾਓ"</string>
<string name="menu_new" msgid="6571230342655509006">"ਨਵਾਂ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"ਰੱਖਿਅਤ ਕਰੋ"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ਰੱਦ ਕਰੋ"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ਰੱਦ ਕਰੋ"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"ਨਾਮ ਖੇਤਰ ਨੂੰ ਖਾਲੀ ਨਹੀਂ ਛੱਡਿਆ ਜਾ ਸਕਦਾ।"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ਨੂੰ ਖਾਲੀ ਨਹੀਂ ਛੱਡਿਆ ਜਾ ਸਕਦਾ।"</string>
@@ -1612,8 +1611,11 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ਐਪਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string>
<string name="reset_network_title" msgid="1395494440355807616">"ਵਾਈ-ਫਾਈ, ਮੋਬਾਈਲ ਅਤੇ ਬਲੂਟੁੱਥ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ਇਹ ਨੈੱਟਵਰਕ ਦੀਆਂ ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰੇਗਾ, ਜਿਸ ਵਿੱਚ ਇਹ ਸ਼ਾਮਲ ਹਨ:\n\n"<li>"ਵਾਈ-ਫਾਈ"</li>\n<li>"ਮੋਬਾਈਲ ਡਾਟਾ"</li>\n<li>"ਬਲੂਟੁੱਥ"</li></string>
+ <!-- no translation found for erase_euicc_data_button (728078969563311737) -->
+ <skip />
<string name="reset_esim_title" msgid="6152167073280852849">"ਡਾਊਨਲੋਡ ਕੀਤੇ ਸਿਮ ਮਿਟਾਓ"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ਵਟਾਵੇਂ ਸਿਮ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ, ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ। ਇੰਝ ਕਰਨ ਨਾਲ ਕੋਈ ਵੀ ਮੋਬਾਈਲ ਸੇਵਾ ਪਲਾਨ ਰੱਦ ਨਹੀਂ ਹੋਣਗੇ।"</string>
+ <!-- no translation found for reset_esim_desc (3662444090563399131) -->
+ <skip />
<string name="reset_network_button_text" msgid="2281476496459610071">"ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ਕੀ ਸਾਰੀਆਂ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰਨੀਆਂ ਹਨ? ਤੁਸੀਂ ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਅਣਕੀਤਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ਕੀ ਸਾਰੀਆਂ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰਕੇ ਡਾਊਨਲੋਡ ਕੀਤੇ ਸਿਮ ਮਿਟਾਉਣੇ ਹਨ? ਤੁਸੀਂ ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਅਣਕੀਤਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
@@ -2456,10 +2458,9 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ਟੈਬਲੈੱਟ ਦੀ ਵਰਤੋਂ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਹੋਈ ਹੈ"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਹੋਈ ਹੈ"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"ਬੈਟਰੀ ਆਮ ਨਾਲੋਂ ਪਹਿਲਾਂ ਖਤਮ ਹੋ ਸਕਦੀ ਹੈ"</string>
- <!-- no translation found for battery_tip_limited_temporarily_title (3532338978617826383) -->
+ <!-- no translation found for battery_tip_limited_temporarily_title (7152799456221596915) -->
<skip />
- <!-- no translation found for battery_tip_limited_temporarily_summary (6837061824463128857) -->
- <skip />
+ <string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"ਬੈਟਰੀ ਕੁਝ ਸਮੇਂ ਲਈ ਸੀਮਤ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੀ ਬੈਟਰੀ ਸ਼ਾਇਦ ਉਮੀਦ ਨਾਲੋਂ ਛੇਤੀ ਮੁੱਕ ਜਾਵੇ।\n\nਬੈਟਰੀ ਵਰਤੋਂ ਮੁਤਾਬਕ ਪ੍ਰਮੁੱਖ ਐਪਾਂ:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਦੀ ਵਰਤੋਂ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੀ ਬੈਟਰੀ ਸ਼ਾਇਦ ਉਮੀਦ ਨਾਲੋਂ ਛੇਤੀ ਮੁੱਕ ਜਾਵੇ।\n\nਬੈਟਰੀ ਵਰਤੋਂ ਮੁਤਾਬਕ ਪ੍ਰਮੁੱਖ ਐਪਾਂ:"</string>
<string name="battery_tip_dialog_message" product="device" msgid="2620789680336796054">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੀ ਬੈਟਰੀ ਸ਼ਾਇਦ ਉਮੀਦ ਨਾਲੋਂ ਛੇਤੀ ਮੁੱਕ ਜਾਵੇ।\n\nਬੈਟਰੀ ਵਰਤੋਂ ਮੁਤਾਬਕ ਪ੍ਰਮੁੱਖ ਐਪਾਂ:"</string>
@@ -4653,6 +4654,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"ਵੱਧ-ਤੋਂ-ਵੱਧ ਦਿਖਣਯੋਗ ਡਾਟਾਸੈੱਟ"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਮੁੱਲਾਂ \'ਤੇ ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ਆਟੋਫਿਲ ਵਿਕਾਸਕਾਰ ਵਿਕਲਪਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰ ਦਿੱਤਾ ਹੈ"</string>
+ <string name="location_category" msgid="3496759112306219062">"ਟਿਕਾਣਾ"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"ਸਥਿਤੀ ਪੱਟੀ ਟਿਕਾਣਾ ਸੂਚਕ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ਨੈੱਟਵਰਕ ਅਤੇ ਕਨੈਕਟੀਵਿਟੀ ਸਮੇਤ ਸਾਰੇ ਟਿਕਾਣਿਆਂ ਲਈ ਦਿਖਾਓ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS ਮਾਪ ਨੂੰ ਜ਼ਬਰਦਰਸਤੀ ਲਾਗੂ ਕਰੋ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ਡਿਊਟੀ ਸਾਈਕਲਿੰਗ ਤੋਂ ਬਿਨਾਂ ਸਾਰੇ GNSS ਉਪਗ੍ਰਹਿ ਗਰੁੱਪਾਂ ਅਤੇ ਵਾਰਵਾਰਤਾਵਾਂ ਨੂੰ ਟਰੈਕ ਕਰੋ"</string>
<string name="device_theme" msgid="5027604586494772471">"ਡੀਵਾਈਸ ਥੀਮ"</string>
<string name="default_theme" msgid="4815428567082263639">"ਪੂਰਵ-ਨਿਰਧਾਰਤ"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ਨੈੱਟਵਰਕ ਦਾ ਨਾਮ"</string>
@@ -4669,8 +4675,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ਧਿਆਨ ਕੇਂਦਰਿਤ ਰੱਖਣ ਲਈ ਸੂਚਨਾਵਾਂ ਰੋਕੋ"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ ਕਿਉਂਕਿ ਇਹ ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਹੌਲੀ ਕਰ ਦਿੰਦੀ ਹੈ"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"GNSS ਮਾਪ ਨੂੰ ਜ਼ਬਰਦਰਸਤੀ ਲਾਗੂ ਕਰੋ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ਡਿਊਟੀ ਸਾਈਕਲਿੰਗ ਤੋਂ ਬਿਨਾਂ ਸਾਰੇ GNSS ਉਪਗ੍ਰਹਿ ਗਰੁੱਪਾਂ ਅਤੇ ਵਾਰਵਾਰਤਾਵਾਂ ਨੂੰ ਟਰੈਕ ਕਰੋ"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ਹਮੇਸ਼ਾਂ ਕ੍ਰੈਸ਼ ਵਿੰਡੋ ਦਿਖਾਓ"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"ਕਿਸੇ ਐਪ ਦੇ ਕ੍ਰੈਸ਼ ਹੋਣ \'ਤੇ ਹਰ ਵਾਰ ਵਿੰਡੋ ਦਿਖਾਓ"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE ਸਮਰਥਿਤ ਐਪ ਚੁਣੋ"</string>
@@ -4738,8 +4742,7 @@
<string name="prevent_ringing_option_mute_summary" msgid="4885288334872920616">"ਚਾਲੂ (ਮਿਊਟ)"</string>
<string name="prevent_ringing_option_none_summary" msgid="7004926708584574224">"ਬੰਦ"</string>
<string name="pref_title_network_details" msgid="7329759534269363308">"ਨੈੱਟਵਰਕ ਵੇਰਵੇ"</string>
- <!-- no translation found for about_phone_device_name_warning (1938930553285875166) -->
- <skip />
+ <string name="about_phone_device_name_warning" msgid="1938930553285875166">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਨਾਮ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਐਪਾਂ ਨੂੰ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ। ਇਸਨੂੰ ਤੁਹਾਡੇ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰਨ, ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਜਾਂ ਵਾਈ-ਫਾਈ ਹੌਟਸਪੌਟ ਸੈੱਟਅੱਪ ਕਰਨ \'ਤੇ ਹੋਰ ਲੋਕਾਂ ਵੱਲੋਂ ਵੀ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="devices_title" msgid="649715719278562515">"ਡੀਵਾਈਸਾਂ"</string>
<string name="homepage_all_settings" msgid="1877827279189801035">"ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ"</string>
<string name="homepage_personal_settings" msgid="8312279476519359656">"ਸੁਝਾਅ"</string>
@@ -4899,14 +4902,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"ਸਿਮ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"ਸਿਮ ਹਟਾ ਕੇ ਦੁਬਾਰਾ ਪਾਓ। ਜੇ ਸਮੱਸਿਆ ਜਾਰੀ ਰਹਿੰਦੀ ਹੈ, ਤਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।"</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"ਸਿਮ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ। ਜੇ ਸਮੱਸਿਆ ਜਾਰੀ ਰਹਿੰਦੀ ਹੈ, ਤਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।"</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"ਨੈੱਟਵਰਕ ਕਿਰਿਆਸ਼ੀਲਤਾ"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> ਕਿਰਿਆਸ਼ੀਲ ਹੈ"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"SIM ਸੈਟਿੰਗਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"ਸਿਮ ਕਾਰਡ"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"ਕੀ ਇਹ ਡਾਊਨਲੋਡ ਕੀਤਾ ਸਿਮ ਮਿਟਾਉਣਾ ਹੈ?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"ਇਹ ਸਿਮ ਮਿਟਾਉਣ ਨਾਲ <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> ਸੇਵਾ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਹਟ ਜਾਂਦੀ ਹੈ।\n\n<xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> ਲਈ ਸੇਵਾ ਰੱਦ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ।"</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"ਮਿਟਾਓ"</string>
@@ -5059,14 +5058,29 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਤੁਹਾਨੂੰ ਨਾਨ-ਕੈਰੀਅਰ ਨੈੱਟਵਰਕਾਂ, ਜਿਵੇਂ ਕਿ ਕੁਝ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ, \'ਤੇ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ਕਾਲਾਂ"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ਤਰਜੀਹੀ"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ਕਾਲਾਂ ਲਈ ਤਰਜੀਹ"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ਲਈ ਤਰਜੀਹ"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ਉਪਲਬਧ ਨਹੀਂ"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"ਕੋਈ ਸਿਮ ਨਹੀਂ"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ਤਰਜੀਹਾਂ"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"ਜਨਤਕ ਨੈੱਟਵਰਕਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ, ਇੰਟਰਨੈੱਟ, ਵਾਇਰਲੈੱਸ, ਡਾਟਾ, ਵਾਈ-ਫਾਈ, ਸੈਲਿਊਲਰ, ਮੋਬਾਈਲ, ਸੈੱਲ ਕੈਰੀਅਰ, 4G, 3G, 2G, LTE"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"ਹਵਾਈ-ਜਹਾਜ਼ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਦੇਖੋ"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਬੰਦ ਕਰੋ"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ਬੈੱਡਟਾਈਮ ਮੋਡ ਚਾਲੂ ਹੋਣ ਕਰਕੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"ਸੂਚਨਾ ਦੀ ਮਹੱਤਤਾ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਰੀਸੈੱਟ ਕਰੋ।"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ਐਪਾਂ"</string>
+ <!-- no translation found for bluetooth_message_access_notification_content (2986108412562309009) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_title (9009836130395061579) -->
+ <skip />
+ <!-- no translation found for bluetooth_message_access_dialog_content (6004506637437582983) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_notification_content (4280361621526852063) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_title (7624607995928968721) -->
+ <skip />
+ <!-- no translation found for bluetooth_phonebook_access_dialog_content (2235876209172857819) -->
+ <skip />
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 6a65107..e63bb6d 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adresy IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Zapisane sieci"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subskrypcje"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Inne sieci"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Ustawienia adresu IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Zaawansowane ustawienia Wi‑Fi są niedostępne dla tego użytkownika"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Zapisz"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Usuń APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nowy APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Zapisz"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Odrzuć"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Anuluj"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Nazwa nie może być pusta."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Nazwa APN nie może być pusta."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikacje można zresetować"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Resetuj Wi-Fi, transmisję i Bluetootha"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Spowoduje to usunięcie wszystkich ustawień sieciowych, w tym:\n\n"<li>"Wi‑Fi"</li>\n<li>"mobilnej transmisji danych"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Wykasuj"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Usuń pobrane karty SIM"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Aby pobrać zastępczą kartę SIM, skontaktuj się z operatorem. Nie anuluje to Twoich abonamentów."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Nie spowoduje to anulowania Twoich abonamentów. Aby pobrać zastępcze karty SIM, skontaktuj się z operatorem."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Zresetuj ustawienia"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Zresetować wszystkie ustawienia sieci? Nie można cofnąć tej czynności."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Zresetować wszystkie ustawienia sieci i usunąć dane z pobranych kart SIM? Nie można cofnąć tej czynności."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet używany intensywniej niż zwykle"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Urządzenie używane intensywniej niż zwykle"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Bateria może wyczerpać się szybciej niż zwykle"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Oszczędzanie baterii"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optymalizuję, by utrzymać baterię w dobrym stanie"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria tymczasowo ograniczona. Kliknij, by dowiedzieć się więcej."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefon był używany intensywniej niż zwykle. Bateria może rozładować się szybciej.\n\nAplikacje najbardziej wyczerpujące baterię:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablet był używany intensywniej niż zwykle. Bateria może rozładować się szybciej.\n\nAplikacje najbardziej wyczerpujące baterię:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksymalna liczba widocznych zbiorów danych"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Przywróć wartości domyślne"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Zresetowano opcje programisty dotyczące autouzupełniania"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokalizacja"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Wskaźnik lokalizacji na pasku stanu"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Pokazuj w przypadku wszystkich lokalizacji, w tym określonych na podstawie sieci i połączeń"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Wymuś pełną procedurę pomiarów GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Śledź wszystkie konstelacje GNSS i częstotliwości bez uwzględniania współczynnika impulsu"</string>
<string name="device_theme" msgid="5027604586494772471">"Motyw urządzenia"</string>
<string name="default_theme" msgid="4815428567082263639">"Wartość domyślna"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nazwa sieci"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Wstrzymaj powiadomienia, by Cię nie rozpraszały"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcja niedostępna"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ta funkcja została wyłączona, bo spowalnia działanie telefonu"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Wymuś pełną procedurę pomiarów GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Śledź wszystkie konstelacje GNSS i częstotliwości bez uwzględniania współczynnika impulsu"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Zawsze pokazuj okno dialogowe z raportem o błędzie"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Pokazuj okno dialogowe przy każdym poważnym błędzie w aplikacji"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Wybierz aplikację obsługującą ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Połączenia przez Wi-Fi umożliwiają nawiązywanie i odbieranie połączeń w sieciach innych niż należące do operatorów, np. w niektórych sieciach Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Połączenia"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS-y"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferowane"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferowane połączenia"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferowane SMS-y"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"niedostępne"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Brak karty SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Ustawienia"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Łącz się z sieciami publicznymi"</string>
<string name="keywords_internet" msgid="7674082764898690310">"połączenie sieciowe, internet, bezprzewodowy, dane, Wi-Fi, wi-fi, wi fi, komórka, telefon, operator komórkowy, 4g, 3g, 2g, lte"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Niedostępne, ponieważ włączony jest tryb snu"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ukończono resetowanie ważności powiadomień."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikacje"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Niezaufane urządzenie chce uzyskać dostęp do Twoich wiadomości. Kliknij, by wyświetlić szczegóły."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Zezwolić na dostęp do wiadomości?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Niezaufane urządzenie Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], chce uzyskać dostęp do Twoich wiadomości.\n\nTwoje urządzenie nie łączyło się wcześniej z urządzeniem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Niezaufane urządzenie chce uzyskać dostęp do Twoich kontaktów i rejestru połączeń. Kliknij, by wyświetlić szczegóły."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Zezwolić na dostęp do kontaktów i rejestru połączeń?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Niezaufane urządzenie Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], chce uzyskać dostęp do Twoich kontaktów i rejestru połączeń. Chodzi między innymi o dane o połączeniach przychodzących i wychodzących.\n\nTwoje urządzenie nie łączyło się wcześniej z urządzeniem [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 8703668..0721848 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Endereços IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Redes salvas"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Assinaturas"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Outras redes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Configurações de IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"As configurações avançadas de Wi-Fi não estão disponíveis para esse usuário"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Salvar"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Excluir APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Novo APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Salvar"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Descartar"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancelar"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"O campo Nome não pode ficar vazio."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"O APN não pode estar vazio."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Os apps podem ser redefinidos"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Redefinir Wi-Fi, rede móvel e Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Esta ação redefinirá todas as configurações de rede, inclusive:\n\n"<li>"Wi‑Fi"</li>\n<li>"Dados móveis"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Limpar"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Limpar chips salvos"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para fazer o download de chips substitutos, entre em contato com a operadora. Isso não cancelará nenhum plano de serviços móveis."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Isso não cancelará nenhum plano de serviços móveis. Para fazer o download de chips substitutos, entre em contato com a operadora."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Redefinir configurações"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Redefinir todas as configurações de rede? Não é possível desfazer essa ação."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Redefinir todas as configurações de rede e limpar chips salvos? Não é possível desfazer essa ação."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet usado além do normal"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Dispositivo usado além do normal"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"A bateria pode acabar antes do esperado"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Como preservar a integridade da bateria"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Otimizando para integridade da bateria"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria limitada temporariamente. Toque para saber mais."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"O smartphone foi usado além do normal. A bateria pode acabar antes do esperado.\n\nApps que mais usam bateria:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"O tablet foi usado além do normal. A bateria pode acabar antes do esperado.\n\nApps que mais usam bateria:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Máximo de conjuntos de dados visíveis"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Redefinir para valores padrão"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"As opções do desenvolvedor de preenchimento automático foram redefinidas"</string>
+ <string name="location_category" msgid="3496759112306219062">"Local"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador de local na barra de status"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostrar para todos os locais, incluindo rede e conectividade"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forçar medições completas de GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Rastrear todas as constelações e frequências do GNSS sem nenhum ciclo de trabalho"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema do dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Padrão"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nome da rede"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pausar notificações para manter o foco"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Recurso não disponível"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Esse recurso foi desativado porque causa lentidão no seu smartphone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forçar medições completas de GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Rastrear todas as constelações e frequências do GNSS sem nenhum ciclo de trabalho"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Sempre mostrar a caixa de diálogo de falha"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostrar a caixa de diálogo sempre que um app falha"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Selecionar app ativado para ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"A chamada no Wi-Fi permite que você faça e receba chamadas por redes sem operadora, como algumas redes Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Chamadas"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferido"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferido para chamadas"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferido para SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"indisponível"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Sem chip"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferências"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Conectar-se a redes públicas"</string>
<string name="keywords_internet" msgid="7674082764898690310">"conexão de rede, internet, sem fio, dados, wifi, wi-fi, wi fi, celular, rede móvel, operadora de celular, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Indisponível durante o Modo noite"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Redefinição da importância de notificações concluída."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Um dispositivo não confiável quer acessar suas mensagens. Toque para ver detalhes."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Conceder acesso às mensagens?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Um dispositivo Bluetooth não confiável, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quer acessar suas mensagens.\n\nVocê não se conectou a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] antes."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Um dispositivo não confiável quer acessar seus contatos e seu registro de chamadas. Toque para ver detalhes."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Conceder acesso aos contatos e ao registro de chamadas?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Um dispositivo Bluetooth não confiável, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quer acessar seus contatos e seu registro de chamadas. Isso inclui dados sobre chamadas recebidas e realizadas.\n\nVocê não se conectou a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] antes."</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 0637c58..f79fc43 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Endereços IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Redes guardadas"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Subscrições"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Outras redes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Definições de IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"As definições avançadas de Wi-Fi não estão disponíveis para este utilizador"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Guardar"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Eliminar APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Novo APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Guardar"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Rejeitar"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancelar"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"O campo Nome não pode estar vazio."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"O APN não pode estar vazio."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"É possível repor as apps."</string>
<string name="reset_network_title" msgid="1395494440355807616">"Repor Wi-Fi, dados e Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Esta ação repõe todas as definições de rede, incluindo:\n\n"<li>"Wi‑Fi"</li>\n<li>"Dados móveis"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Apagar"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Apagar SIMs transferidos"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para transferir SIMs de substituição, contacte o seu operador. Esta ação não cancela qualquer plano de serviços móveis."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Esta ação não cancela qualquer plano de serviços móveis. Para transferir SIMs de substituição, contacte o seu operador."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Repor definições"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Pretende repor todas as definições de rede? Não é possível anular esta ação."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Pretende repor todas as definições de rede e apagar os SIMs transferidos? Não é possível anular esta ação."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet utilizado mais do que o habitual"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Dispositivo utilizado mais do que o habitual"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Pode ficar sem bateria mais cedo do que o habitual."</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"A preservar o estado da bateria"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"A otimizar o estado da bateria"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria limitada temporariamente. Toque para saber mais."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"O seu telemóvel tem sido utilizado com mais frequência do que o habitual. A bateria pode esgotar-se mais cedo do que o esperado.\n\nPrincipais aplicações por utilização da bateria:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"O seu tablet tem sido utilizado com mais frequência do que o habitual. A bateria pode esgotar-se mais cedo do que o esperado.\n\nPrincipais aplicações por utilização da bateria:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Número máx. de conjuntos de dados visíveis"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Repor os valores predefinidos"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"As opções de preenchimento automático do programador foram repostas."</string>
+ <string name="location_category" msgid="3496759112306219062">"Localização"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador da localização da barra de estado"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Apresente para todas as localizações, incluindo a rede e a conetividade."</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forçar medições de GNSS completas"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Monitorizar todas as constelações e frequências de GNSS sem ciclos"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema do dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Predefinição"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nome da rede"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Coloque as notificações em pausa para se manter concentrado."</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funcionalidade não disponível."</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Esta funcionalidade foi desativada porque torna o seu telemóvel lento."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forçar medições de GNSS completas"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Monitorizar todas as constelações e frequências de GNSS sem ciclos"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Mostrar sempre a caixa de diálogo de falhas"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostrar a caixa de diálogo sempre que uma aplicação falhar"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Selecionar aplicação compatível com o ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"As Chamadas Wi-Fi permitem-lhe fazer e receber chamadas através de redes sem operador móvel, tais como algumas redes Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Chamadas"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferidas"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"chamadas preferidas"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"mensagens SMS preferidas"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"indisponíveis"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"sem cartão SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferências"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Ligar a redes públicas"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ligação de rede, internet, sem fios, dados, wifi, wi-fi, wi fi, telemóvel, dispositivo móvel, operador de telemóvel, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Não disponível porque o modo de hora de dormir está ativado."</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Reposição da importância das notificações concluída."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Um dispositivo não fidedigno pretende aceder às suas mensagens. Toque para obter detalhes."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Pretende permitir o acesso às mensagens?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Um dispositivo Bluetooth não fidedigno, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], pretende aceder às suas mensagens.\n\nNão estabeleceu ligação ao dispositivo [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] anteriormente."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Um dispositivo não fidedigno pretende aceder aos seus contactos e registo de chamadas. Toque para obter detalhes."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Pretende permitir o acesso aos contactos e registo de chamadas?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Um dispositivo Bluetooth não fidedigno, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], pretende aceder aos seus contactos e registo de chamadas. Isto inclui dados acerca de chamadas recebidas e efetuadas.\n\nNão estabeleceu ligação ao dispositivo [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] anteriormente."</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 8703668..0721848 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Endereços IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Redes salvas"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Assinaturas"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Outras redes"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Configurações de IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"As configurações avançadas de Wi-Fi não estão disponíveis para esse usuário"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Salvar"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Excluir APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Novo APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Salvar"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Descartar"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Cancelar"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"O campo Nome não pode ficar vazio."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"O APN não pode estar vazio."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Os apps podem ser redefinidos"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Redefinir Wi-Fi, rede móvel e Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Esta ação redefinirá todas as configurações de rede, inclusive:\n\n"<li>"Wi‑Fi"</li>\n<li>"Dados móveis"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Limpar"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Limpar chips salvos"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para fazer o download de chips substitutos, entre em contato com a operadora. Isso não cancelará nenhum plano de serviços móveis."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Isso não cancelará nenhum plano de serviços móveis. Para fazer o download de chips substitutos, entre em contato com a operadora."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Redefinir configurações"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Redefinir todas as configurações de rede? Não é possível desfazer essa ação."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Redefinir todas as configurações de rede e limpar chips salvos? Não é possível desfazer essa ação."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet usado além do normal"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Dispositivo usado além do normal"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"A bateria pode acabar antes do esperado"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Como preservar a integridade da bateria"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Otimizando para integridade da bateria"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria limitada temporariamente. Toque para saber mais."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"O smartphone foi usado além do normal. A bateria pode acabar antes do esperado.\n\nApps que mais usam bateria:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"O tablet foi usado além do normal. A bateria pode acabar antes do esperado.\n\nApps que mais usam bateria:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Máximo de conjuntos de dados visíveis"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Redefinir para valores padrão"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"As opções do desenvolvedor de preenchimento automático foram redefinidas"</string>
+ <string name="location_category" msgid="3496759112306219062">"Local"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicador de local na barra de status"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Mostrar para todos os locais, incluindo rede e conectividade"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forçar medições completas de GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Rastrear todas as constelações e frequências do GNSS sem nenhum ciclo de trabalho"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema do dispositivo"</string>
<string name="default_theme" msgid="4815428567082263639">"Padrão"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nome da rede"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pausar notificações para manter o foco"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Recurso não disponível"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Esse recurso foi desativado porque causa lentidão no seu smartphone"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forçar medições completas de GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Rastrear todas as constelações e frequências do GNSS sem nenhum ciclo de trabalho"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Sempre mostrar a caixa de diálogo de falha"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Mostrar a caixa de diálogo sempre que um app falha"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Selecionar app ativado para ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"A chamada no Wi-Fi permite que você faça e receba chamadas por redes sem operadora, como algumas redes Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Chamadas"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferido"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferido para chamadas"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferido para SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"indisponível"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Sem chip"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferências"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Conectar-se a redes públicas"</string>
<string name="keywords_internet" msgid="7674082764898690310">"conexão de rede, internet, sem fio, dados, wifi, wi-fi, wi fi, celular, rede móvel, operadora de celular, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Indisponível durante o Modo noite"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Redefinição da importância de notificações concluída."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Apps"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Um dispositivo não confiável quer acessar suas mensagens. Toque para ver detalhes."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Conceder acesso às mensagens?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Um dispositivo Bluetooth não confiável, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quer acessar suas mensagens.\n\nVocê não se conectou a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] antes."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Um dispositivo não confiável quer acessar seus contatos e seu registro de chamadas. Toque para ver detalhes."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Conceder acesso aos contatos e ao registro de chamadas?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Um dispositivo Bluetooth não confiável, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], quer acessar seus contatos e seu registro de chamadas. Isso inclui dados sobre chamadas recebidas e realizadas.\n\nVocê não se conectou a [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] antes."</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index e126ed3..82e6e7c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -1042,8 +1042,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adrese IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Rețele salvate"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonamente"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Alte rețele"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Setări IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Setările avansate de Wi‑Fi nu sunt disponibile pentru acest utilizator"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Salvați"</string>
@@ -1618,7 +1617,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Ștergeți APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN nou"</string>
<string name="menu_save" msgid="6611465355127483100">"Salvați"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Renunțați"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Anulați"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Câmpul Nume nu poate fi necompletat."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Numele APN nu poate fi necompletat."</string>
@@ -1633,8 +1632,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplicațiile pot fi resetate"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Resetați Wi-Fi, date mobile și Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Astfel, toate setările pentru rețea vor fi reinițializate, inclusiv:\n\n"<li>"Wi‑Fi,"</li>\n<li>"date mobile,"</li>\n<li>"Bluetooth."</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Ștergeți"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Ștergeți SIM-urile descărcate"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Pentru a descărca SIM-urile de înlocuire, contactați operatorul. Nu se va anula niciun abonament de servicii mobile."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Acest lucru nu va anula niciun abonament de servicii mobile. Pentru a descărca SIM-uri de înlocuire, contactați operatorul."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Resetați setările"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Restabiliți toate setările pentru rețea? Nu puteți anula această acțiune."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Resetați toate setările pentru rețea și ștergeți SIM-urile descărcate? Nu puteți anula această acțiune."</string>
@@ -2487,7 +2487,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tabletă folosită mai mult decât de obicei"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Dispozitiv folosit mai mult decât de obicei"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Bateria se poate descărca mai repede decât de obicei"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Economisirea bateriei"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Se fac optimizări pentru buna funcționare a bateriei"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Baterie limitată temporar. Atingeți ca să aflați mai multe."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefonul dvs. a fost folosit mai mult decât de obicei. Este posibil ca bateria să se descarce mai repede decât vă așteptați.\n\nAplicațiile care folosesc bateria cel mai mult:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tableta a fost folosită mai mult decât de obicei. Este posibil ca bateria să se descarce mai repede decât vă așteptați.\n\nAplicațiile care folosesc bateria cel mai mult:"</string>
@@ -4731,6 +4731,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Seturi de date cu vizibilitate maximă"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Resetați la valorile prestabilite"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Opțiunile dezvoltatorului de completare automată au fost resetate"</string>
+ <string name="location_category" msgid="3496759112306219062">"Locație"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicator de locația pentru bara de stare"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Afișați pentru toate locațiile, inclusiv rețeaua și conectivitatea"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forțați măsurători GNSS complete"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Urmăriți toate constelațiile și frecvențele GNSS fără ciclu de funcționare"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema dispozitivului"</string>
<string name="default_theme" msgid="4815428567082263639">"Prestabilită"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Numele rețelei"</string>
@@ -4747,8 +4752,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Întrerupeți notificările pentru a vă păstra concentrarea"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funcție indisponibilă"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Această funcție a fost dezactivată deoarece vă încetinește telefonul"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Forțați măsurători GNSS complete"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Urmăriți toate constelațiile și frecvențele GNSS fără ciclu de funcționare"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Afișați întotdeauna caseta de dialog pentru blocări"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Afișați caseta de dialog de fiecare dată când se blochează o aplicație"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Selectați aplicația compatibilă cu ANGLE"</string>
@@ -5135,6 +5138,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Cu ajutorul apelării prin Wi-Fi, puteți să inițiați și să primiți apeluri prin rețele diferite de cele de operator, cum ar fi rețelele Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Apeluri"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferate"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"apeluri preferate"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS-uri preferate"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"indisponibile"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Niciun card SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferințe"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Conectați-vă la rețele publice"</string>
<string name="keywords_internet" msgid="7674082764898690310">"conexiune la rețea, internet, wireless, date, wifi, wi-fi, wi fi, celular, mobil, operator servicii mobile, 4g, 3g, 2g, lte"</string>
@@ -5143,4 +5151,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Indisponibil deoarece modul ora de culcare este activat"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"S-a finalizat resetarea importanței notificărilor."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplicații"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Un dispozitiv care nu prezintă încredere solicită acces la mesajele dvs. Atingeți pentru detalii."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Permiteți accesul la mesaje?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Un dispozitiv Bluetooth care nu prezintă încredere, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], solicită acces la mesajele dvs.\n\nNu v-ați mai conectat la [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Un dispozitiv care nu prezintă încredere solicită acces la agenda și jurnalul dvs. de apeluri. Atingeți pentru detalii."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Permiteți accesul la agendă și la jurnalul de apeluri?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Un dispozitiv Bluetooth care nu prezintă încredere, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], solicită acces la agenda și jurnalul dvs. de apeluri. Aici sunt incluse date despre apelurile primite și efectuate.\n\nNu v-ați mai conectat la [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 793a8f1..7259f55 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-адреса"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Сохраненные сети"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Подписки"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Другие сети"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Настройки IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Расширенные настройки Wi‑Fi недоступны для этого пользователя"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Сохранить"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Удалить APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Новая точка доступа"</string>
<string name="menu_save" msgid="6611465355127483100">"Сохранить"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Отменить"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Отмена"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Необходимо указать имя."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Необходимо указать APN."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Вы можете сбросить настройки приложений"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Сбросить настройки Wi-Fi, мобильного Интернета и Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"На устройстве будут сброшены все сетевые настройки, в том числе:\n\n"<li>"Wi‑Fi"</li>\n<li>"Мобильный Интернет"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Удалить"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Удалить скачанные SIM-карты"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Чтобы скачать новую SIM-карту, свяжитесь с оператором. Это действие не повлияет на ваши тарифные планы."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Это действие не повлияет на ваши тарифные планы. Чтобы скачать новый профиль eSIM, свяжитесь с оператором связи."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Сбросить настройки"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Сбросить все настройки сети? Это действие нельзя отменить."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Сбросить все сетевые настройки и удалить скачанные SIM-карты? Это действие нельзя отменить."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Планшет используется больше, чем обычно"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Устройство используется больше, чем обычно"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Заряд батареи расходуется быстрее, чем обычно"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Увеличение срока службы батареи"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Оптимизация для увеличения срока службы батареи"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Уровень заряда временно ограничен. Нажмите, чтобы узнать подробности."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Телефон используется интенсивнее, чем обычно. Из-за этого батарея может разрядиться быстрее.\n\nПриложения с самым высоким энергопотреблением:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Планшет используется интенсивнее, чем обычно. Из-за этого батарея может разрядиться быстрее.\n\nПриложения с самым высоким энергопотреблением:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Максимальное количество видимых наборов данных"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Восстановить значения по умолчанию"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Настройки автозаполнения для разработчиков сброшены"</string>
+ <string name="location_category" msgid="3496759112306219062">"Местоположение"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Индикатор местоположения в строке состояния"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Показывать для всех местоположений, включая определяемые через сеть и подключение"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Полные измерения GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Отслеживать все группировки GNSS и частоты без рабочего цикла"</string>
<string name="device_theme" msgid="5027604586494772471">"Тема устройства"</string>
<string name="default_theme" msgid="4815428567082263639">"По умолчанию"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Название сети"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Заблокируйте отвлекающие уведомления"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функция недоступна"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Эта функция отключена, поскольку она замедляет работу телефона."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Полные измерения GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Отслеживать все группировки GNSS и частоты без рабочего цикла"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Всегда показывать сообщение об ошибке"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Показывать диалог при каждом сбое приложения"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Выбрать приложение с поддержкой ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Благодаря функции \"Звонки по Wi-Fi\" вы можете совершать и принимать вызовы через некоторые сети Wi-Fi, а не операторов связи."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Звонки"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"Предпочтительно"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"Предпочтительно звонки"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"Предпочтительно SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"Недоступно"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Нет SIM-карты"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Настройки"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Подключаться к общедоступным сетям"</string>
<string name="keywords_internet" msgid="7674082764898690310">"сетевое подключение, Интернет, беспроводная сеть, передача данных, Wi-Fi, wifi, wi fi, сотовая сеть, мобильный Интернет, сотовый оператор, 4G, 3G, 2G, LTE"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Недоступно в ночном режиме"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Сброс настроек важности выполнен."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Приложения"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Неизвестное устройство запрашивает доступ к вашим сообщениям. Нажмите, чтобы узнать больше."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Предоставить доступ к сообщениям?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Неизвестное устройство Bluetooth ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) запрашивает доступ к вашим сообщениям.\n\nЭто ваше первое подключение к устройству [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Неизвестное устройство запрашивает доступ к вашим контактам и списку вызовов. Нажмите, чтобы узнать больше."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Предоставить доступ к контактам и списку вызовов?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Неизвестное устройство Bluetooth ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) запрашивает доступ к вашим контактам и списку вызовов, включая данные о входящих и исходящих звонках.\n\nЭто ваше первое подключение к устройству [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index dab8263..d2d8b52 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 ලිපින"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"සුරකින ලද ජාල"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"දායකත්ව"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"වෙනත් ජාල"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP සැකසීම්"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"මෙම පරිශීලකයා සඳහා Wi‑Fi උසස් සැකසීම් නැත"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"සුරකින්න"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN මකන්න"</string>
<string name="menu_new" msgid="6571230342655509006">"නව APN"</string>
<string name="menu_save" msgid="6611465355127483100">"සුරකින්න"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ඉවත ලන්න"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"අවලංගු කරන්න"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"නම ක්ෂේත්රය හිස් විය නොහැක."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN හිස් විය නොහැක."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"යෙදුම් යළි සැකසිය නොහැකිය"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, ජංගම, බ්ලූටූත් යළි සකසන්න"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"මෙය, පහත ඒවා ඇතුළුව සියලු ජාල සැකසීම් යළි සකසනු ඇත:\n\n"<li>"Wi‑Fi"</li>\n<li>"ජංගම දත්ත"</li>\n<li>"බ්ලූටූත්"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"මකන්න"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"බාගත් SIM පත් මකන්න"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"ප්රතිස්ථාපන SIM පත් බාගැනීමට, ඔබේ වාහකයා සම්බන්ධ කර ගන්න. මෙය ජංගම සේවා සැලසුම් කිසිවක් අවලංගු නොකරයි."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"මෙය ජංගම සේවා සැලසුම් කිසිවක් අවලංගු නොකරනු ඇත. ප්රතිස්ථාපන SIM බාගැනීමට, ඔබගේ වාහකය අමතන්න."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"සැකසීම් යළි පිහිටුවන ලදි"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"සියලු ජාල සැකසීම් යළි සකසන්නේද? ඔබට මෙම ක්රියාව අස් කළ නොහැක."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"සියලු ජාල සැකසීම් යළි සකසන අතර බාගත් SIM මකන්නේද? ඔබට මෙම ක්රියාව අස් කළ නොහැක."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ටැබ්ලට් උපාංගය සාමාන්යයට වඩා වැඩියෙන් භාවිත කර ඇත"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"උපාංගය සාමාන්යයට වඩා වැඩියෙන් භාවිත කර ඇත"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"බැටරිය සාමාන්යයට වඩා කලින් අවසන් විය හැක"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"බැටරි සෞඛ්යය ආරක්ෂා කරමින්"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"බැටරි සෞඛ්යය සඳහා ප්රශස්ත කරමින්"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"බැටරිය තාවකාලිකව සීමිතයි. තව දැන ගැනීමට තට්ටු කරන්න."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"ඔබේ දුරකථනය සාමාන්යයට වඩා වැඩිපුර භාවිත කර ඇත. ඔබගේ බැටරිය බලාපොරොත්තු වූවාට වඩා ඉක්මනින් අවසන් විය හැක.\n\nබැටරි භාවිතයට අනුව ඉහළම යෙදුම්:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"ඔබේ ටැබ්ලටය සාමාන්යයට වඩා වැඩිපුර භාවිත කර ඇත. ඔබගේ බැටරිය බලාපොරොත්තු වූවාට වඩා ඉක්මනින් අවසන් විය හැක.\n\nබැටරි භාවිතයට අනුව ඉහළම යෙදුම්:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"උපරිම දෘශ්යමාන දත්ත කට්ටල"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"පෙරනිමි අගයන්ට යළි සකසන්න"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ස්වයං පිරවුම් සංවර්ධක විකල්ප යළි සකසා ඇත"</string>
+ <string name="location_category" msgid="3496759112306219062">"ස්ථානය"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"තත්ත්ව තීරු ස්ථාන දර්ශකය"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"ජාලය සහ සබැඳුම් හැකියාව ඇතුළුව, සියලු ස්ථාන සඳහා පෙන්වන්න"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"සම්පූර්ණ GNSS මිනුම් බලාත්මක කරන්න"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"කාර්ය චක්රය රහිත සියලු GNSS සබැඳි තාරකා ගෝල සහ සංඛ්යාත"</string>
<string name="device_theme" msgid="5027604586494772471">"උපාංග තේමාව"</string>
<string name="default_theme" msgid="4815428567082263639">"පෙරනිමි"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ජාල නම"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"අවධානය යොමු කිරීම සඳහා දැනුම්දීම් විරාම කරන්න"</string>
<string name="disabled_feature" msgid="7151433782819744211">"විශේෂාංගය නොලැබේ"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"මෙම විශේෂාංගය ඔබේ දුරකථනය මන්දගාමී කරන බැවින් මෙය අක්රිය කර ඇත"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"සම්පූර්ණ GNSS මිනුම් බලාත්මක කරන්න"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"කාර්ය චක්රය රහිත සියලු GNSS සබැඳි තාරකා ගෝල සහ සංඛ්යාත"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"බිඳ වැටීම් සංවාදය සැම විට පෙන්වන්න"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"යෙදුමක් බිඳ වැටෙන සෑම විටම සංවාදය පෙන්වන්න"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE සබල යෙදුමක් තෝරන්න"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"සමහර Wi-Fi ජාල වැනි වාහක නොවන ජාල හරහා ඇමතුම් ලබා ගැනීමට සහ ලැබීමට Wi-Fi ඇමතීම ඔබට ඉඩ දෙයි."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"ඇමතුම්"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"වඩා කැමති"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"වඩා කැමති ඇමතුම්"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"වඩා කැමති SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ලබා ගත නොහැකිය"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM නැත"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"මනාප"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"පොදු ජාලයකට සම්බන්ධ වන්න"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ජාල සම්බන්ධතාව, අන්තර්ජාලය, රැහැන් රහිත, දත්ත, wifi, wi-fi, wi fi, සෙලියුලර්, ජංගම, සෙල් වාහක, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"නිද්රා කාල ප්රකාරය ක්රියාත්මක නිසා ලබා ගත නොහැකිය"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"දැනුම්දීම්වල වැදගත්කම යළි සැකසීම සම්පූර්ණ කරන ලදි."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"යෙදුම්"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"විශ්වාසදායී නොවන උපාංගයකට ඔබගේ පණිවිඩ වෙත ප්රවේශ විමට අවශ්යයි. විස්තර සඳහා තට්ටු කරන්න."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"පණිවිඩවලට ප්රවේශ වීමට ඉඩ දෙන්නද?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"විශ්වාසදායී නොවන බ්ලූටූත් උපාංගයකට, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ඔබගේ පණිවිඩවලට ප්රවේශ වීමට අවශ්යයි.\n\nඔබ මීට පෙර [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] වෙත සබැඳී නැත."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"විශ්වාසදායී නොවන බ්ලූටූත් උපාංගයකට, ඔබගේ සම්බන්ධතාවලට සහ ඇමතුම් ලොගයට ප්රවේශ වීමට අවශ්යයි. විස්තර සඳහා තට්ටු කරන්න."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"සම්බන්ධතා සහ ඇමතුම් ලොගය වෙත ප්රවේශය ඉඩ දෙන්නද?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"විශ්වාසදායී නොවන බ්ලූටූත් උපාංගයකට, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ඔබගේ සම්බන්ධතාවලට සහ ඇමතුම් ලොගයට ප්රවේශ වීමට අවශ්යයි. පැමිණෙන සහ පිටතට යන ඇමතුම් පිළිබඳ දත්ත මෙයට ඇතුළත් වේ.\n\nඔබ මීට පෙර [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] වෙත සබැඳී නැත."</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 143cda6..e1b6ea5 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adresy IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Uložené siete"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Odbery"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Ostatné siete"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Nastavenia adresy IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Rozšírené nastavenia Wi‑Fi nie sú pre tohto používateľa dostupné"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Uložiť"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Odstrániť názov prístupového bodu (APN)"</string>
<string name="menu_new" msgid="6571230342655509006">"Nový prístupový bod"</string>
<string name="menu_save" msgid="6611465355127483100">"Uložiť"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Zahodiť"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Zrušiť"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Pole Meno nemôže byť prázdne."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Názov prístupového bodu (APN) nemôže byť prázdny."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikácie sa dajú resetovať"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Resetovať Wi‑Fi, dáta a Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Touto akciou obnovíte nastavenia všetkých sietí vrátane\n\n"<li>"Wi‑Fi"</li>\n<li>"mobilnej siete"</li>\n<li>"siete Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Vymazať"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Vymazať stiahnuté SIM karty"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Ak chcete stiahnuť náhradné SIM karty, kontaktujte operátora. Nezrušíte tým žiadne tarify mobilných služieb."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Nezrušíte tým žiadne tarify mobilných služieb. Ak si chcete stiahnuť náhradné SIM karty, kontaktujte operátora."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Resetovať nastavenia"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Chcete resetovať všetky nastavenia sietí? Túto akciu nie je možné vrátiť späť."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Chcete resetovať všetky nastavenia sietí a vymazať stiahnuté SIM karty? Túto akciu nie je možné vrátiť späť."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet bol používaný viac ako obvykle"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Zariadenie bolo používané viac ako obvykle"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batéria sa môže vybiť skôr ako obvykle"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Uchovanie životnosti batérie"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimalizácia na zaistenie dobrého stavu batérie"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batéria je dočasne obmedzená. Viac sa dozviete po klepnutí."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefón sa používa viac ako obvykle. Batéria sa možno vybije skôr, ako sa očakávalo.\n\nAplikácie s najväčšou spotrebou batérie:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablet sa používa viac ako obvykle. Batéria sa možno vybije skôr, ako sa očakávalo.\n\nAplikácie s najväčšou spotrebou batérie:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max. viditeľných množín dát"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Resetovať na predvolené hodnoty"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Možnosti automatického dopĺňania pre vývojárov boli obnovené"</string>
+ <string name="location_category" msgid="3496759112306219062">"Miesto"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indikátor umiestnenia stavového riadka"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Zobrazí všetky miesta vrátane siete a pripojenia"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vynútiť úplné meranie GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Sledovať všetky konštelácie a frekvencie GNSS bez cyklického vypínania a zapínania"</string>
<string name="device_theme" msgid="5027604586494772471">"Motív zariadenia"</string>
<string name="default_theme" msgid="4815428567082263639">"Predvolený"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Názov siete"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pozastavte upozornenia, aby ste sa mohli sústrediť"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcia nie je k dispozícii"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Táto funkcia bola vypnutá, pretože spomaľuje telefón"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vynútiť úplné meranie GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Sledovať všetky konštelácie a frekvencie GNSS bez cyklického vypínania a zapínania"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Vždy zobrazovať dialógové okno zlyhania"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Zobraziť dialógové okno pri každom zlyhaní aplikácie"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Vybrať aplikáciu podporujúcu ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Volanie cez Wi‑Fi vám umožňuje volať a prijímať hovory cez siete bez operátora, ako sú niektoré siete Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Hovory"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferované"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferujú sa hovory"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferujú sa správy SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"nie je k dispozícii"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Žiadna SIM karta"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Predvoľby"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Pripájať k verejným sieťam"</string>
<string name="keywords_internet" msgid="7674082764898690310">"pripojenie k sieti, internet, bezdrôtové, dátové, wifi, wi-fi, wi fi, mobilné, mobilný operátor, 4g, 3g, 2g, lte"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nedostupné, pretože je zapnutý režim večierky"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Resetovanie dôležitosti upozornenia je dokončené."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikácie"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Nedôveryhodné zariadenie vyžaduje prístup k vašim správam. Klepnutím zobrazíte podrobnosti."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Chcete povoliť prístup k správam?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Nedôveryhodné zariadenie s rozhraním Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] vyžaduje prístup k vašim správam.\n\nK zariadeniu [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ste sa predtým nikdy nepripojili."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Nedôveryhodné zariadenie vyžaduje prístup k vašim kontaktom a zoznamu hovorov. Klepnutím zobrazíte podrobnosti."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Chcete povoliť prístup ku kontaktom a zoznamu hovorov?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Nedôveryhodné zariadenie s rozhraním Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] vyžaduje prístup k vašim kontaktom a zoznamu hovorov. Zahŕňa to údaje o prichádzajúcich a odchádzajúcich hovoroch.\n\nK zariadeniu [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ste sa predtým nikdy nepripojili."</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 56e394b..5433ff1 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Naslovi IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Shranjena omrežja"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Naročnine"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Druga omrežja"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Nastavitve nasl. IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Dodatne nastavitve za Wi-Fi temu uporabniku niso na voljo"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Shrani"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Izbriši APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nov APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Shrani"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Zavrzi"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Prekliči"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Polje z imenom ne sme biti prazno."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ne sme biti prazen."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikacije je mogoče ponastaviti"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Ponastavi Wi-Fi, mob. podatke in Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"S tem boste ponastavili vse omrežne nastavitve, vključno s temi:\n\n"<li>"Wi‑Fi"</li>\n<li>"Prenos podatkov v mobilnih omrežjih"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Izbriši"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Brisanje prenesenih kartic SIM"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Če želite prenesti nadomestne kartice SIM, se obrnite na operaterja. S tem ne boste prekinili nobenega naročniškega paketa za mobilno telefonijo."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"S tem ne boste prekinili nobenega naročniškega paketa za mobilno telefonijo. Če želite prenesti nadomestne kartice SIM, se obrnite na operaterja."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Ponastavi nastavitve"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Želite ponastaviti vse omrežne nastavitve? Tega dejanja ni mogoče razveljaviti."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Želite ponastaviti vse omrežne nastavitve in izbrisati prenesene kartice SIM? Tega dejanja ni mogoče razveljaviti."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablični računalnik uporabljate več kot običajno"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Napravo uporabljate več kot običajno"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baterija se bo morda izpraznila prej kot običajno"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Ohranjanje zmogljivosti baterije"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimizacija za ohranjanje zmogljivosti baterije"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Baterija je začasno omejena. Za več informacij se dotaknite."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefon ste uporabljali več kot običajno. Baterija se bo morda izpraznila prej, kot ste pričakovali.\n\nAplikacije, ki porabijo največ energije baterije:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tablični računalnik ste uporabljali več kot običajno. Baterija se bo morda izpraznila prej, kot ste pričakovali.\n\nAplikacije, ki porabijo največ energije baterije:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Največje število prikazanih naborov podatkov"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Ponastavi na privzete vrednosti"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Možnosti samodejnega izpolnjevanja za razvijalce so bile ponastavljene"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokacija"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indikator lokacije v vrstici stanja"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Prikaži za vse lokacije, tudi za zaznane na podlagi omrežja in povezav"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vsili popolne meritve GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spremljaj vse razmestitve in frekvence GNSS brez ciklov"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema naprave"</string>
<string name="default_theme" msgid="4815428567082263639">"Privzeto"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Ime omrežja"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Začasno zaustavite prikazovanje obvestil, da ostanete osredotočeni"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funkcija ni na voljo"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ta funkcija je bila izklopljena, ker upočasnjuje vaš telefon"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Vsili popolne meritve GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spremljaj vse razmestitve in frekvence GNSS brez ciklov"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Vedno pokaži pogovorno okno zrušitve"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Pokaži pogovorno okno ob vsaki zrušitvi aplikacije"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Izbira aplikacije, ki podpira ANGLE"</string>
@@ -5218,6 +5221,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Klicanje prek Wi-Fi-ja omogoča opravljanje in prejemanje klicev v omrežjih, ki niso operaterjeva, na primer v nekaterih omrežjih Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Klici"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Sporočila SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"prednostno"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"prednostno: klici"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"prednostno: sporočila SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ni na voljo"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Ni kartice SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Nastavitve"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Povezovanje z javnimi omrežji"</string>
<string name="keywords_internet" msgid="7674082764898690310">"omrežna povezava, internet, brezžično, podatki, wifi, wi-fi, wi fi, mobilno omrežje, mobilno, mobilni operater, 4g, 3g, 2g, lte"</string>
@@ -5226,4 +5234,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Ni na voljo, ker je vklopljen način za spanje"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ponastavitev pomembnosti obvestil je dokončana."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikacije"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Naprava, ki ni vredna zaupanja, želi dostopati do vaših sporočil. Dotaknite se za podrobnosti."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Želite dovoliti dostop do sporočil?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Naprava Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ki ni vredna zaupanja, želi dostopati do vaših sporočil.\n\nŠe nikoli niste vzpostavili povezave z napravo [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Naprava, ki ni vredna zaupanja, želi dostopati do vaših stikov in dnevnika klicev. Dotaknite se za podrobnosti."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Želite dovoliti dostop do stikov in dnevnika klicev?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Naprava Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ki ni vredna zaupanja, želi dostopati do vaših stikov in dnevnika klicev. To vključuje podatke o dohodnih in odhodnih klicih.\n\nŠe nikoli niste vzpostavili povezave z napravo [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index f859255..c1dd2c2 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Adresat IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Rrjetet e ruajtura"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonimet"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Rrjetet e tjera"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Cilësimet e IP-së"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Cilësimet e Wi-Fi nuk disponohen për këtë përdorues"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Ruaj"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Fshi APN-në"</string>
<string name="menu_new" msgid="6571230342655509006">"APN e re"</string>
<string name="menu_save" msgid="6611465355127483100">"Ruaj"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Hiq"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Anulo"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Fusha Emri nuk mund të jetë bosh."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Rrjeti APN nuk mund të jetë bosh."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Aplikacionet mund të rivendosen"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Rivendos Wi-Fi, lidhjen celulare dhe Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Kjo do të rivendosë të gjitha cilësimet e rrjetit, duke përfshirë:\n\n"<li>"Wi‑Fi"</li>\n<li>"Të dhënat celulare"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Spastro"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Spastro kartat SIM të shkarkuara"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Për të shkarkuar karta SIM zëvendësuese, kontakto me operatorin celular. Kjo nuk do të anulojë asnjë plan të shërbimit celular."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Kjo nuk do të anulojë planet e shërbimit celular. Për të shkarkuar karta zëvendësuese SIM, kontakto me operatorin celular."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Rivendos cilësimet"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Të rivendosen të gjitha cilësimet e rrjetit? Ky veprim nuk mund të zhbëhet."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Do t\'i rivendosësh të gjitha cilësimet dhe t\'i spastrosh kartat SIM të shkarkuara? Nuk mund ta zhbësh këtë veprim."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tableti është përdorur më shumë se zakonisht"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Pajisja është përdorur më shumë se zakonisht"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Bateria mund të mbarojë më herët se zakonisht"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Po ruan gjendjen e baterisë"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Po optimizohet për integritetin e baterisë"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Bateria e kufizuar përkohësisht. Trokit për të mësuar më shumë."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefoni yt është përdorur më shumë se zakonisht. Bateria mund të mbarojë më shpejt nga sa pritet.\n\nAplikacionet kryesore sipas përdorimit të baterisë:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tableti yt është përdorur më shumë se zakonisht. Bateria mund të mbarojë më shpejt nga sa pritet.\n\nAplikacionet kryesore sipas përdorimit të baterisë:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Setet maksimale të dukshme të të dhënave"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Rivendos në vlerat e parazgjedhura"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Opsionet e plotësimit automatik të zhvilluesit janë rivendosur"</string>
+ <string name="location_category" msgid="3496759112306219062">"Vendndodhja"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Treguesi i vendndodhjes së shiritit të statusit"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Shfaqe për të gjitha vendndodhjet, duke përfshirë rrjetin dhe lidhshmërinë"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Matjet GNSS me fuqi të plotë"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Gjurmo të gjitha koleksionet dhe frekuencat e GNSS pa ciklim të detyruar"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema e pajisjes"</string>
<string name="default_theme" msgid="4815428567082263639">"I parazgjedhur"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Emri i rrjetit"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Vendos njoftimet në pauzë për të qëndruar i fokusuar"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Veçoria nuk ofrohet"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Kjo veçori është çaktivizuar sepse ngadalëson telefonin tënd"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Matjet GNSS me fuqi të plotë"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Gjurmo të gjitha koleksionet dhe frekuencat e GNSS pa ciklim të detyruar"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Gjithmonë shfaq dialogun e ndërprerjes aksidentale"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Shfaq dialogun sa herë që një aplikacion pëson ndërprerje aksidentale"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Zgjidh aplikacionin e aktivizuar për ANGLE"</string>
@@ -4896,14 +4899,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"Karta SIM nuk mund të aktivizohet"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"Hiq kartën SIM dhe fute përsëri. Nëse problemi vazhdon, rinise pajisjen."</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"Provo të aktivizosh kartën SIM përsëri. Nëse problemi vazhdon, rinise pajisjen."</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"Aktivizimi i rrjetit"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> është aktiv"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"Trokit për të përditësuar cilësimet e kartës SIM"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"Karta SIM"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"Dëshiron ta pastrosh këtë kartë SIM të shkarkuar?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"Spastrimi i kësaj karte SIM e heq shërbimin e <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> nga kjo pajisje.\n\nShërbimi për <xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> nuk do të anulohet."</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"Spastro"</string>
@@ -5056,14 +5055,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Telefonata me Wi-Fi të lejon të bësh dhe të marrësh telefonata përmes rrjeteve jo të operatorëve celularë, si p.sh. disa rrjete Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Telefonatat"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"preferohet"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"preferohen telefonatat"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"preferohet SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"e padisponueshme"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Nuk ka kartë SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Preferencat"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Lidhu me rrjetet publike"</string>
<string name="keywords_internet" msgid="7674082764898690310">"lidhja e rrjetit, internet, pa tel, të dhëna, wifi, wi-fi, wi fi, rrjeti celular, celular, operatori celular, 4g, 3g, 2g, lte"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"Shiko rrjetet e sigurta për në aeroplan"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"Çaktivizo \"Modalitetin e aeroplanit\""</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Nuk ofrohet sepse modaliteti i orarit të gjumit është aktiv"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Rivendosja e rëndësisë së njoftimit përfundoi."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Aplikacionet"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Një pajisje jo e besuar kërkon të ketë qasje te mesazhet e tua. Trokit për detaje."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Të lejohet qasja te mesazhet?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Një pajisje jo e besuar me Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], kërkon të ketë qasje te mesazhet e tua.\n\nNuk je lidhur me [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] më parë."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Një pajisje jo e besuar kërkon të ketë qasje te kontaktet dhe evidenca e telefonatave. Trokit për detaje."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Të lejohet qasja te kontaktet dhe evidenca e telefonatave?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Një pajisje jo e besuar me Bluetooth, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], kërkon të ketë qasje te kontaktet dhe evidenca e telefonatave. Kjo përfshin të dhënat në lidhje me telefonatat hyrëse dhe dalëse.\n\nNuk je lidhur me [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] më parë."</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 7a778ae..600929b 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -1042,8 +1042,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 адресе"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Сачуване мреже"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Претплате"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Остале мреже"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP подешавања"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Напредна подешавања Wi‑Fi мреже нису доступна за овог корисника"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Сачувај"</string>
@@ -1618,7 +1617,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Избриши назив приступне тачке"</string>
<string name="menu_new" msgid="6571230342655509006">"Нов назив приступне тачке"</string>
<string name="menu_save" msgid="6611465355127483100">"Сачувај"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Одбаци"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Откажи"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Поље Назив не сме да буде празно."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Поље Назив приступне тачке не сме да буде празно."</string>
@@ -1633,8 +1632,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Апликације могу да се ресетују"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Ресетуј WiFi, мобилну мрежу и Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Овим ресетујете сва подешавања мреже, укључујући:\n\n"<li>"Wi‑Fi"</li>\n<li>"Мобилне податке"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Обриши"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Обриши преузете SIM картице"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Да бисте преузели заменске SIM картице, контактирајте мобилног оператера. Тиме се неће отказати ниједан тарифни пакет."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Овим не отказујете ниједан тарифни пакет. Да бисте преузимали резервне SIM картице, обратите се мобилном оператеру."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Ресетуј подешавања"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Желите ли да ресетујете сва подешавања мреже? Ова радња не може да се опозове."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Желите ли да ресетујете подешавања мреже и обришете преузете SIM картице? Ова радња не може да се опозове."</string>
@@ -2487,7 +2487,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Таблет сте користили дуже него обично"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Уређај сте користили дуже него обично"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Батерија може да се испразни раније него обично"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Одржава се стање батерије"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Оптимизује се ради доброг стања батерије"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Батерија је тренутно ограничена. Додирните да бисте сазнали више."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Уређај сте користили дуже него обично. Батерија може да се испразни раније од очекиваног.\n\nАпликације са највећом потрошњом батерије:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Таблет сте користили дуже него обично. Батерија може да се испразни раније од очекиваног.\n\nАпликације са највећом потрошњом батерије:"</string>
@@ -4731,6 +4731,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Максималан број видљивих скупова података"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Ресетуј на подразумеване вредности"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Опције за програмера за аутоматско попуњавање су ресетоване"</string>
+ <string name="location_category" msgid="3496759112306219062">"Локација"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Индикатор локације статусне траке"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Прикажи све локације, укључујући мрежу и повезивање"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Принудно покрени пуна GNSS мерења"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Прати све GNSS консталације и фреквенције без циклуса рада"</string>
<string name="device_theme" msgid="5027604586494772471">"Тема уређаја"</string>
<string name="default_theme" msgid="4815428567082263639">"Подразумевана"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Назив мреже"</string>
@@ -4747,8 +4752,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Паузирајте обавештења ради боље концентрације"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функција није доступна"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Ова функција је искључена јер успорава телефон"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Принудно покрени пуна GNSS мерења"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Прати све GNSS консталације и фреквенције без циклуса рада"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Увек приказуј дијалог о отказивању"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Прикажи дијалог сваки пут када апликација откаже"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Изабери апликацију омогућену за ANGLE"</string>
@@ -5135,6 +5138,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Позивање преко WiFi-ја вам омогућава да примате и упућујете позиве преко мрежа које не припадају мобилном оператеру, на пример, неких WiFi мрежа."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Позиви"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"предност"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"предност имају позиви"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"предност има SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"недоступно"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Нема SIM картице"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Подешавања"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Повежите се са јавним мрежама"</string>
<string name="keywords_internet" msgid="7674082764898690310">"мрежна веза, интернет, бежично, подаци, wifi, wi-fi, wi fi, мобилни телефон, мобилни, мобилни оператер, 4g, 3g, 2g, lte"</string>
@@ -5143,4 +5151,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Недоступно је јер је ноћни режим укључен"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ресетовање важности обавештења је довршено."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Апликације"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Непоуздани уређај жели да приступа порукама. Додирните за детаље."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Желите ли да дозволите приступ порукама?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Непоуздани Bluetooth уређај, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], жели да приступа порукама.\n\nРаније се нисте повезивали са уређајем [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Непоуздани уређај жели да приступа контактима и евиденцији позива. Додирните за детаље."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Желите ли да дозволите приступ контактима и евиденцији позива?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Непоуздани Bluetooth уређај, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], жели да приступа контактима и евиденцији позива. То обухвата податке о долазним и одлазним позивима.\n\nРаније се нисте повезивали са уређајем [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 8683609..b79358a 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6-adresser"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Sparade nätverk"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Prenumerationer"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Andra nätverk"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP-inställningar"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Den här användaren har inte tillgång till avancerade Wi‑Fi-inställningar"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Spara"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Ta bort APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Nytt APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Spara"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Släng"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Avbryt"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Fältet Namn får inte vara tomt."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN får inte vara tomt."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Appar kan återställas"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Återställ Wi-Fi, mobildata och Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Alla nätverksinställningar återställs, till exempel \n\n"<li>"Wi‑Fi"</li>\n<li>"Mobildata"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Rensa"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Rensa nedladdade SIM-kort"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Kontakta operatören om du vill ladda ned SIM-kort som ersätter de gamla. Eventuella serviceavtal för mobilen gäller fortfarande."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Det här avbryter inte något serviceavtal för telefonen. Om du vill ladda ned SIM-kort som ersätter de gamla kontaktar du operatören."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Återställ inställningar"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Vill du återställa alla nätverksinställningar? Det går inte att ångra den här åtgärden."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Vill du återställa alla nätverksinställningar och rensa nedladdade SIM-kort? Det går inte att ångra den här åtgärden."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Surfplattan används mer än vanligt"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Enheten används mer än vanligt"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batteriet kan ta slut snabbare än vanligt"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Så förlänger du batteriets livslängd"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Optimerar batteriets livslängd"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batteriet är tillfälligt begränsat. Tryck för att läsa mer."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Mobilen har använts mer än vanligt. Batteriet kan ta slut snabbare än beräknat.\n\nDe mest krävande apparna efter batteriförbrukning:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Surfplattan har använts mer än vanligt. Batteriet kan ta slut snabbare än beräknat.\n\nDe mest krävande apparna efter batteriförbrukning:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Högsta antal synliga datamängder"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Återställ standardvärdena"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Utvecklaralternativen för Autofyll har återställts"</string>
+ <string name="location_category" msgid="3496759112306219062">"Plats"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indikator i statusfältet för platsanvändning"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Visa alltid indikatorn för platsanvändning, även för nätverk och anslutningar"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Framtvinga fullständiga GNSS-mätningar"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spåra alla konstellationer och frekvenser för GNSS utan arbetscykel"</string>
<string name="device_theme" msgid="5027604586494772471">"Enhetstema"</string>
<string name="default_theme" msgid="4815428567082263639">"Standard"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Nätverksnamn"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Pausa aviseringar så du kan behålla ditt fokus"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Funktionen är inte tillgänglig"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Denna funktion har inaktiverats eftersom den gör mobilen långsammare"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Framtvinga fullständiga GNSS-mätningar"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Spåra alla konstellationer och frekvenser för GNSS utan arbetscykel"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Visa alltid en dialogruta vid krascher"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Visa alltid en dialogruta när en app kraschar"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Välj en ANGLE-kompatibel app"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Med Wi-Fi-samtal kan du ringa och ta emot samtal via nätverk som inte tillhör operatörer, till exempel vissa Wi‑Fi-nätverk."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Samtal"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Sms"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"föredras"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"samtal föredras"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"sms föredras"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"otillgängligt"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Inget SIM-kort"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Inställningar"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Anslut till offentliga nätverk"</string>
<string name="keywords_internet" msgid="7674082764898690310">"nätverksanslutning, internet, trådlös, data, wifi, wi-fi, wi fi, mobil, telefon, mobiloperatör, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Inte tillgängligt eftersom sovläget är på"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Aviseringarnas relevans har återställts."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Appar"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"En enhet som inte är betrodd vill få åtkomst till dina meddelanden. Tryck här för mer information."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vill du tillåta åtkomst till meddelanden?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"En Bluetooth-enhet som inte är betrodd, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vill få åtkomst till dina meddelanden.\n\nDu har inte anslutit till [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] tidigare."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"En enhet som inte är betrodd vill få åtkomst till dina kontakter och samtalshistoriken. Tryck här för mer information."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vill du tillåta åtkomst till kontakter och samtalshistorik?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"En Bluetooth-enhet som inte är betrodd, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], vill få åtkomst till dina kontakter och samtalshistoriken. Detta inkluderar data om inkommande och utgående samtal.\n\nDu har inte anslutit till [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] tidigare."</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 99eaa52..3813459 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Anwani za IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Mitandao iliyohifadhiwa"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Usajili"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Mitandao mingine"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Mipangilio ya IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Mtumiaji huyu haruhusiwi kubadilisha mipangilio ya kina ya Wi-Fi"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Hifadhi"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Futa APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN Mpya"</string>
<string name="menu_save" msgid="6611465355127483100">"Hifadhi"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Tupa"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Ghairi"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Huwezi kuacha sehemu hii ikiwa haijajazwa."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Lazima APN ijazwe."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Programu zinaweza kuwekwa upya"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Badilisha mipangilio ya Wi-Fi, data ya simu na Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Hatua hii itabadilisha mipangilio yote ya mtandao ikiwa ni pamoja na:\n\n"<li>"Wi‑Fi"</li>\n<li>"Data ya simu"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Futa data yote"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Futa SIM zilizopakuliwa"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Ili upakue SIM za kubadilisha, wasiliana na mtoa huduma wako. Hatua hii haitaghairi mipango yoyote ya huduma za simu."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Hatua hii haitaghairi mipango yoyote ya huduma za simu. Ili upakue SIM za kubadilisha, wasiliana na mtoa huduma wako."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Badilisha mipangilio"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Je, ungependa kubadilisha mipangilio yote ya mtandao? Huwezi kutendua kitendo hiki."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Je, ungependa kubadilisha mipangilio yote ya mtandao na ufute SIMs zilizopakuliwa? Huwezi kutendua kitendo hiki."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Kompyuta kibao imetumika sana kuliko kawaida"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Kifaa kimetumika sana kuliko kawaida"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Huenda chaji ikaisha haraka zaidi"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Kuboresha muda wa kutumia betri"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Inaboresha muda wa kutumia betri"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Betri imedhibitiwa kwa muda. Gusa ili upate maelezo zaidi."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Simu yako imetumika kuliko kawaida. Huenda chaji ikaisha haraka zaidi ya inavyotarajiwa.\n\nProgramu ambazo zimetumia betri zaidi:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Kompyuta yako kibao imetumika kuliko kawaida. Huenda chaji ikaisha haraka zaidi ya inavyotarajiwa.\n\nProgramu ambazo zimetumia betri zaidi:"</string>
@@ -4652,6 +4652,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Idadi ya juu zaidi ya makundi ya data yanayoonekana"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Rejesha thamani chaguomsingi"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Imebadilisha chaguo za wasanidi programu za kujaza kiotomatiki"</string>
+ <string name="location_category" msgid="3496759112306219062">"Mahali"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Kiashirio cha sehemu ya arifa"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Onyesha kwa maeneo yote, ikiwa ni pamoja na mtandao na muunganisho"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Lazimisha vipimo vya GNSS kamili"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Fuatilia mikusanyiko na mawimbi yote yasiyo na utendakazi wa GNSS"</string>
<string name="device_theme" msgid="5027604586494772471">"Mandhari ya kifaa"</string>
<string name="default_theme" msgid="4815428567082263639">"Chaguomsingi"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Jina la mtandao"</string>
@@ -4668,8 +4673,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Sitisha arifa ili uendelee kumakinika"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Kipengele hakipatikani"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Kipengele hiki kimezimwa kwa sababu kinapunguza kasi ya simu yako"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Lazimisha vipimo vya GNSS kamili"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Fuatilia mikusanyiko na mawimbi yote yasiyo na utendakazi wa GNSS"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Onyesha kidirisha cha programu kuacha kufanya kazi kila wakati"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Onyesha kisanduku kila wakati programu inapoacha kufanya kazi"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Chagua programu inayoweza kutumia ANGLE"</string>
@@ -5053,6 +5056,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Kipengele cha kupiga simu kupitia Wi-Fi kinakuruhusu upige na kupokea simu kupitia mitandao isiyo ya watoa huduma kama vile baadhi ya mitandao ya Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Simu"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"mtoa huduma unayempendelea"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"mtoa huduma wa simu unayempendelea"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"mtoa huduma wa SMS unayempendelea"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"haipatikani"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Hakuna SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Mapendeleo"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Unganisha kwenye mitandao ya umma"</string>
<string name="keywords_internet" msgid="7674082764898690310">"muunganisho wa mtandao, intaneti, isiyotumia waya, data, wifi, wi-fi, wi fi, mtandao wa simu, vifaa vya mkononi, mtoa huduma za vifaa vya mkononi, 4g, 3g, 2g, lte"</string>
@@ -5061,4 +5069,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Haipatikani kwa sababu umewasha hali ya wakati umelala"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Imemaliza kubadilisha mipangilio ya umuhimu wa arifa."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Programu"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Kifaa kisichoaminika kinataka kufikia ujumbe wako. Gusa ili upate maelezo."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Ungependa kuruhusu kifaa kifikie ujumbe?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Kifaa cha Bluetooth kisichoaminika, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], kinataka kufikia ujumbe wako.\n\nHujawahi kuunganisha kwenye [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Kifaa kisichoaminika kinataka kufikia anwani na rekodi yako ya nambari za simu. Gusa ili upate maelezo."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Ungependa kuruhusu kifaa kifikie anwani na rekodi ya nambari za simu?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Kifaa cha Bluetooth kisichoaminika, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], kinataka kufikia anwani na rekodi yako ya nambari za simu. Hii ni pamoja na data kuhusu simu unazopigiwa na unazopiga.\n\nHujawahi kuunganisha kwenye [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index dc30641..7521958 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 முகவரிகள்"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"சேமித்த நெட்வொர்க்குகள்"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"சந்தா செலுத்தியவை"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"பிற நெட்வொர்க்குகள்"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP அமைப்பு"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"இந்தப் பயனருக்கு வைஃபை மேம்பட்ட அமைப்புகள் இல்லை"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"சேமி"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ஐ நீக்கு"</string>
<string name="menu_new" msgid="6571230342655509006">"புதிய APN"</string>
<string name="menu_save" msgid="6611465355127483100">"சேமி"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"நிராகரி"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ரத்துசெய்"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"பெயர் புலம் வெறுமையாக இருக்கக்கூடாது."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN வெறுமையாக இருக்கக்கூடாது."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ஆப்ஸை ரீசெட் செய்யலாம்"</string>
<string name="reset_network_title" msgid="1395494440355807616">"வைஃபை, மொபைல் & புளூடூத்தை மீட்டமை"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"பின்வருபவை உட்பட, எல்லா நெட்வொர்க் அமைப்புகளையும் இது மீட்டமைக்கும்:\n\n"<li>"வைஃபை"</li>\n<li>"மொபைல் தரவு"</li>\n<li>"புளூடூத்"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"அழி"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"பதிவிறக்கிய சிம்களை அழி"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"மாற்று சிம்களைப் பதிவிறக்க மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும். இதனால் உங்கள் மொபைல் திட்டங்கள் எவையும் ரத்துசெய்யப்படாது."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"மொபைல் சேவைத் திட்டங்கள் எவையும் இதனால் ரத்துசெய்யப்படாது. மாற்று சிம்களைப் பதிவிறக்க, உங்கள் மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"அமைப்புகளை மீட்டமை"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"அனைத்து நெட்வொர்க் அமைப்புகளையும் மீட்டமைக்கவா? இதைச் செயல்தவிர்க்க இயலாது."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"அனைத்து நெட்வொர்க் அமைப்புகளையும் மீட்டமைத்து, பதிவிறக்கிய சிம்களை அழிக்கவா? இதைச் செயல்தவிர்க்க இயலாது."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"டேப்லெட் வழக்கத்தைவிட அதிகமாகப் பயன்படுத்தப்பட்டுள்ளது"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"சாதனம் வழக்கத்தைவிட அதிகமாகப் பயன்படுத்தப்பட்டுள்ளது"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"பேட்டரி வழக்கத்தைவிட வேகமாகத் தீர்ந்துவிடக்கூடும்"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"பேட்டரியின் ஆயுளைப் பாதுகாத்திடுங்கள்"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"பேட்டரியின் ஆயுளை மேம்படுத்துகிறது"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"பேட்டரி சார்ஜ் செய்வது தற்காலிகமாகக் கட்டுப்படுத்தப்பட்டுள்ளது. மேலும் அறிய தட்டவும்."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"உங்கள் சாதனம் வழக்கத்தைவிட அதிகமாகப் பயன்படுத்தப்பட்டுள்ளது. எதிர்பார்த்ததைவிட வேகமாக பேட்டரி தீர்ந்துவிடக்கூடும்.\n\nஅதிகளவு பேட்டரியைப் பயன்படுத்திய ஆப்ஸ்:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"உங்கள் டேப்லெட்டை வழக்கத்தைவிட அதிகமாகப் பயன்படுத்தியுள்ளீர்கள். எதிர்பார்த்ததைவிட வேகமாக பேட்டரி தீர்ந்துவிடக்கூடும்.\n\nஅதிகளவு பேட்டரியைப் பயன்படுத்திய ஆப்ஸ்:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"அதிகபட்சத் தெரியக்கூடிய தரவுத் தொகுப்புகள்"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"இயல்புநிலை மதிப்புகளுக்கு மீட்டமை"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"தன்னிரப்பி டெவெலப்பர் விருப்பங்கள் மீட்டமைக்கப்பட்டன"</string>
+ <string name="location_category" msgid="3496759112306219062">"இருப்பிடம்"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"நிலைப் பட்டியின் இருப்பிட இண்டிக்கேட்டர்"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"நெட்வொர்க், இணைப்புநிலை உட்பட அனைத்து இருப்பிடங்களுக்கும் காட்டும்"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"முழுமையான GNSS அளவீடுகளை அமலாக்கு"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"பணி சுழற்சியை முடக்கி, GNSS வழிசெலுத்துதல்கள் மற்றும் அதிர்வெண்கள் அனைத்தையும் கண்காணித்தல்."</string>
<string name="device_theme" msgid="5027604586494772471">"சாதனத்தின் தீம்"</string>
<string name="default_theme" msgid="4815428567082263639">"இயல்பு"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"நெட்வொர்க் பெயர்"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"கவனம் சிதறாமல் இருக்க, அறிவிப்புகளை இடைநிறுத்தவும்"</string>
<string name="disabled_feature" msgid="7151433782819744211">"அம்சம் இல்லை"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"மொபைலின் வேகத்தைப் பாதிப்பதால் இந்த அம்சம் ஆஃப் செய்யப்பட்டுள்ளது"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"முழுமையான GNSS அளவீடுகளை அமலாக்கு"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"பணி சுழற்சியை முடக்கி, GNSS வழிசெலுத்துதல்கள் மற்றும் அதிர்வெண்கள் அனைத்தையும் கண்காணித்தல்."</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"சிதைவு அறிவிப்பை எப்போதும் காட்டு"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"ஆப்ஸ் செயலிழக்கும் போதெல்லாம் சிதைவு அறிவிப்பைக் காட்டும்"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE இயக்கப்பட்ட ஆப்ஸைத் தேர்வுசெய்க"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"வைஃபை அழைப்பு அம்சம் மூலம் சில வைஃபை நெட்வொர்க்குகள் போன்ற மொபைல் நிறுவனம் அல்லாத நெட்வொர்க்குகளைப் பயன்படுத்தி அழைக்கலாம் அழைப்புகளைப் பெறலாம்."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"அழைப்புகள்"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"மெசேஜ்"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"விருப்பம்"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"அழைப்புகளை மேற்கொள்ளலாம்"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"மெசேஜ் அனுப்பலாம்"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"அழைப்புகள்/மெசேஜ் செய்ய முடியாது"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"சிம் இல்லை"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"விருப்பத்தேர்வுகள்"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"பொது நெட்வொர்க்குகளுடன் இணைக்கலாம்"</string>
<string name="keywords_internet" msgid="7674082764898690310">"நெட்வொர்க் இணைப்பு, இணையம், வயர்லெஸ், டேட்டா, வைஃபை, வை-ஃபை, வை ஃபை, செல்லுலார், மொபைல், செல் கேரியர், 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"உறக்கநேரப் பயன்முறை ஆன் செய்யப்பட்டுள்ளதால் கிடைக்காது"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"அறிவிப்பு முக்கியத்துவம் மீட்டமைக்கப்பட்டது."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ஆப்ஸ்"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"நம்பகமற்ற சாதனம் ஒன்று உங்கள் மெசேஜ்களை அணுக விரும்புகிறது. விவரங்களைப் பார்க்க தட்டவும்."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"மெசேஜ்களை அணுக அனுமதிக்கவா?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"[<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] எனும் நம்பகமற்ற புளூடூத் சாதனம் ஒன்று உங்கள் மெசேஜ்களை அணுக விரும்புகிறது.\n\nநீங்கள் இதற்குமுன் [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] சாதனத்துடன் இணைத்ததில்லை."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"நம்பகமற்ற சாதனம் ஒன்று உங்கள் தொடர்புகளையும் அழைப்புப் பதிவையும் அணுக விரும்புகிறது. விவரங்களைப் பார்க்க தட்டவும்."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"தொடர்புகளையும் அழைப்புப் பதிவையும் அணுக அனுமதிக்கவா?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"[<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] எனும் நம்பகமற்ற புளூடூத் சாதனம் ஒன்று உங்கள் தொடர்புகளையும் அழைப்புப் பதிவையும் அணுக விரும்புகிறது. உள்வரும், வெளிச்செல்லும் அழைப்புகளைப் பற்றிய தரவும் இதில் அடங்கும்.\n\nநீங்கள் இதற்குமுன் [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] சாதனத்துடன் இணைத்ததில்லை."</string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index b2748c2..3165c4b 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 చిరునామాలు"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"సేవ్ చేసిన నెట్వర్క్లు"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"సభ్యత్వాలు"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"ఇతర నెట్వర్క్లు"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP సెట్టింగ్లు"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ఈ వినియోగదారుకి Wi‑Fi అధునాతన సెట్టింగ్లు అందుబాటులో లేవు"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"సేవ్ చేయి"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APNను తొలగించు"</string>
<string name="menu_new" msgid="6571230342655509006">"కొత్త APN"</string>
<string name="menu_save" msgid="6611465355127483100">"సేవ్ చేయి"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"విస్మరించు"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"రద్దు చేయి"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"పేరు ఫీల్డ్ ఖాళీగా ఉండకూడదు."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN ఖాళీగా ఉండకూడదు."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"యాప్లను రీసెట్ చేయవచ్చు"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, మొబైల్ డేటా & బ్లూటూత్లను రీసెట్ చేయండి"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"ఇది అన్ని నెట్వర్క్ సెట్టింగ్లను రీసెట్ చేస్తుంది, వీటితో సహా:\n\n"<li>"Wi‑Fi"</li>\n<li>"మొబైల్ డేటా"</li>\n<li>"బ్లూటూత్"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"తొలగించు"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"డౌన్లోడ్ చేసిన SIMలు తొలగించు"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"భర్తీ చేయాల్సిన SIMలను డౌన్లోడ్ చేయడానికి, మీ క్యారియర్ను సంప్రదించండి. ఇది మొబైల్ సేవా ప్లాన్లు వేటినీ రద్దు చేయదు."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ఇది ఏవిధమైన మొబైల్ సర్వీస్ ప్లాన్లను రద్దు చేయదు. రీప్లేస్మెంట్ SIMలను డౌన్లోడ్ చేయడానికి మీ క్యారియర్ను సంప్రదించండి."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"సెట్టింగ్లను రీసెట్ చేయి"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"అన్ని నెట్వర్క్ సెట్టింగ్లను రీసెట్ చేయాలా? మీరు ఈ చర్యను తిరిగి రద్దు చేయలేరు."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"అన్ని నెట్వర్క్ సెట్టింగ్లను రీసెట్ చేసి, డౌన్లోడ్ చేసిన SIMలను తొలగించాలా? మీరు ఈ చర్యను తిరిగి ఉపసంహరించలేరు."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"టాబ్లెట్ సాధారణం కంటే ఎక్కువగా వినియోగించింది"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"పరికరం సాధారణం కంటే ఎక్కువగా వినియోగించింది"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"బ్యాటరీ సాధారణం కంటే తక్కువ సమయం రావచ్చు"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"బ్యాటరీ జీవిత కాలాన్ని సంరక్షిస్తోంది"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"బ్యాటరీ జీవితకాలాన్ని ఆప్టిమైజ్ చేయడం కోసం"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"బ్యాటరీ తాత్కాలికంగా పరిమితం చేయబడింది. మరింత తెలుసుకోవడానికి ట్యాప్ చేయండి."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"మీ ఫోన్ సాధారణం కంటే అధికంగా వినియోగించబడింది. కనుక, మీ బ్యాటరీ, అంచనా వేసిన దాని కంటే తక్కువ సమయంలోనే ఖాళీ అవ్వొచ్చు.\n\nబ్యాటరీని అధికంగా వినియోగిస్తోన్న ప్రధాన యాప్లు:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"మీ టాబ్లెట్ సాధారణం కంటే అధికంగా వినియోగించబడింది. కనుక, మీ బ్యాటరీ, అంచనా వేసిన దాని కంటే తక్కువ సమయంలోనే ఖాళీ అవ్వొచ్చు.\n\nబ్యాటరీని అధికంగా వినియోగిస్తోన్న ప్రధాన యాప్లు:"</string>
@@ -4653,6 +4653,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"కనిపించగల గరిష్ఠ డేటాసమితులు"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"డిఫాల్ట్ విలువలకు రీసెట్ చేయి"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"స్వీయ పూరింపు డెవలపర్ ఎంపికలు రీసెట్ చేయబడ్డాయి"</string>
+ <string name="location_category" msgid="3496759112306219062">"లొకేషన్"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"స్టేటస్ బార్ లొకేషన్ సూచీ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"నెట్వర్క్, కనెక్టివిటీతో పాటు లొకేషన్లు అన్నింటినీ చూపిస్తుంది"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"శక్తివంతమైన GNSS కొలతలు"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"డ్యూటీ సైక్లింగ్ లేకుండా అన్ని GNSS నక్షత్రరాశులను మరియు ఫ్రీక్వెన్సీలను ట్రాక్ చేయండి"</string>
<string name="device_theme" msgid="5027604586494772471">"పరికర రూపం"</string>
<string name="default_theme" msgid="4815428567082263639">"డిఫాల్ట్"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"నెట్వర్క్ పేరు"</string>
@@ -4669,8 +4674,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"ఇతర వ్యాపకాలపై దృష్టి మరలకుండా ఉండడానికి నోటిఫికేషన్లను పాజ్ చేయండి"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ఫీచర్ అందుబాటులో లేదు"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"మీ ఫోన్ పనితీరును నెమ్మదించేలా చేస్తున్నందున ఈ ఫీచర్ ఆఫ్ చేయబడింది"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"శక్తివంతమైన GNSS కొలతలు"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"డ్యూటీ సైక్లింగ్ లేకుండా అన్ని GNSS నక్షత్రరాశులను మరియు ఫ్రీక్వెన్సీలను ట్రాక్ చేయండి"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ఎల్లప్పుడూ క్రాష్ డైలాగ్ని చూపు"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"యాప్ క్రాష్ అయిన ప్రతిసారి డైలాగ్ని చూపు"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"కోణం ప్రారంభించబడిన యాప్ను ఎంచుకోండి"</string>
@@ -4898,14 +4901,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"SIMను యాక్టివేట్ చేయడం సాధ్యం కాదు"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"SIMను తీసివేసి, తిరిగి ఇన్సర్ట్ చేయండి. సమస్య ఇంకా కొనసాగితే, మీ పరికరాన్ని రీస్టార్ట్ చేయండి."</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"SIMను తిరిగి ఆన్ చేయడానికి ట్రై చేయండి. సమస్య ఇంకా కొనసాగితే, మీ పరికరాన్ని రీస్టార్ట్ చేయండి."</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"నెట్వర్క్ యాక్టివేషన్"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> యాక్టివ్గా ఉంది"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"SIM సెట్టింగ్లను అప్డేట్ చేయడానికి ట్యాప్ చేయండి"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"SIM కార్డ్"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"డౌన్లోడ్ చేయబడిన ఈ SIMను తొలగించాలా?"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"ఈ SIMను తొలగించడం వలన ఈ పరికరం నుండి <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> సర్వీస్ తీసివేయబడుతోంది.\n\n <xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> సర్వీస్ రద్దు చేయబడదు."</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"తొలగించు"</string>
@@ -5058,14 +5057,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"క్యారియర్ కాని కొన్ని Wi-Fi నెట్వర్క్ల వంటి వాటి ద్వారా కాల్లను చేయడానికి, స్వీకరించడానికి Wi-Fi కాలింగ్ మిమ్మల్ని అనుమతిస్తుంది."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"కాల్స్"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ప్రాధాన్యతనిస్తుంది"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"కాల్స్కు ప్రాధాన్యతనిస్తుంది"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMSకు ప్రాధాన్యతనిస్తుంది"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"అందుబాటులో లేదు"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"సిమ్ లేదు"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ప్రాధాన్యతలు"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"పబ్లిక్ నెట్వర్క్లకు కనెక్ట్ అవ్వండి"</string>
<string name="keywords_internet" msgid="7674082764898690310">"నెట్వర్క్ కనెక్షన్, ఇంటర్నెట్, వైర్లెస్, డేటా, Wi-Fi, Wi-Fi, Wi-Fi, సెల్యూలార్, మొబైల్, సెల్ క్యారియర్, 4g, 3g, 2g, lte"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"విమానం‑సురక్షిత నెట్వర్క్లను చూడండి"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"విమానం మోడ్ను ఆఫ్ చేయండి"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"బెడ్ టైమ్ మోడ్ ఆన్లో ఉండడం వల్ల అందుబాటులో లేదు"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"రీసెట్ నోటిఫికేషన్ ప్రాముఖ్యత పూర్తయింది."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"యాప్లు"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"విశ్వసనీయం కానటువంటి పరికరం మీ మెసేజ్లను యాక్సెస్ చేయాలని కోరుకుంటోంది. వివరాల కోసం ట్యాప్ చేయండి."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"మెసేజ్లకు యాక్సెస్ను అనుమతించాలా?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"విశ్వసనీయం కానటువంటి బ్లూటూత్ పరికరం, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], మీ మెసేజ్లను యాక్సెస్ చేయాలనుకుంటోంది.\n\nమీరు ఇంతకు ముందెన్నడూ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]కు కనెక్ట్ కాలేదు."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"విశ్వసనీయం కాని పరికరం మీ కాంటాక్ట్లు, కాల్ లాగ్ను యాక్సెస్ చేయాలనుకుంటోంది. వివరాల కోసం ట్యాప్ చేయండి."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"కాంటాక్ట్లకు, కాల్ లాగ్కు యాక్సెస్ను అనుమతించాలా?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"విశ్వసనీయం కానటువంటి బ్లూటూత్ పరికరం, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], మీ కాంటాక్ట్లను, కాల్ లాగ్ను యాక్సెస్ చేయాలనుకుంటోంది. ఇది ఇన్కమింగ్, అవుట్గోయింగ్ కాల్ల డేటాతో కూడి ఉంటుంది.\n\nమీరు ఇంతకు ముందెన్నడూ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]కు కనెక్ట్ కాలేదు."</string>
</resources>
diff --git a/res/values-th/arrays.xml b/res/values-th/arrays.xml
index d9ebe44..3b533bb 100644
--- a/res/values-th/arrays.xml
+++ b/res/values-th/arrays.xml
@@ -233,8 +233,8 @@
<item msgid="50701215019227883">"สั่น"</item>
<item msgid="2690144000353492014">"อ่านรายชื่อติดต่อ"</item>
<item msgid="3858029424955955625">"แก้ไขรายชื่อติดต่อ"</item>
- <item msgid="3439658954936709507">"อ่านประวัติการโทร"</item>
- <item msgid="1908944516631132130">"แก้ไขประวัติการโทร"</item>
+ <item msgid="3439658954936709507">"อ่านบันทึกการโทร"</item>
+ <item msgid="1908944516631132130">"แก้ไขบันทึกการโทร"</item>
<item msgid="9066115715905100138">"อ่านปฏิทิน"</item>
<item msgid="1664720478157892566">"แก้ไขปฏิทิน"</item>
<item msgid="5478277451617814822">"ค้นหา WiFi"</item>
@@ -300,8 +300,8 @@
<item msgid="4104617224667554750">"สั่น"</item>
<item msgid="1623646715189708947">"อ่านรายชื่อติดต่อ"</item>
<item msgid="5060760609109972207">"แก้ไขรายชื่อติดต่อ"</item>
- <item msgid="7451260062940797278">"อ่านประวัติการโทร"</item>
- <item msgid="2348589304974534308">"แก้ไขประวัติการโทร"</item>
+ <item msgid="7451260062940797278">"อ่านบันทึกการโทร"</item>
+ <item msgid="2348589304974534308">"แก้ไขบันทึกการโทร"</item>
<item msgid="4089146706115315300">"อ่านปฏิทิน"</item>
<item msgid="1305780729690198918">"แก้ไขปฏิทิน"</item>
<item msgid="3461096740171440592">"ตำแหน่ง"</item>
@@ -495,7 +495,7 @@
</string-array>
<string-array name="wifi_metered_entries">
<item msgid="3237321077949659241">"ตรวจหาโดยอัตโนมัติ"</item>
- <item msgid="3779092145391320375">"ถือว่ามีการวัดปริมาณอินเทอร์เน็ต"</item>
+ <item msgid="3779092145391320375">"ถือว่ามีการจำกัดปริมาณอินเทอร์เน็ต"</item>
<item msgid="2047166446768045816">"ถือว่าไม่มีการวัดปริมาณอินเทอร์เน็ต"</item>
</string-array>
<string-array name="wifi_privacy_entries">
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 308f2bb..a700379 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"ที่อยู่ IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"เครือข่ายที่บันทึก"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"การสมัครใช้บริการ"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"เครือข่ายอื่น"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"การตั้งค่า IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"การตั้งค่า Wi‑Fi ขั้นสูงไม่พร้อมใช้งานสำหรับผู้ใช้รายนี้"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"บันทึก"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"ลบ APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN ใหม่"</string>
<string name="menu_save" msgid="6611465355127483100">"บันทึก"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"ทิ้ง"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ยกเลิก"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"ต้องใส่ข้อมูลในช่องชื่อ"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"ต้องใส่ข้อมูล APN"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"รีเซ็ตแอปได้"</string>
<string name="reset_network_title" msgid="1395494440355807616">"รีเซ็ต Wi-Fi เน็ตมือถือ และบลูทูธ"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"การดำเนินการนี้จะรีเซ็ตการตั้งค่าเครือข่ายทั้งหมด ได้แก่\n\n"<li>"Wi‑Fi"</li>\n<li>"อินเทอร์เน็ตมือถือ"</li>\n<li>"บลูทูธ"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"ลบ"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ลบซิมที่ดาวน์โหลด"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"โปรดติดต่อผู้ให้บริการเพื่อดาวน์โหลดซิมทดแทน การดำเนินการนี้จะไม่ยกเลิกแพ็กเกจอินเทอร์เน็ตมือถือของคุณ"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"การดำเนินการนี้จะไม่ยกเลิกแพ็กเกจอินเทอร์เน็ตมือถือ หากต้องการดาวน์โหลดซิมสำหรับใช้แทน โปรดติดต่อผู้ให้บริการ"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"รีเซ็ตการตั้งค่า"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"รีเซ็ตการตั้งค่าเครือข่ายทั้งหมดใช่ไหม คุณจะยกเลิกการดำเนินการนี้ไม่ได้"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"รีเซ็ตการตั้งค่าเครือข่ายทั้งหมดและลบซิมที่ดาวน์โหลดไหม คุณจะยกเลิกการดำเนินการนี้ไม่ได้"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ใช้งานแท็บเล็ตมากกว่าปกติ"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"ใช้งานอุปกรณ์มากกว่าปกติ"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"แบตเตอรี่อาจหมดเร็วกว่าปกติ"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"การถนอมแบตเตอรี่"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"การเพิ่มประสิทธิภาพแบตเตอรี่"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"การชาร์จแบตเตอรี่จำกัดชั่วคราว แตะเพื่อดูข้อมูลเพิ่มเติม"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"มีการใช้งานโทรศัพท์มากกว่าปกติ แบตเตอรี่อาจหมดเร็วกว่าที่คาดไว้\n\nแอปที่ใช้แบตเตอรี่มากสุดมีลำดับดังนี้"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"มีการใช้งานแท็บเล็ตมากกว่าปกติ แบตเตอรี่อาจหมดเร็วกว่าที่คาดไว้\n\nแอปที่ใช้แบตเตอรี่มากสุดมีลำดับดังนี้"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"ชุดข้อมูลที่ปรากฏสูงสุด"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"รีเซ็ตเป็นค่าเริ่มต้น"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"ตัวเลือกการป้อนอัตโนมัติสำหรับนักพัฒนาซอฟต์แวร์ได้รับการรีเซ็ตแล้ว"</string>
+ <string name="location_category" msgid="3496759112306219062">"ตำแหน่ง"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"สัญญาณบอกสถานะตำแหน่งของแถบสถานะ"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"แสดงตำแหน่งทั้งหมด รวมถึงเครือข่ายและการเชื่อมต่อ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"บังคับใช้การวัด GNSS เต็มรูปแบบ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ติดตามระบบดาวเทียมและความถี่สัญญาณ GNSS ทั้งหมดโดยไม่มีการปิดพักเพื่อประหยัดพลังงาน"</string>
<string name="device_theme" msgid="5027604586494772471">"ธีมอุปกรณ์"</string>
<string name="default_theme" msgid="4815428567082263639">"ค่าเริ่มต้น"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"ชื่อเครือข่าย"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"หยุดการแจ้งเตือนชั่วคราวเพื่อไม่ให้มีสิ่งรบกวน"</string>
<string name="disabled_feature" msgid="7151433782819744211">"ใช้งานฟีเจอร์ไม่ได้"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"ฟีเจอร์นี้ถูกปิดไปเพราะทำให้โทรศัพท์ช้า"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"บังคับใช้การวัด GNSS เต็มรูปแบบ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ติดตามระบบดาวเทียมและความถี่สัญญาณ GNSS ทั้งหมดโดยไม่มีการปิดพักเพื่อประหยัดพลังงาน"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"แสดงปัญหาที่ขัดข้องเสมอ"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"แสดงกล่องโต้ตอบทุกครั้งที่แอปขัดข้อง"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"เลือกแอปที่พร้อมใช้งาน ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"การโทรผ่าน Wi-Fi ให้คุณโทรออกและรับสายผ่านเครือข่ายที่ไม่ได้เป็นของผู้ให้บริการ เช่น เครือข่าย Wi-Fi บางเครือข่ายได้"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"การโทร"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ต้องการ"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"สายสนทนาที่ต้องการ"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ที่ต้องการ"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ไม่ว่าง"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"ไม่มีซิม"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ค่ากำหนด"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"เชื่อมต่อเครือข่ายสาธารณะ"</string>
<string name="keywords_internet" msgid="7674082764898690310">"การเชื่อมต่อเครือข่าย, อินเทอร์เน็ต, ไร้สาย, อินเทอร์เน็ตมือถือ, wifi, wi-fi, wi fi, เครือข่ายมือถือ, อุปกรณ์เคลื่อนที่, ผู้ให้บริการเครือข่ายมือถือ, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"ใช้ไม่ได้เนื่องจากโหมดเวลาเข้านอนเปิดอยู่"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"รีเซ็ตความสำคัญในการแจ้งเตือนแล้ว"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"แอป"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"อุปกรณ์ที่ไม่น่าเชื่อถือต้องการเข้าถึงข้อความของคุณ แตะเพื่อดูรายละเอียด"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"อนุญาตให้เข้าถึงข้อความไหม"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"อุปกรณ์บลูทูธที่ไม่น่าเชื่อถือ [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] ต้องการเข้าถึงข้อความของคุณ\n\nคุณไม่เคยเชื่อมต่อกับ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] มาก่อน"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"อุปกรณ์ที่ไม่น่าเชื่อถือต้องการเข้าถึงรายชื่อติดต่อและบันทึกการโทร แตะเพื่อดูรายละเอียด"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"อนุญาตให้เข้าถึงรายชื่อติดต่อและบันทึกการโทรไหม"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"อุปกรณ์บลูทูธที่ไม่น่าเชื่อถือ [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] ต้องการเข้าถึงรายชื่อติดต่อและบันทึกการโทร ซึ่งรวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและโทรออก\n\nคุณไม่เคยเชื่อมต่อกับ [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] มาก่อน"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f295ab1..5f47977 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Mga IPv6 address"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Naka-save na network"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Mga Subscription"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Iba pang network"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Mga setting ng IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Hindi available para sa user na ito ang mga advanced na setting ng Wi‑Fi"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"I-save"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"I-delete ang APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Bagong APN"</string>
<string name="menu_save" msgid="6611465355127483100">"I-save"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Itapon"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Kanselahin"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Hindi maaaring walang laman ang field ng Pangalan."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Hindi maaaring walang laman ang APN."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Puwedeng i-reset ang mga app"</string>
<string name="reset_network_title" msgid="1395494440355807616">"I-reset ang Wi-Fi, mobile, at Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Ire-reset nito ang lahat ng setting ng network, kasama ang:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobile data"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Burahin"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Burahin ang na-download na SIM"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Para mag-download ng mga pamalit na SIM, makipag-ugnayan sa iyong carrier. Hindi nito kakanselahin ang anumang service plan sa mobile."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Hindi nito kakanselahin ang anumang plan ng serbisyo sa mobile. Para mag-download ng mga kapalit na SIM, makipag-ugnayan sa iyong carrier."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"I-reset ang mga setting"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"I-reset ang lahat ng network setting? Hindi mo maa-undo ang pagkilos na ito."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"I-reset ang lahat ng network setting at burahin ang mga na-download na SIM? Hindi mo maa-undo ang pagkilos na ito."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Nagamit ang tablet nang higit sa karaniwan"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Nagamit ang device nang higit sa karaniwan"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Baka mas maagang maubos ang baterya kaysa sa karaniwan"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Pagtitipid ng baterya"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Ino-optimize para sa tagal ng baterya"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Pansamantalang limitado ang baterya. Mag-tap para matuto pa."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Nagamit ang iyong telepono nang mas madalas kaysa sa karaniwan. Puwedeng maubos ang iyong baterya nang mas mabilis kaysa sa inaasahan.\n\nMga nangungunang app ayon sa paggamit ng baterya:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Nagamit ang iyong tablet nang mas madalas kaysa sa karaniwan. Puwedeng maubos ang iyong baterya nang mas mabilis kaysa sa inaasahan.\n\nMga nangungunang app ayon sa paggamit ng baterya:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Max ng mga nakikitang dataset"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"I-reset sa mga default na value"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Na-reset ang mga autofill na opsyon ng developer"</string>
+ <string name="location_category" msgid="3496759112306219062">"Lokasyon"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Indicator ng lokasyon sa status bar"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Ipakita para sa lahat ng lokasyon, kasama na ang network at pagkakonekta"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Ipatupad ang kumpletong sukat ng GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Sinusubaybayan ang lahat ng constellation at dalas ng GNSS nang walang duty cycling"</string>
<string name="device_theme" msgid="5027604586494772471">"Tema ng device"</string>
<string name="default_theme" msgid="4815428567082263639">"Default"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Pangalan ng network"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"I-pause ang mga notification para manatiling nakatuon ang pansin"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Hindi available ang feature"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Na-off ang feature na ito dahil pinapabagal nito ang iyong telepono"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Ipatupad ang kumpletong sukat ng GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Sinusubaybayan ang lahat ng constellation at dalas ng GNSS nang walang duty cycling"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Palaging ipakita ang dialog ng pag-crash"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Magpakita ng dialog sa tuwing magka-crash ang isang app"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Pumili ng app na may naka-enable na ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Nagbibigay-daan sa iyo ang pagtawag gamit ang Wi-Fi na tumawag at makatanggap ng mga tawag sa mga non-carrier network gaya ng ilang Wi‑Fi network."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Mga Tawag"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"mas gusto"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"mas gusto ang mga tawag"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"mas gusto ang SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"hindi available"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Walang SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Mga Kagustuhan"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Kumonekta sa mga pampublikong network"</string>
<string name="keywords_internet" msgid="7674082764898690310">"koneksyon ng network, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, cell carrier, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Hindi available dahil naka-on ang bedtime mode"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Tapos na ang pag-reset sa kahalagahan ng notification."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Mga App"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Gustong i-access ng hindi pinagkakatiwalaang device ang iyong mga mensahe. I-tap para sa mga detalye."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Payagan ang access sa mga mensahe?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Gustong i-access ng hindi pinagkakatiwalaang Bluetooth device, ang [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ang iyong mensahe.\n\nHindi ka pa nakakakonekta dati sa [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Gustong i-access ng hindi pinagkakatiwalaang device ang iyong mga contact at log ng tawag. I-tap para sa mga detalye."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Payagan ang access sa mga contact at log ng tawag?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Gustong i-access ng hindi pinagkakatiwalaang Bluetooth device, ang [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ang iyong mga contact at log ng tawag. Kasama rito ang data tungkol sa mga papasok at papalabas na tawag.\n\nHindi ka pa nakakakonekta dati sa [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 25164e2..5eb6356 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 adresleri"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Kayıtlı ağlar"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Abonelikler"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Diğer ağlar"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ayarları"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Bu kullanıcı, gelişmiş Kablosuz ayarlarını kullanamaz"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Kaydet"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN\'yi sil"</string>
<string name="menu_new" msgid="6571230342655509006">"Yeni APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Kaydet"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Sil"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"İptal"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Ad alanı boş olamaz."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN boş olamaz."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Uygulamalar sıfırlanabilir"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Kablosuz, mobil, Bluetooth\'u sıfırla"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Bu sıfırlama işlemi, aşağıdakiler de dahil olmak üzere tüm ağ ayarlarınızı sıfırlayacaktır:\n\n"<li>"Kablosuz ağ"</li>\n<li>"Mobil veri"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Sil"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"İndirilen SIM\'leri sil"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Yedek SIM\'leri indirmek için operatörünüzle iletişime geçin. Bu işlem, mobil hizmet planlarını iptal etmeyecektir."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Bu işlem, mobil hizmet planlarını iptal etmeyecektir. Yedek SIM\'leri indirmek için operatörünüzle iletişime geçin."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Ayarları sıfırla"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Tüm ağ ayarları sıfırlansın mı? Bu işlemi geri alamazsınız."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Tüm ağ ayarları sıfırlansın ve indirilen SIM\'ler silinsin mi? Bu işlemi geri alamazsınız."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Tablet normalden daha fazla kullanıldı"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Cihaz normalden daha fazla kullanıldı"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Pil normalden daha erken bitebilir"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Pil sağlığı korunuyor"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Pil sağlığı için optimize ediliyor"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Pil geçici olarak sınırlı. Daha fazla bilgi için dokunun."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefonunuz normalden daha fazla kullanıldı. Piliniz beklenenden daha erken bitebilir.\n\nEn çok pil kullanan uygulamalar:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Tabletiniz normalden daha fazla kullanıldı. Piliniz beklenenden daha erken bitebilir.\n\nEn çok pil kullanan uygulamalar:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimum görünür veri kümesi"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Varsayılan değerlere sıfırla"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Otomatik doldurma geliştirici seçenekleri sıfırlandı"</string>
+ <string name="location_category" msgid="3496759112306219062">"Yer"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Durum çubuğu konum göstergesi"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Ağ ve bağlantı dahil olmak üzere tüm konumlar için göster"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Tam GNSS ölçümlerini zorla"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Tüm GNSS takımyıldızlarını ve görev döngüsü olmayan frekansları takip et"</string>
<string name="device_theme" msgid="5027604586494772471">"Cihaz teması"</string>
<string name="default_theme" msgid="4815428567082263639">"Varsayılan"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Ağ adı"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Konsantrasyonunuzu bozmamak için bildirimleri duraklatın"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Özellik kullanılamıyor"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Bu özellik, telefonunuzu yavaşlattığı için kapatıldı."</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Tam GNSS ölçümlerini zorla"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Tüm GNSS takımyıldızlarını ve görev döngüsü olmayan frekansları takip et"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Kilitlenme iletişim kutusunu her zaman göster"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Her uygulama kilitlendiğinde iletişim kutusunu göster"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE özellikli uygulamayı seçin"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Kablosuz çağrı, bazı kablosuz ağlar gibi operatör olmayan ağlar üzerinden arama yapmanıza ve almanıza olanak tanır."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Çağrılar"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"tercih edilen"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"arama tercih edildi"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS tercih edildi"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"kullanılamıyor"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM kart yok"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Tercihler"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Herkese açık ağlara bağlan"</string>
<string name="keywords_internet" msgid="7674082764898690310">"ağ bağlantısı, internet, kablosuz, veri, wifi, wi-fi, wi fi, hücresel, mobil, hücresel operatör, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Uyku vakti modu açık olduğundan kullanılamıyor"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Bildirimlerin önemini sıfırlama işlemi tamamlandı."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Uygulamalar"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Güvenilmeyen bir cihaz mesajlarınıza erişmek istiyor. Ayrıntılar için dokunun."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Mesajlara erişime izin verilsin mi?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Güvenilmeyen bir Bluetooth cihazı [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] mesajlarınıza erişmek istiyor.\n\n[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] adlı cihaza daha önce bağlanmadınız."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Güvenilmeyen bir cihaz kişilerinize ve arama kaydınıza erişmek istiyor. Ayrıntılar için dokunun."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Kişilerinize ve arama kaydınıza erişime izin verilsin mi?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Güvenilmeyen bir Bluetooth cihazı [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] kişilerinize ve arama kaydınıza erişmek istiyor. Bu hem gelen hem giden aramalarınıza ait verileri içerir.\n\n [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] adlı cihaza daha önce bağlanmadınız."</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 4a57b6b..280bf91 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -1062,8 +1062,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Адреси IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Збережені мережі"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Підписки"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Інші мережі"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Налаштування IP-адр."</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Розширені налаштування Wi-Fi недоступні для цього користувача"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Зберегти"</string>
@@ -1639,7 +1638,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Видалити APN"</string>
<string name="menu_new" msgid="6571230342655509006">"Нова точка доступу APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Зберегти"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Відхилити"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Скасувати"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Поле \"Назва\" не може бути порожнім."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"Поле APN не може бути порожнім."</string>
@@ -1654,8 +1653,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Додатки може бути скинуто"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Скинути параметри Wi-Fi, мобільного передавання даних і Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Буде скинуто всі налаштування мережі, зокрема \n\n"<li>"Wi‑Fi"</li>\n<li>"мобільний трафік"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Видалити"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Видалити завантажені SIM-карти"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Щоб завантажити нові SIM-карти, зв’яжіться з оператором. Мобільні тарифні плани не буде скасовано."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Мобільні тарифні плани не буде скасовано. Щоб завантажити нові SIM-карти, зв\'яжіться з оператором."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Скинути налаштування"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Скинути налаштування мереж? Цю дію неможливо відмінити."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Скинути налаштування всіх мереж і видалити завантажені SIM-карти? Цю дію неможливо відмінити."</string>
@@ -2518,7 +2518,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Планшет використовується більше, ніж зазвичай"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Пристрій використовується більше, ніж зазвичай"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Акумулятор може розрядитися швидше, ніж зазвичай"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Увімкнено збереження заряду акумулятора"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Оптимізація для збереження заряду акумулятора"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Потужність акумулятора тимчасово обмежена. Натисніть, щоб дізнатися більше."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Ваш телефон використовується більше, ніж зазвичай. Акумулятор може розрядитися швидше.\n\nДодатки, які використовують найбільше заряду:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Ваш планшет використовується більше, ніж зазвичай. Акумулятор може розрядитися швидше.\n\nДодатки, які використовують найбільше заряду:"</string>
@@ -4811,6 +4811,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Максимальні видимі набори даних"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Відновити значення за умовчанням"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Скинуто параметри автозаповнення, які вказав розробник"</string>
+ <string name="location_category" msgid="3496759112306219062">"Місцезнаходження"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Індикатор місцезнаходження в рядку стану"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Показати всі місцезнаходження, зокрема отримані з даних про мережі й підключення"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Увімкнути повне вимірювання GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Відстежувати всі фотосхеми й частоти GNSS без застосування циклічного режиму"</string>
<string name="device_theme" msgid="5027604586494772471">"Тема пристрою"</string>
<string name="default_theme" msgid="4815428567082263639">"За умовчанням"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Назва мережі"</string>
@@ -4827,8 +4832,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Призупинити сповіщення, щоб не відволікатися"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Функція недоступна"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Цю функцію вимкнено, оскільки вона сповільнює роботу телефона"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Увімкнути повне вимірювання GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Відстежувати всі фотосхеми й частоти GNSS без застосування циклічного режиму"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Завжди показувати вікно збоїв"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Показувати вікно під час кожного збою додатка"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Виберіть додаток із підтримкою ANGLE"</string>
@@ -5218,12 +5221,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Завдяки функції \"Дзвінки через Wi-Fi\" ви можете здійснювати та отримувати дзвінки не лише через мережі операторів мобільного зв\'язку, а й через Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Дзвінки"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"пріоритетні"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"пріоритетні дзвінки"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"пріоритетні SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"недоступно"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Немає SIM-карти"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Параметри"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Підключатися до загальнодоступних мереж"</string>
<string name="keywords_internet" msgid="7674082764898690310">"з\'єднання з мережею, Інтернет, бездротове, дані, Wi-Fi, wi-fi, wi fi, мобільний, стільниковий, оператор мобільного зв\'язку, 4G, 3G, 2G, LTE"</string>
- <string name="view_airplane_safe_networks" msgid="7390511371040078514">"Показати безпечні мережі в літаку"</string>
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"Показати безпечні в літаку мережі"</string>
<string name="turn_off_airplane_mode" msgid="1334192337050190071">"Вимкнути режим польоту"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Недоступно в нічному режимі"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Пріоритет сповіщень скинуто."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Додатки"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Ненадійний пристрій хоче отримати доступ до ваших повідомлень. Натисніть, щоб дізнатися більше."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Дозволити доступ до повідомлень?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Ненадійний пристрій із Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] хоче отримати доступ до ваших повідомлень.\n\nВи ще не підключалися до пристрою [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Ненадійний пристрій хоче отримати доступ до ваших контактів і журналу викликів. Натисніть, щоб дізнатися більше."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Дозволити доступ до контактів і журналу викликів?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Ненадійний пристрій із Bluetooth [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] хоче отримати доступ до ваших контактів і журналу викликів, зокрема даних про вхідні й вихідні виклики.\n\nВи ще не підключалися до пристрою [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 85c5179..77318ba 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 پتے"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"محفوظ کردہ نیٹ ورکس"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"سبسکرپشنز"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"دیگر نیٹ ورکس"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ترتیبات"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"اس صارف کیلئے Wi‑Fi کی اعلی ترتیبات دستیاب نہیں ہیں"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"محفوظ کریں"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN کو حذف کریں"</string>
<string name="menu_new" msgid="6571230342655509006">"نیا APN"</string>
<string name="menu_save" msgid="6611465355127483100">"محفوظ کریں"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"مسترد کریں"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"منسوخ کریں"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"نام فیلڈ خالی نہیں رہ سکتی۔"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN خالی نہيں رہ سکتا۔"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"ایپس کو ری سیٹ کیا جا سکتا ہے"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi، موبائل اور بلوٹوتھ ری سیٹ کریں"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"اس سے نیٹ ورک کی سبھی ترتیبات ری سیٹ ہو جائیں گی، بشمول:\n\n"<li>"Wi‑Fi"</li>\n<li>"موبائل ڈیٹا"</li>\n<li>"بلوٹوتھ"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"مٹائیں"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ڈاؤن لوڈ کردہ SIMs کو مٹائیں"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"متبادل SIMs کو ڈاؤن لوڈ کرنے کے لیے، اپنے کیریئر سے رابطہ کریں۔ اس سے موبائل سروس کا کوئی بھی پلان منسوخ نہیں ہوگا۔"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"اس سے موبائل سروس کا کوئی بھی پلان منسوخ نہیں ہوگا۔ متبادل SIMs کو ڈاؤن لوڈ کرنے کے لیے، اپنے کیریئر سے رابطہ کریں۔"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ترتیبات ری سیٹ کریں"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"نیٹ ورک کی سبھی ترتیبات کو دوبارہ ترتیب دیں؟ آپ اس کارروائی کو کالعدم نہیں کر سکتے ہیں۔"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"نیٹ ورک کی سبھی ترتیبات کو ری سیٹ کریں اور ڈاؤن لوڈ کردہ SIMs کو مٹائیں؟ آپ اس کارروائی کو کالعدم نہیں کر سکتے ہیں۔"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"ٹیبلیٹ معمول سے زیادہ استعمال کیا گیا ہے"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"آلہ معمول سے زیادہ استعمال کیا گیا ہے"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"بیٹری معمول سے پہلے ختم ہو سکتی ہے"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"بیٹری کی صحت کی حفاظت کرنا"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"بیٹری کی صحت کے لیے بہتر بنایا جا رہا ہے"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"بیٹری عارضی طور پر محدود ہے۔ مزید جاننے کے لیے تھپتھپائیں۔"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"آپ کا فون معمول سے زیادہ استعمال کیا گيا ہے۔ آپ کی بیٹری توقع سے پہلے ختم ہو سکتی ہے۔\n\nبیٹری کے استعمال کے لحاظ سے سب سے زيادہ استعمال کردہ ایپس:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"آپ کا ٹیبلیٹ معمول سے زیادہ استعمال کیا گيا ہے۔ آپ کی بیٹری توقع سے پہلے ختم ہو سکتی ہے۔\n\nبیٹری کے استعمال کے لحاظ سے سب سے زيادہ استعمال کردہ ایپس:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"زیادہ سے زیادہ مرئی ڈیٹا سیٹس"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"ڈیفالٹ اقدار پر دوبارہ ری سیٹ کریں"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"آٹو فل ڈویلپر کے اختیارات کو دوبارہ ترتیب دے دیا گیا ہے"</string>
+ <string name="location_category" msgid="3496759112306219062">"مقام"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"اسٹیٹس بار کے مقام کا انڈیکیٹر"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"نیٹ ورک اور کنیکٹوٹی سمیت، سبھی مقامات کے لیے دکھائیں"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"مکمل GNSS پیمائشوں کو زبردستی لاگو کریں"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ڈیوٹی سائیکلنگ کے بغیر سبھی GNSS مجموعوں اور کثرتوں کو ٹریک کریں"</string>
<string name="device_theme" msgid="5027604586494772471">"آلہ کا تھیم"</string>
<string name="default_theme" msgid="4815428567082263639">"ڈیفالٹ"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"نیٹ ورک کا نام"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"متوجہ رہنے کے لیے اطلاعات موقوف کریں"</string>
<string name="disabled_feature" msgid="7151433782819744211">"خصوصیت دستیاب نہیں ہے"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"اس خصوصیت کو آف کر دیا گیا کیونکہ یہ آپ کے فون کو سست کر دیتی ہے"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"مکمل GNSS پیمائشوں کو زبردستی لاگو کریں"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"ڈیوٹی سائیکلنگ کے بغیر سبھی GNSS مجموعوں اور کثرتوں کو ٹریک کریں"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"ہمیشہ ناکامی کا ڈائیلاگ دکھائیں"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"جب بھی ایپ ناکام ہو تو ڈائیلاگ دکھائیں"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE کے لیے فعال ایپ منتخب کریں"</string>
@@ -4896,14 +4899,10 @@
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"SIM کو فعال نہیں کیا جا سکتا"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"SIM نکال کر دوبارہ داخل کریں۔ مسئلے کے برقرار رہنے پر اپنا آلہ ری اسٹارٹ کریں۔"</string>
<string name="dsds_activation_failure_body_msg2" msgid="73044349546544410">"SIM کو دوبارہ آن کرنے کی کوشش کریں۔ مسئلے کے برقرار رہنے پر اپنا آلہ ری اسٹارٹ کریں۔"</string>
- <!-- no translation found for sim_setup_channel_id (8797972565087458515) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_title_with_carrier (3308827462185135307) -->
- <skip />
- <!-- no translation found for post_dsds_reboot_notification_text (7533428378211541410) -->
- <skip />
- <!-- no translation found for sim_card_label (5632157635124050923) -->
- <skip />
+ <string name="sim_setup_channel_id" msgid="8797972565087458515">"نیٹ ورک کی فعالیت"</string>
+ <string name="post_dsds_reboot_notification_title_with_carrier" msgid="3308827462185135307">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> فعال ہے"</string>
+ <string name="post_dsds_reboot_notification_text" msgid="7533428378211541410">"SIM کی ترتیبات کو اپ ڈیٹ کرنے کے ليے تھپتھپائیں"</string>
+ <string name="sim_card_label" msgid="5632157635124050923">"SIM کارڈ"</string>
<string name="erase_sim_dialog_title" msgid="881253002169177016">"ڈاؤن لوڈ کردہ اس SIM کو مٹائیں؟"</string>
<string name="erase_sim_dialog_text" msgid="753031064269699885">"اس SIM کو مٹانے سے اس آلہ سے <xliff:g id="CARRIER_NAME_A">%1$s</xliff:g> سروس ہٹ جاتی ہے۔\n\n <xliff:g id="CARRIER_NAME_B">%1$s</xliff:g> کی سروس منسوخ نہیں ہوگی۔"</string>
<string name="erase_sim_confirm_button" msgid="8309115684335320541">"مٹائیں"</string>
@@ -5056,14 +5055,23 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi کالنگ آپ کو کچھ Wi-Fi نیٹ ورک جیسے غیر کیریئر نیٹ ورکس پر کالز کرنے اور موصول کرنے کی اجازت دیتی ہے۔"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"کالز"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ترجیحی"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ترجیحی کالز"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"SMS ترجیحی"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"دستیاب نہیں"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"کوئی SIM نہیں ہے"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"ترجیحات"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"عوامی نیٹ ورکس سے منسلک ہوں"</string>
<string name="keywords_internet" msgid="7674082764898690310">"نیٹ ورک کنکشن، انٹرنیٹ، وائرلیس، ڈیٹا، wifi، wi-fi، wi fi، سیلولر، موبائل، سیل کیریئر، 4g، 3g، 2g، lte"</string>
- <!-- no translation found for view_airplane_safe_networks (7390511371040078514) -->
- <skip />
- <!-- no translation found for turn_off_airplane_mode (1334192337050190071) -->
- <skip />
+ <string name="view_airplane_safe_networks" msgid="7390511371040078514">"ہوائی جہاز کے لیے محفوظ نیٹ ورکس دیکھیں"</string>
+ <string name="turn_off_airplane_mode" msgid="1334192337050190071">"ہوائی جہاز وضع آف کریں"</string>
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"دستیاب نہیں ہے کیونکہ بیڈ ٹائم موڈ آن ہے"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"اطلاع کی اہمیت کو ری سیٹ کرنے کا عمل مکمل ہو گیا۔"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"ایپس"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"غیر بھروسہ مند آلہ آپ کے پیغامات تک رسائی حاصل کرنا چاہتا ہے۔ تفصیلات کے ليے تھپتھپائيں۔"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"پیغامات تک رسائی کی اجازت دیں؟"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"ایک غیر بھروسہ مند بلوٹوتھ آلہ، [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]، آپ کے پیغامات تک رسائی حاصل کرنا چاہتا ہے۔\n\nآپ پہلے کبھی بھی [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] سے منسلک نہیں ہوئے ہیں۔"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"غیر بھروسہ مند آلہ آپ کے رابطوں اور کال لاگ تک رسائی حاصل کرنا چاہتا ہے۔ تفصیلات کے ليے تھپتھپائيں۔"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"رابطوں اور کال لاگ تک رسائی کی اجازت دیں؟"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"ایک غیر بھروسہ مند بلوٹوتھ آلہ، [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]، آپ کے رابطوں اور کال لاگ تک رسائی حاصل کرنا چاہتا ہے۔ اس میں آنے اور جانے والی کالز کے بارے میں ڈیٹا شامل ہے۔\n\nآپ پہلے کبھی بھی [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] سے منسلک نہیں ہوئے ہیں۔"</string>
</resources>
diff --git a/res/values-uz/arrays.xml b/res/values-uz/arrays.xml
index d2f82b7..9d885b2 100644
--- a/res/values-uz/arrays.xml
+++ b/res/values-uz/arrays.xml
@@ -499,8 +499,8 @@
<item msgid="2047166446768045816">"Bu – bepul tarmoq"</item>
</string-array>
<string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Ixtiyoriy MAC manzil (standart)"</item>
- <item msgid="741680937828608749">"Ixtiyoriy MAC manzil"</item>
+ <item msgid="3485945604919292489">"Tasodifiy MAC manzil (standart)"</item>
+ <item msgid="741680937828608749">"Qurilmaning MAC manzili"</item>
</string-array>
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Yo‘q"</item>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index e5b5178..1b6ad87 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 manzillar"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Saqlangan tarmoqlar"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Obunalar"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Boshqa tarmoqlar"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP sozlamalari"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Ushbu foydalanuvchi Wi-Fi kengaytirilgan sozlamalaridan foydalana olmaydi"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Saqlash"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APNni o‘chirish"</string>
<string name="menu_new" msgid="6571230342655509006">"Yangi APN"</string>
<string name="menu_save" msgid="6611465355127483100">"Saqlash"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Bekor qilish"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Bekor qilish"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Nom to‘ldirilmagan bo‘lolmaydi."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN kiritilishi shart"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Ilovalarni asliga qaytarish mumkin"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Wi-Fi, mobil internet va Bluetooth parametrlarini tiklash"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Bu barcha tarmoq sozlamalarini, jumladan, mazkur sozlamalarni asliga qaytaradi:\n\n"<li>"Wi‑Fi"</li>\n<li>"Mobil internet"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Tozalash"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Yuklab olingan SIM kartalar axborotini tozalash"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Almashtiriladigan SIM kartalar yuklab olish uchun aloqa operatoringizga murojaat qiling. Bunda mobil xizmatning hech qaysi tarif rejasi bekor qilinmaydi."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Bunda mobil xizmatning hech qaysi tarif rejasi bekor qilinmaydi. Yangi eSIM profilini yuklab olish uchun aloqa operatoriga murojaat qiling"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Asliga qaytarish"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Barcha tarmoq sozlamalari qayta tiklansinmi? Bu amalni ortga qaytarish imkonsiz."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Barcha tarmoq sozlamalari tiklasinmi va yuklab olingan SIM kartalar axboroti tozalansinmi? Bu amalni ortga qaytara olmaysiz."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Planshet odatdagidan ko‘proq ishlatildi"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Qurilma odatdagidan ko‘proq ishlatildi"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Batareya quvvati odatdagiga nisbatan tezroq tugashi mumkin"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Batareya yaroqlilik muddatini uzaytirish"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Batareya quvvati muvozanatlanmoqda"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Batareya quvvati darajasi vaqtincha cheklangan. Batafsil axborot olish uchun bosing."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Telefoningiz odatdagidan koʻproq ishlatildi. Batareya quvvati kutilgandan tezroq tugashi mumkin.\n\nBatareyani eng koʻp sarflagan ilovalar:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Planshetingiz odatdagidan koʻproq ishlatildi. Batareya quvvati kutilgandan tezroq tugashi mumkin.\n\nBatareyani eng koʻp sarflagan ilovalar:"</string>
@@ -2601,7 +2601,7 @@
<string name="battery_overall_usage" msgid="8940140259734182014">"<xliff:g id="PERCENT">%1$s</xliff:g> batareya quvvati"</string>
<string name="battery_detail_since_full_charge" msgid="5650946565524184582">"100%% quvvatlanganidan beri batareya sarfi"</string>
<string name="battery_last_full_charge" msgid="8308424441475063956">"Oxirgi toʻliq quvvatlanish"</string>
- <string name="battery_full_charge_last" msgid="465146408601016923">"100%% quvvat bilan ishlash vaqti"</string>
+ <string name="battery_full_charge_last" msgid="465146408601016923">"Toʻliq quvvat qancha vaqtga yetishi"</string>
<string name="battery_footer_summary" msgid="9125397752380281832">"Batareyaning qolgan vaqti taxminiy va u foydalanish intensivligiga qarab farq qilishi mumkin"</string>
<string name="battery_detail_foreground" msgid="3312280147931093967">"Faol rejimda"</string>
<string name="battery_detail_background" msgid="3333915023706228000">"Fon rejimida"</string>
@@ -3114,7 +3114,7 @@
<string name="restriction_settings_title" msgid="4293731103465972557">"Cheklovlar"</string>
<string name="restriction_menu_reset" msgid="92859464456364092">"Cheklovlarni olib tashlash"</string>
<string name="restriction_menu_change_pin" msgid="2505923323199003718">"PIN kodni o‘zgartirish"</string>
- <string name="help_label" msgid="2896538416436125883">"Yordam va fikr-mulohaza"</string>
+ <string name="help_label" msgid="2896538416436125883">"Yordam/fikr-mulohaza"</string>
<string name="support_summary" msgid="1034146931237148885">"Yordam maqolalari, telefon va chat, ishni boshlash"</string>
<string name="user_account_title" msgid="6389636876210834864">"Kontent uchun hisob"</string>
<string name="user_picture_title" msgid="7176437495107563321">"Suratli hujjat"</string>
@@ -3598,7 +3598,7 @@
<string name="conversation_onboarding_title" msgid="5194559958353468484">"Muhim va oʻzgargan suhbatlar shu yerda chiqadi"</string>
<string name="conversation_onboarding_summary" msgid="2484845363368486941">"Muhim deb belgilangan yoki oʻzgartirish kiritilgan xabarlar shu yerda chiqadi. \n\nSuhbat sozlamalarini oʻzgartirish uchun: \nEkran tepasini bosib pastga torting, keyin suhbat ustiga biroz bosib turing."</string>
<string name="notification_importance_min" msgid="4609688642942787774">"Tovushsiz chiqarish va kichraytirish"</string>
- <string name="notification_importance_low" msgid="7562535765919565273">"Tovushsiz"</string>
+ <string name="notification_importance_low" msgid="7562535765919565273">"Sokin"</string>
<string name="notification_importance_default" msgid="7483906490369073043">"Tovush bilan"</string>
<string name="notification_importance_high" msgid="8453789143477210550">"Tovush va qalqib chiquvchi oyna"</string>
<string name="notification_importance_high_silent" msgid="8977232884004607985">"Ekranga qalqib chiqish"</string>
@@ -3607,7 +3607,7 @@
<string name="notification_importance_default_title" msgid="8875198696330289686">"Yuqori"</string>
<string name="notification_importance_high_title" msgid="394129291760607808">"Ekranga qalqib chiqish"</string>
<string name="notification_block_title" msgid="7392909527700971673">"Bloklash"</string>
- <string name="notification_silence_title" msgid="4085829874452944989">"Tovushsiz"</string>
+ <string name="notification_silence_title" msgid="4085829874452944989">"Sokin"</string>
<string name="notification_alert_title" msgid="1632401211722199217">"Standart"</string>
<string name="allow_interruption" msgid="5237201780159482716">"Bildirishnomalarga ruxsat berish"</string>
<string name="allow_interruption_summary" msgid="9044131663518112543">"Ilovaga ovozli signal va tebranishni yoqishi hamda ekranga bildirishnomalarni chiqarishiga imkon beradi"</string>
@@ -3678,7 +3678,7 @@
<string name="interact_across_profiles_consent_dialog_app_data_title" msgid="8436318876213958940">"Ilovaga tegishli maʼlumotlar"</string>
<string name="interact_across_profiles_consent_dialog_app_data_summary" msgid="6057019384328088311">"Bu ilova <xliff:g id="NAME">%1$s</xliff:g> ilovasidagi maʼlumotlarga kira oladi."</string>
<string name="interact_across_profiles_consent_dialog_permissions_title" msgid="2316852600280487055">"Ruxsatlar"</string>
- <string name="interact_across_profiles_consent_dialog_permissions_summary" msgid="995051542847604039">"Bu ilova shaxsiy <xliff:g id="NAME">%1$s</xliff:g> ilovangizning ruxsatlaridan foydalana oladi. Masalan, joylashuv axborotingizni bilish, xotira yoki kontaktlardan foydalanish kabi."</string>
+ <string name="interact_across_profiles_consent_dialog_permissions_summary" msgid="995051542847604039">"Bu ilova shaxsiy <xliff:g id="NAME">%1$s</xliff:g> ilovangiz uchun berilgan ruxsatlardan foydalana oladi. Masalan, joylashuvingiz haqidagi axborotni bilish, xotira yoki kontaktlardan foydalanish."</string>
<string name="interact_across_profiles_number_of_connected_apps_none" msgid="8573289199942092964">"Hech qanday ilova ulanmagan"</string>
<plurals name="interact_across_profiles_number_of_connected_apps" formatted="false" msgid="6991750455661974772">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta ilova ulandi</item>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Maksimum ochiq axborot bazalari"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Birlamchi qiymatlariga tiklash"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Avtomatik kiritishning dasturchi parametrlari asliga qaytarildi"</string>
+ <string name="location_category" msgid="3496759112306219062">"Joylashuv"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Holat qatoridagi joylashuv indikatori"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Barcha joylashuvlar, jumladan, tarmoq va ulanish orqali aniqlanadigan, uchun chiqarish"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Butun GNSS statistikasini yuklash"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Siklsiz barcha GNSS sxema va davriyliklarini kuzatish"</string>
<string name="device_theme" msgid="5027604586494772471">"Qurilma mavzusi"</string>
<string name="default_theme" msgid="4815428567082263639">"Standart"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Tarmoq nomi"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Bezovta qiluvchi bildirishnomalarni pauza qiling"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Bu funksiya ishlamaydi"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Bu funksiya telefoningizni sekinlashtirgani sababli u faolsizlantirildi"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Butun GNSS statistikasini yuklash"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Siklsiz barcha GNSS sxema va davriyliklarini kuzatish"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Buzilish oynasi doim ko‘rsatilsin"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Ilova ishdan chiqqanda har safar muloqot oynasi ko‘rsatilsin"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"ANGLE yoqilgan ilovani tanlang"</string>
@@ -4963,7 +4966,7 @@
<string name="wfc_disclaimer_agree_button_text" msgid="4082872292910770344">"DAVOM ETISH"</string>
<string name="wfc_disclaimer_disagree_text" msgid="8424457394700137703">"KERAK EMAS"</string>
<string name="wfc_disclaimer_location_title_text" msgid="7913919887475418423">"Joylashuv"</string>
- <string name="wfc_disclaimer_location_desc_text" msgid="2799241640320172899">"Xizmat taʼminotchingiz bu xizmatni taqdim etish uchun joylashuv axborotingizni toʻplashi mumkin.\n\nXizmat taʼminotchingiz maxfiylik siyosati bilan tanishib chiqing."</string>
+ <string name="wfc_disclaimer_location_desc_text" msgid="2799241640320172899">"Mobil operatoringiz bu xizmatni taqdim etish uchun joylashuvingiz haqidagi axborotni olishi mumkin.\n\nUning maxfiylik siyosati bilan tanishib chiqing."</string>
<string name="forget_passpoint_dialog_message" msgid="2433875063907365760">"Qolgan vaqt yoki axborotga ruxsatni yoʻqotishingiz mumkin. Olib tashlashdan oldin provayderingiz bilan tekshiring."</string>
<string name="keywords_content_capture" msgid="7802155522681936956">"kontentni yozib olish, ilova kontenti"</string>
<string name="content_capture" msgid="868372905432812238">"Ilova kontenti"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi chaqiruv funksiyasi mobil tarmoq ishlatmasdan Wi‑Fi tarmoqlar orqali chaqiruv qilish va chaqiruvlarni qabul qilish imkonini beradi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Chaqiruvlar"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"maqbul"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"maqbul chaqiruvlar"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"Maqbul SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"mavjud emas"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"SIM kartasiz"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Sozlamalar"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Ochiq tarmoqlarga ulanish"</string>
<string name="keywords_internet" msgid="7674082764898690310">"tarmoq aloqasi, internet, simsiz, aloqa, wifi, wi-fi, wi fi, mobil, mobile, mobil tarmoq operatori, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Uyqu vaqti rejimi yoniqligi sababli ishlamaydi"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Muhim bildirishnomalar sozlamalari tiklandi."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Ilovalar"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Notanish qurilma xabarlaringizga kirmoqchi. Batafsil."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Xabarlarga kirishga ruxsat berilsinmi?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Notanish Bluetooth qurilmasi ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) xabarlaringizga kirmoqchi.\n\nSiz ilgari [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] qurilmasiga ulanmagansiz."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Notanish qurilma kontakt va chaqiruvlar jurnaliga kirmoqchi. Batafsil."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Chaqiruvlar va chaqiruvlar jurnaliga kirishga ruxsat berilsinmi?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Notanish Bluetooth qurilmasi ([<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>]) kontakt va chaqiruvlaringiz tarixiga kirmoqchi. Bunga kiruvchi va chiquvchi chaqiruvlar ham kiradi.\n\nSiz ilgari [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] qurilmasiga ulanmagansiz."</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 06bd6ad..bf510f8 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Địa chỉ IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Mạng đã lưu"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Gói đăng ký"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Các mạng khác"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Cài đặt IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Cài đặt nâng cao Wi‑Fi không khả dụng cho người dùng này"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Lưu"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Xóa APN"</string>
<string name="menu_new" msgid="6571230342655509006">"APN mới"</string>
<string name="menu_save" msgid="6611465355127483100">"Lưu"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Hủy"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Hủy"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Không được để trống trường Tên."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN không được để trống."</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Có thể đặt lại các ứng dụng"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Đặt lại Wi-Fi, di động và Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Thao tác này sẽ đặt lại tất cả các tùy chọn cài đặt mạng, bao gồm:\n\n"<li>"Wi‑Fi"</li>\n<li>"Dữ liệu di động"</li>\n<li>"Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Xóa"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Xóa SIM đã tải xuống"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Nếu bạn muốn tải SIM thay thế xuống, hãy liên hệ với nhà mạng. Thao tác này sẽ không hủy bất kỳ gói dịch vụ di động nào."</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Thao tác này sẽ không hủy gói dịch vụ di động nào. Để tải SIM thay thế xuống, hãy liên hệ với nhà mạng của bạn."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Đặt lại các tùy chọn cài đặt"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Bạn muốn đặt lại tất cả tùy chọn cài đặt mạng? Bạn không thể hủy hành động này."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Bạn muốn đặt lại tất cả tùy chọn cài đặt mạng và xóa các SIM đã tải xuống? Bạn không thể hủy hành động này sau khi đã thực hiện."</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Máy tính bảng được sử dụng nhiều hơn thường lệ"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Thiết bị được sử dụng nhiều hơn thường lệ"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Pin có thể hết sớm hơn thường lệ"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Duy trì độ bền của pin"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Tối ưu hóa để cải thiện độ bền của pin"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Thời lượng pin bị hạn chế tạm thời. Nhấn để tìm hiểu thêm."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Bạn sử dụng điện thoại nhiều hơn mức bình thường. Pin điện thoại có thể hết sớm hơn dự kiến.\n\nCác ứng dụng dùng nhiều pin nhất:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Bạn dùng máy tính bảng nhiều hơn mức bình thường. Pin của bạn có thể hết sớm hơn dự kiến.\n\nCác ứng dụng dùng nhiều pin nhất:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Số tập dữ liệu hiển thị tối đa"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Đặt lại về giá trị mặc định"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Đã đặt lại tùy chọn tự động điền dành cho nhà phát triển"</string>
+ <string name="location_category" msgid="3496759112306219062">"Vị trí"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Chỉ báo vị trí trên thanh trạng thái"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Hiển thị cho tất cả vị trí, bao gồm cả mạng và khả năng kết nối"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Thực thi số đo GNSS đầy đủ"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Theo dõi tất cả chòm sao và tần suất GNSS mà không có chu kỳ làm việc"</string>
<string name="device_theme" msgid="5027604586494772471">"Giao diện thiết bị"</string>
<string name="default_theme" msgid="4815428567082263639">"Mặc định"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Tên mạng"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Tạm dừng thông báo để tập trung"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Tính năng không hoạt động"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Tính năng này đã bị tắt vì sẽ khiến điện thoại chạy chậm"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Thực thi số đo GNSS đầy đủ"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Theo dõi tất cả chòm sao và tần suất GNSS mà không có chu kỳ làm việc"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Luôn hiển thị hộp thoại sự cố"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Hiển thị hộp thoại mỗi khi ứng dụng gặp sự cố"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Chọn ứng dụng hỗ trợ ANGLE"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Với tính năng gọi qua Wi‑Fi, bạn có thể gọi và nhận cuộc gọi qua các mạng không phải do nhà mạng cung cấp, chẳng hạn như một số mạng Wi‑Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Cuộc gọi"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"Tin nhắn SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"ưu tiên"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"ưu tiên cuộc gọi"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"ưu tiên SMS"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"không có sẵn"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Không có SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Lựa chọn ưu tiên"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Kết nối với mạng công cộng"</string>
<string name="keywords_internet" msgid="7674082764898690310">"kết nối mạng, Internet, không dây, dữ liệu, wifi, wi-fi, wi fi, di động, nhà mạng di động, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Không dùng được vì chế độ giờ đi ngủ đang bật"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Đã hoàn tất việc đặt lại mức độ quan trọng của thông báo."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Ứng dụng"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Thiết bị không tin cậy muốn truy cập vào tin nhắn của bạn. Hãy nhấn để biết thông tin chi tiết."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Cho phép truy cập vào tin nhắn?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Một thiết bị Bluetooth không tin cậy [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] muốn truy cập vào tin nhắn của bạn.\n\nBạn chưa từng kết nối với [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Thiết bị không tin cậy muốn truy cập vào danh bạ và nhật ký cuộc gọi của bạn. Hãy nhấn để biết thông tin chi tiết."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Cho phép truy cập vào danh bạ và nhật ký cuộc gọi?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Một thiết bị Bluetooth không tin cậy [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] muốn truy cập vào danh bạ và nhật ký cuộc gọi của bạn. Trong đó có cả dữ liệu về cuộc gọi đi và cuộc gọi đến.\n\nBạn chưa từng kết nối với [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]."</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a6c94ba..2c6deca 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 地址"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"已保存的网络"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"订阅"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"其他网络"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP 设置"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"此用户无法查看或修改 WLAN 网络高级设置"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"保存"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"删除 APN"</string>
<string name="menu_new" msgid="6571230342655509006">"新建 APN"</string>
<string name="menu_save" msgid="6611465355127483100">"保存"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"放弃"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"取消"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"“名称”字段不能为空。"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN 不能为空。"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"应用可以重置"</string>
<string name="reset_network_title" msgid="1395494440355807616">"重置 WLAN、移动数据网络和蓝牙设置"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"此操作会重置所有网络设置,包括:\n\n"<li>"WLAN"</li>\n<li>"移动数据网络"</li>\n<li>"蓝牙"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"清空"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"清除已下载的 SIM 卡"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"要下载备用 SIM 卡,请与您的运营商联系。此操作不会取消任何移动服务套餐。"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"此操作并不会取消任何移动服务套餐。如要下载备用 SIM 卡,请与您的运营商联系。"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"重置设置"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"要重置所有网络设置吗?此操作无法撤消。"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"要重置所有网络设置并清除已下载的 SIM 卡吗?此操作无法撤消。"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"平板电脑的使用强度比平时高"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"设备的使用强度比平时高"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"电池电量可能会比平时更快耗尽"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"延长电池续航时间"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"针对电池状况进行优化"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"暂时限用电池。点按即可了解详情。"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"您使用的手机的频率比平时高。电池电量可能会比预期更快耗尽。\n\n耗电量较高的几个应用:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"您使用平板电脑的频率比平时高。电池电量可能会比预期更快耗尽。\n\n耗电量较高的几个应用:"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"可见数据集最大数量"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"重置为默认值"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"已重置自动填充开发者选项"</string>
+ <string name="location_category" msgid="3496759112306219062">"位置"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"状态栏位置指示器"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"对所有位置均显示,包括通过网络和连接方式获取的位置信息"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"强制启用 GNSS 测量结果全面跟踪"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"在停用工作周期的情况下跟踪所有 GNSS 星座和频率"</string>
<string name="device_theme" msgid="5027604586494772471">"设备主题背景"</string>
<string name="default_theme" msgid="4815428567082263639">"默认"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"网络名称"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"暂停通知即可保持专注"</string>
<string name="disabled_feature" msgid="7151433782819744211">"无法使用此功能"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"由于此功能会导致您的手机速度变慢,因此系统已关闭此功能"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"强制启用 GNSS 测量结果全面跟踪"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"在停用工作周期的情况下跟踪所有 GNSS 星座和频率"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"一律显示崩溃对话框"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"在每次应用崩溃时显示对话框"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"选择已启用 ANGLE 的应用"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"WLAN 通话功能支持您通过非运营商网络(例如某些 WLAN 网络)接打电话。"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"通话"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"短信"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"首选"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"首选通话"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"首选短信"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"不可用"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"没有 SIM 卡"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"偏好设置"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"连接到公共网络"</string>
<string name="keywords_internet" msgid="7674082764898690310">"网络连接, 互联网, 无线, 数据, WiFi, Wi-Fi, Wi Fi, WLAN, 移动网络, 移动, 手机运营商, 4G, 3G, 2G, LTE"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"就寝模式开启时无法使用"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"通知重要性重置完成。"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"应用"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"不受信任的设备想要查看您的消息。点按可了解详情。"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"要允许查看消息吗?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"不受信任的蓝牙设备 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] 想要查看您的消息。\n\n您之前没有连接过 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]。"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"不受信任的设备想要查看您的通讯录和通话记录。点按可了解详情。"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"要允许查看通讯录和通话记录吗?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"不受信任的蓝牙设备 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] 想要查看您的通讯录和通话记录,包括有关来电和去电的数据。\n\n您之前没有连接过 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]。"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index d945d10..eda46c6 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 位址"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"已儲存的網絡"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"訂閱"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"其他網絡"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP 設定"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"這位使用者無法查看或變更 Wi-Fi 進階設定"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"儲存"</string>
@@ -1598,7 +1597,7 @@
<string name="menu_delete" msgid="9199740901584348273">"刪除 APN"</string>
<string name="menu_new" msgid="6571230342655509006">"新增 APN"</string>
<string name="menu_save" msgid="6611465355127483100">"儲存"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"捨棄"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"取消"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"[名稱] 欄位不得留空。"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN 不可留空。"</string>
@@ -1613,8 +1612,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"應用程式可以重設"</string>
<string name="reset_network_title" msgid="1395494440355807616">"重設 Wi-Fi、流動數據和藍牙"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"此操作會重設所有網絡設定,包括:\n\n"<li>"Wi‑Fi"</li>\n<li>"流動數據"</li>\n<li>"藍牙"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"清除"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"清除已下載的 SIM 卡"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"如要下載 SIM 替換卡,請聯絡流動網絡供應商。此動作不會取消任何流動服務計劃。"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"此操作不會取消任何流動服務計劃。如要下載替換用的 SIM,請聯絡流動網絡供應商。"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"重設設定"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"您要重設所有網絡設定嗎?您將無法復原這項動作。"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"您要重設所有網絡設定並清除已下載的 SIM 卡嗎?您無法復原這個動作。"</string>
@@ -2457,7 +2457,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"平板電腦使用率比平常高"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"裝置使用率比平常高"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"電池電量可能會比平常更快耗盡"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"延長電池壽命"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"正在優化電池狀態"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"暫時限制電池充電。輕按即可瞭解詳情。"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"您的手機使用率比平常高,電池電量可能會比預期更快耗盡。\n\n電池用量最高的應用程式:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"您的平板電腦使用率比平常高,電池電量可能會比預期更快耗盡。\n\n電池用量最高的應用程式:"</string>
@@ -4652,6 +4652,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"數據集顯示上限"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"重設為預設值"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"自動填入開發人員選項已重設"</string>
+ <string name="location_category" msgid="3496759112306219062">"位置"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"狀態列位置指標"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"顯示所有位置,包括透過網絡和各種連線方式取得的位置資訊"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"強制啟用完整的 GNSS 測量資料"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"在停用工作週期的情況下追蹤所有 GNSS 星座圖和頻率"</string>
<string name="device_theme" msgid="5027604586494772471">"裝置主題"</string>
<string name="default_theme" msgid="4815428567082263639">"預設"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"網絡名稱"</string>
@@ -4668,8 +4673,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"暫停通知,助您保持專注"</string>
<string name="disabled_feature" msgid="7151433782819744211">"功能無法使用"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"由於這項功能會降低手機運行速度,因此已關閉"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"強制啟用完整的 GNSS 測量資料"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"在停用工作週期的情況下追蹤所有 GNSS 星座圖和頻率"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"一律顯示當機對話框"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"在每次應用程式當機時顯示對話框"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"選取支援 ANGLE 的應用程式"</string>
@@ -5053,6 +5056,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi 通話可讓您透過非流動網絡供應商網絡 (例如 Wi-Fi 網絡) 撥打和接聽電話。"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"通話"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"短訊"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"偏好"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"偏好的通話"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"偏好的短訊"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"無法使用"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"沒有 SIM 卡"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"偏好設定"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"連線至公共網絡"</string>
<string name="keywords_internet" msgid="7674082764898690310">"網絡連線, 互聯網, 無線, 數據, Wi-Fi, 流動網絡, 流動裝置, 流動網絡供應商, 4G, 3G, 2G, LTE"</string>
@@ -5061,4 +5069,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"睡眠模式開啟時無法使用"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"通知重要性重設完成。"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"應用程式"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"不信任的裝置想存取您的訊息。輕按即可瞭解詳情。"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"要允許存取訊息嗎?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"不信任的藍牙裝置 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] 想存取您的訊息。\n\n請注意,您從未連接 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]。"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"不信任的裝置要求存取您的聯絡人和通話記錄。輕按即可瞭解詳情。"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"要允許存取聯絡人和通話記錄嗎?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"不信任的藍牙裝置 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] 要求存取您的聯絡人和通話記錄,包括來電和撥出電話的資料。\n\n您從未連接 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]。"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e8e2025..beed3f6 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"IPv6 位址"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"已儲存的網路"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"訂閱"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"其他網路"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP 設定"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"這位使用者無法使用 Wi‑Fi 網路進階設定"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"儲存"</string>
@@ -1597,7 +1596,7 @@
<string name="menu_delete" msgid="9199740901584348273">"刪除 APN"</string>
<string name="menu_new" msgid="6571230342655509006">"新增 APN"</string>
<string name="menu_save" msgid="6611465355127483100">"儲存"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"捨棄"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"取消"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"[名稱] 欄位不得留空。"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APN 不可留空。"</string>
@@ -1612,8 +1611,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"可重設應用程式"</string>
<string name="reset_network_title" msgid="1395494440355807616">"重設 Wi-Fi、行動網路和藍牙"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"這項操作會重設所有網路設定,包括:\n\n"<li>"Wi‑Fi"</li>\n<li>"行動數據"</li>\n<li>"藍牙"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"清除"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"清除已下載的 SIM 卡"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"如要下載替換用的 SIM 卡,請與你的電信業者聯絡。這個動作不會取消任何電信資費方案。"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"這項操作不會取消任何電信資費方案。如要下載替換用的 SIM 卡,請與你的電信業者聯絡。"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"重設設定"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"要重設所有網路設定嗎?請注意,這個動作無法復原。"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"要重設所有網路設定並清除已下載的 SIM 卡嗎?請注意,這個動作無法復原。"</string>
@@ -2456,7 +2456,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"平板電腦使用率比平常高"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"裝置使用率比平常高"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"電池電量可能會比平常更快耗盡"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"維持電池續航力"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"針對電池狀態進行最佳化調整"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"系統已暫時限制電池用量。輕觸即可瞭解詳情。"</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"你的手機使用率比平常高,電池電量可能比預期更快耗盡。\n\n你常用的應用程式如下 (按照電池用量由高到低排序):"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"你的平板電腦使用率比平常高,電池電量可能比預期更快耗盡。\n\n你常用的應用程式如下 (按照電池用量由高到低排序):"</string>
@@ -4651,6 +4651,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"可見資料集數量上限"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"重設為預設值"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"已重設自動填入開發人員選項"</string>
+ <string name="location_category" msgid="3496759112306219062">"位置"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"狀態列位置指標"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"顯示所有位置,包括透過網路和各種連線方式取得的位置資訊"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"強制啟用完整的 GNSS 測量資料"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"在停用工作週期的情況下追蹤所有 GNSS 星座圖和頻率"</string>
<string name="device_theme" msgid="5027604586494772471">"裝置主題"</string>
<string name="default_theme" msgid="4815428567082263639">"預設"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"網路名稱"</string>
@@ -4667,8 +4672,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"暫停通知以保持專注"</string>
<string name="disabled_feature" msgid="7151433782819744211">"無法使用此功能"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"這項功能會降低你的手機速度,因此已由系統停用"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"強制啟用完整的 GNSS 測量資料"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"在停用工作週期的情況下追蹤所有 GNSS 星座圖和頻率"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"一律顯示當機對話方塊"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"在每次應用程式當機時顯示對話方塊"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"選取已啟用 ANGLE 的應用程式"</string>
@@ -5052,6 +5055,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Wi-Fi 通話功能可讓你透過非電信業者網路 (例如某些 Wi-Fi 網路) 撥打電話及接聽來電。"</string>
<string name="calls_preference_title" msgid="7536882032182563800">"通話"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"簡訊"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"偏好"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"偏好通話"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"偏好簡訊"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"無法使用"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"沒有 SIM 卡"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"偏好設定"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"連線至公用網路"</string>
<string name="keywords_internet" msgid="7674082764898690310">"網路連線, 網際網路, 無線, 行動數據, wifi, wi-fi, wi fi, 行動網路, 行動, 電信業者, 4g, 3g, 2g, lte"</string>
@@ -5060,4 +5068,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"就寢時間模式開啟時無法使用"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"通知重要性重設完成。"</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"應用程式"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"不受信任的裝置想要存取你的訊息。輕觸即可瞭解詳情。"</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"要允許存取訊息嗎?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"不受信任的藍牙裝置 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] 想要存取你的訊息。\n\n請注意,你從未連結到 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]。"</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"不受信任的裝置想要存取你的聯絡人和通話記錄。輕觸即可瞭解詳情。"</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"要允許存取聯絡人和通話記錄嗎?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"不受信任的藍牙裝置 [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>] 想要存取你的聯絡人和通話記錄,包括你接聽及撥打的電話。\n\n請注意,你從未連結到 [<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>]。"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 340489a..dc84b5d 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -1022,8 +1022,7 @@
<string name="wifi_details_ipv6_address_header" msgid="1913151339341722443">"Amakheli e-IPv6"</string>
<string name="wifi_saved_access_points_label" msgid="5691340724310548151">"Amanethiwekhi alondoloziwe"</string>
<string name="wifi_subscribed_access_points_tab" msgid="7224061396195667208">"Okubhalisiwe"</string>
- <!-- no translation found for wifi_saved_access_points_tab (2075914709522121708) -->
- <skip />
+ <string name="wifi_saved_other_networks_tab" msgid="7942647415716557293">"Amanye amanethiwekhi"</string>
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"Izilungiselelo ze-IP"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"Izilungiselelo ezithuthukisiwe ze-Wi‑Fi azitholakaleli lo msebenzisi"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"Londoloza"</string>
@@ -1598,7 +1597,7 @@
<string name="menu_delete" msgid="9199740901584348273">"Susa i-APN"</string>
<string name="menu_new" msgid="6571230342655509006">"I-APN Entsha"</string>
<string name="menu_save" msgid="6611465355127483100">"Londoloza"</string>
- <string name="menu_cancel" msgid="4526003389139913077">"Lahla"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"Khansela"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"Igama lenkundla akumelwe lingabi nalutho."</string>
<string name="error_apn_empty" msgid="7657491065443746915">"I-APN akumelwe ingabi nalutho."</string>
@@ -1613,8 +1612,9 @@
<string name="reset_dashboard_summary_onlyApps" msgid="3304252260039419584">"Izinhlelo zokusebenza zingasethwa kabusha"</string>
<string name="reset_network_title" msgid="1395494440355807616">"Setha kabusha i-Wi-Fi, iselula ne-Bluetooth"</string>
<string name="reset_network_desc" msgid="1112523764899788246">"Lokhu kuzosetha kabusha zonke izilungiselelo zenethiwekhi ezifaka:\n\n"<li>"i-Wi‑Fi"</li>\n<li>"Idatha yeselula"</li>\n<li>"ne-Bluetooth"</li></string>
+ <string name="erase_euicc_data_button" msgid="728078969563311737">"Sula"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"Sula ama-SIM alandiwe"</string>
- <string name="reset_esim_desc" msgid="4256518544336245086">"Ukuze ulande ama-SIM okubekwa, xhumana nenkampani yakho yenethiwekhi. Lokhu ngeke kukhansele noma iziphi izinhlelo zesevisi yeselula"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"Lokhu ngeke kukhansele noma yiziphi izinhlelo zesevisi yeselula. Ukuze ulande okokumisela ama-SIM, xhumana nenkampani yakho yenethiwekhi."</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"Setha kabusha izilungiselelo"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"Setha kabusha zonke izilungiselelo zenethiwekhi? Awukwazi ukuhlehlisa lesi senzo."</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"Setha kabusha zonke izilungiselelo zenethiwekhi uphinde usule ama-SMS alandiwe? Awukwazi ukuhlehlisa lesi senzo."</string>
@@ -2457,7 +2457,7 @@
<string name="battery_tip_high_usage_title" product="tablet" msgid="8515903411746145740">"Ithebulethi isetshenziswa ngaphezulu kunokujwayelekile"</string>
<string name="battery_tip_high_usage_title" product="device" msgid="6577086402173910457">"Idivayisi isetshenziswa ngaphezulu kunokujwayelekile"</string>
<string name="battery_tip_high_usage_summary" msgid="5356399389711499862">"Ibhethri lingaphela ngaphambi kwesikhathi kunokujwayelekile"</string>
- <string name="battery_tip_limited_temporarily_title" msgid="3532338978617826383">"Igcina impilo yebhethri"</string>
+ <string name="battery_tip_limited_temporarily_title" msgid="7152799456221596915">"Ilungiselela impilo yebhethri"</string>
<string name="battery_tip_limited_temporarily_summary" msgid="6837061824463128857">"Ibhethri ikhawulelwe okwesikhashana. Thepha ukuze ufunde kabanzi."</string>
<string name="battery_tip_dialog_message" product="default" msgid="4681734836472195966">"Ifoni yakho isetshenziswe ngaphezulu kokujwayelekile. Ibhethri lakho lingaphela ngokushesha kunokulindeleke ngakhona.\n\nIzinhlelo zokusebenza eziphezulu ngokusetshenziswa kwebhethri:"</string>
<string name="battery_tip_dialog_message" product="tablet" msgid="3934298305232120382">"Ithebulethi yakho isetshenziswe ngaphezulu kunokujwayelekile. Ibhethri lakho lingaphela ngokushesha kunokulindeleke ngakhona.\n\nIzinhlelo zokusebenza eziphezulu ngokusetshenziswa kwebhethri:"</string>
@@ -4652,6 +4652,11 @@
<string name="autofill_max_visible_datasets" msgid="4970201981694392229">"Amadathasethi amakhulu abonakalayo"</string>
<string name="autofill_reset_developer_options" msgid="6425613608979498608">"Setha kabusha kuye kumanani azenzakalelayo"</string>
<string name="autofill_reset_developer_options_complete" msgid="1276741935956594965">"Izinketho zokugcwalisa ngokuzenzakalela zonjiniyela zisethwe kabusha"</string>
+ <string name="location_category" msgid="3496759112306219062">"Indawo"</string>
+ <string name="location_indicator_settings_title" msgid="6655916258720093451">"Isikhombi sendawo yebha yesimo"</string>
+ <string name="location_indicator_settings_description" msgid="2888022085372804021">"Bonisa kuzo zonke izindawo, okufaka phakathi inethiwekhi nokuxhumeka"</string>
+ <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Phoqa izikali ezigcwele ze-GNSS"</string>
+ <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Landelela onke ama-constellation nezimvamisa ngomjikelezo ongenawo umsebenzi"</string>
<string name="device_theme" msgid="5027604586494772471">"Itimu yedivayisi"</string>
<string name="default_theme" msgid="4815428567082263639">"Okuzenzakalelayo"</string>
<string name="show_operator_name_title" msgid="3355910331531144028">"Igama lenethiwekhi"</string>
@@ -4668,8 +4673,6 @@
<string name="zen_suggestion_summary" msgid="1984990920503217">"Misa isikhashana izikhangiso ukuze uhlale ugxilile"</string>
<string name="disabled_feature" msgid="7151433782819744211">"Isici asitholakali"</string>
<string name="disabled_feature_reason_slow_down_phone" msgid="5743569256308510404">"Lesi sici sivaliwe ngoba sibambezela ifoni yakho"</string>
- <string name="enable_gnss_raw_meas_full_tracking" msgid="1206679951510243341">"Phoqa izikali ezigcwele ze-GNSS"</string>
- <string name="enable_gnss_raw_meas_full_tracking_summary" msgid="3841463141138247167">"Landelela onke ama-constellation nezimvamisa ngomjikelezo ongenawo umsebenzi"</string>
<string name="show_first_crash_dialog" msgid="1696584857732637389">"Njalo bonisa ibhokisi lokusaphazeka"</string>
<string name="show_first_crash_dialog_summary" msgid="4692334286984681111">"Bonisa ibhokisi njalo izinhlelo zokusebenza zisaphazeka"</string>
<string name="angle_enabled_app" msgid="6044941043384239076">"Khetha uhlelo lokusebenza olunikwe amandla lwe-ANGLE"</string>
@@ -5053,6 +5056,11 @@
<string name="calls_sms_footnote" msgid="7002461875954024216">"Ukushaya kwe-Wi‑Fi kukuvumela ukuthi wenze futhi uthole amakholi ngamanethiwekhi angewona awenkampani yenethiwekhi njengamanye amanethiwekhi we-Wi-Fi."</string>
<string name="calls_preference_title" msgid="7536882032182563800">"Amakholi"</string>
<string name="sms_preference_title" msgid="8392745501754864395">"I-SMS"</string>
+ <string name="calls_sms_preferred" msgid="6016477652522583496">"okuncanyelwayo"</string>
+ <string name="calls_sms_calls_preferred" msgid="252913858812799809">"amakholi ancanyelwayo"</string>
+ <string name="calls_sms_sms_preferred" msgid="5826706870873784062">"I-SMS encanyelwayo"</string>
+ <string name="calls_sms_unavailable" msgid="4055729705246556529">"ayitholakali"</string>
+ <string name="calls_sms_no_sim" msgid="2336377399761819718">"Ayikho i-SIM"</string>
<string name="network_and_internet_preferences_title" msgid="8038469368705591439">"Okuncamelayo"</string>
<string name="network_and_internet_preferences_summary" msgid="613207494152304537">"Xhuma kumanethiwekhi asesidlangalaleni"</string>
<string name="keywords_internet" msgid="7674082764898690310">"uxhumano lenethiwekhi, i-inthanethi, okungenantambo, idatha, i-wifi, i-wi-fi, i-wi fi, iselula, iselula, inkampani yekholi, i-4g, i-3g, i-2g, i-lte"</string>
@@ -5061,4 +5069,10 @@
<string name="aware_summary_when_bedtime_on" msgid="2063856008597376344">"Akutholakali ngoba imodi yesikhathi sokulala ivuliwe"</string>
<string name="reset_importance_completed" msgid="3595536767426097205">"Ukusetha kabusha ukubaluleka kwesaziso kuqediwe."</string>
<string name="apps_dashboard_title" msgid="3269953499954393706">"Izinhlelo zokusebenza"</string>
+ <string name="bluetooth_message_access_notification_content" msgid="2986108412562309009">"Idivayisi engathenjwa ifuna ukufinyelela imilayezo yakho. Thepha ukuze uthole imininingwane."</string>
+ <string name="bluetooth_message_access_dialog_title" msgid="9009836130395061579">"Vumela ukufinyelela kumilayezo?"</string>
+ <string name="bluetooth_message_access_dialog_content" msgid="6004506637437582983">"Idivayisi ye-Bluetooth engathenjwa, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ifuna ukufinyelela imilayezo yakho.\n\nAwukaze uxhume ku-[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ngaphambili."</string>
+ <string name="bluetooth_phonebook_access_notification_content" msgid="4280361621526852063">"Idivayisi engathenjwa ifuna ukufinyelela koxhumana nabo nakurekhodi lamakholi. Thepha ukuze uthole imininingwane."</string>
+ <string name="bluetooth_phonebook_access_dialog_title" msgid="7624607995928968721">"Vumela ukufinyelela koxhumana nabo nakurekhodi lamakholi?"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="2235876209172857819">"Idivayisi ye-Bluetooth engathenjwa, [<xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>], ifuna ukufinyelela koxhumana nabo nakurekhodi lamakholi. Lokhu kufaka phakathi nedatha emayelana namakholi angenayo naphumayo.\n\nAwukaze uxhume ku-[<xliff:g id="DEVICE_NAME_1">%2$s</xliff:g>] ngaphambili."</string>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 7809f05..bc01d59 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -123,13 +123,20 @@
<dimen name="switchbar_subsettings_margin_start">72dp</dimen>
<dimen name="switchbar_subsettings_margin_end">16dp</dimen>
+ <!-- Search bar and avatar -->
<dimen name="search_bar_margin">24dp</dimen>
<dimen name="search_bar_height">48dp</dimen>
- <dimen name="search_bar_text_size">16dp</dimen>
+ <dimen name="search_bar_text_size">16sp</dimen>
<dimen name="search_bar_card_elevation">2dp</dimen>
<dimen name="search_bar_content_inset">64dp</dimen>
<dimen name="avatar_length">@dimen/search_bar_height</dimen>
+ <!-- Contextual suggestions -->
+ <dimen name="suggestion_height">224dp</dimen>
+ <dimen name="suggestion_padding_horizontal">24dp</dimen>
+ <dimen name="suggestion_padding_bottom">8dp</dimen>
+ <dimen name="suggestion_button_margin_top">16dp</dimen>
+ <dimen name="suggestion_button_padding_horizontal">24dp</dimen>
<!-- Dimensions for Wifi Assistant Card -->
<dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index db3b58b..0275269 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2824,16 +2824,12 @@
<string name="night_display_status_title">Status</string>
<!-- Night display screen, setting the color temperature of the display. [CHAR LIMIT=30] -->
<string name="night_display_temperature_title">Intensity</string>
- <!-- Display settings screen, summary format of night display when off. [CHAR LIMIT=NONE] -->
- <string name="night_display_summary_off">Off / <xliff:g name="auto_mode_summary" example="Never turn on automatically">%1$s</xliff:g></string>
<!-- Display settings screen, summary of night display when off and will *never* turn on automatically. [CHAR LIMIT=NONE] -->
<string name="night_display_summary_off_auto_mode_never">Will never turn on automatically</string>
<!-- Display settings screen, summary format of night display when off and will turn on automatically at a user defined time. [CHAR LIMIT=NONE] -->
<string name="night_display_summary_off_auto_mode_custom">Will turn on automatically at <xliff:g name="time" example="6 AM">%1$s</xliff:g></string>
<!-- Display settings screen, summary of night display when off and will turn on automatically at sunset. [CHAR LIMIT=NONE] -->
<string name="night_display_summary_off_auto_mode_twilight">Will turn on automatically at sunset</string>
- <!-- Display settings screen, summary format of night display when on. [CHAR LIMIT=NONE] -->
- <string name="night_display_summary_on">On / <xliff:g name="auto_mode_summary" example="Never turn off automatically">%1$s</xliff:g></string>
<!-- Display settings screen, summary of night display when on and will *never* turn off automatically. [CHAR LIMIT=NONE] -->
<string name="night_display_summary_on_auto_mode_never">Will never turn off automatically</string>
<!-- Display settings screen, summary format of night display when on and will turn off automatically at a user defined time. [CHAR LIMIT=NONE] -->
@@ -2882,16 +2878,12 @@
<string name="dark_ui_auto_mode_custom">Turns on at custom time</string>
<!-- Dark UI screen, setting option name controlling the current activation status. [CHAR LIMIT=30] -->
<string name="dark_ui_status_title">Status</string>
- <!-- Display settings screen, summary format of Dark UI when off. [CHAR LIMIT=NONE] -->
- <string name="dark_ui_summary_off">Off / <xliff:g name="auto_mode_summary" example="Never turn on automatically">%1$s</xliff:g></string>
<!-- Display settings screen, summary of Dark UI when off and will *never* turn on automatically. [CHAR LIMIT=NONE] -->
<string name="dark_ui_summary_off_auto_mode_never">Will never turn on automatically</string>
<!-- Display settings screen, summary of Dark UI when off and will turn on automatically at sunset. [CHAR LIMIT=NONE] -->
<string name="dark_ui_summary_off_auto_mode_auto">Will turn on automatically at sunset</string>
<!-- Display settings screen, summary format of night display when off and will turn on automatically at a user defined time. [CHAR LIMIT=NONE] -->
<string name="dark_ui_summary_off_auto_mode_custom">Will turn on automatically at <xliff:g name="time" example="6 AM">%1$s</xliff:g></string>
- <!-- Display settings screen, summary format of Dark UI when on. [CHAR LIMIT=NONE] -->
- <string name="dark_ui_summary_on">On / <xliff:g name="auto_mode_summary" example="Never turn off automatically">%1$s</xliff:g></string>
<!-- Display settings screen, summary of Dark UI when on and will *never* turn off automatically. [CHAR LIMIT=NONE] -->
<string name="dark_ui_summary_on_auto_mode_never">Will never turn off automatically</string>
<!-- Display settings screen, summary of Dark UI when on and will turn off automatically at sunrise. [CHAR LIMIT=NONE] -->
@@ -3718,10 +3710,13 @@
<!-- SD card & phone storage settings screen, message on screen after user selects Reset network settings [CHAR LIMIT=NONE] -->
<string name="reset_network_desc">This will reset all network settings, including:\n\n<li>Wi\u2011Fi</li>\n<li>Mobile data</li>\n<li>Bluetooth</li>"</string>
- <!-- SD card & phone storage settings screen, title for the checkbox to let user decide whether erase eSIM data together [CHAR LIMIT=50] -->
+ <!-- Erase Euicc -->
+ <!-- Confirmation button of dialog to confirm resetting user's app preferences [CHAR LIMIT=NONE] -->
+ <string name="erase_euicc_data_button">Erase</string>
+ <!-- Erase Euicc dialog and SD card & phone storage settings screen, title for the menu option and checkbox to let user decide whether erase eSIM data together [CHAR LIMIT=50] -->
<string name="reset_esim_title">Erase downloaded SIMs</string>
- <!-- SD card & phone storage settings screen, message for the checkbox to let user decide whether erase eSIM data together [CHAR LIMIT=NONE] -->
- <string name="reset_esim_desc">To download replacement SIMs, contact your carrier. This won\u2019t cancel any mobile service plans.</string>
+ <!-- Erase Euicc dialog and SD card & phone storage settings screen, message for the checkbox to let user decide whether erase eSIM data together [CHAR LIMIT=NONE] -->
+ <string name="reset_esim_desc">This won’t cancel any mobile service plans. To download replacement SIMs, contact your carrier.</string>
<!-- SD card & phone storage settings screen, button on screen after user selects Reset network settings -->
<string name="reset_network_button_text">Reset settings</string>
@@ -4949,6 +4944,8 @@
<string name="audio_and_captions_category_title">Audio & on-screen text</string>
<!-- Title for the accessibility preference category of display services and settings. [CHAR LIMIT=50] -->
<string name="display_category_title">Display</string>
+ <!-- Title for the accessibility text options page. [CHAR LIMIT=50] -->
+ <string name="accessibility_text_and_display_title">Text and display</string>
<!-- Title for the accessibility preference category of interaction control services and settings. [CHAR LIMIT=50] -->
<string name="interaction_control_category_title">Interaction controls</string>
<!-- Title for the accessibility preference category of services downloaded by the user. [CHAR LIMIT=50] -->
@@ -5720,7 +5717,7 @@
<!-- Summary for the battery high usage tip, which presents battery may run out earlier [CHAR LIMIT=NONE] -->
<string name="battery_tip_high_usage_summary">Battery may run out earlier than usual</string>
<!-- Title for the battery limited temporarily tip [CHAR LIMIT=NONE] -->
- <string name="battery_tip_limited_temporarily_title">Preserving battery health</string>
+ <string name="battery_tip_limited_temporarily_title">Optimizing for battery health</string>
<!-- Summary for the battery limited temporarily tip [CHAR LIMIT=NONE] -->
<string name="battery_tip_limited_temporarily_summary">Battery limited temporarily. Tap to learn more.</string>
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
@@ -7108,13 +7105,15 @@
<!-- Title for Guest user [CHAR LIMIT=35] -->
<string name="user_guest">Guest</string>
<!-- Label for item to exit guest mode [CHAR LIMIT=35] -->
- <string name="user_exit_guest_title">Remove guest</string>
+ <string name="user_clear_guest_menu">Clear guest data</string>
+ <!-- Label for item to exit guest mode [CHAR LIMIT=35] -->
+ <string name="user_exit_guest_menu">End guest session</string>
<!-- Title of dialog to user to confirm exiting guest. [CHAR LIMIT=50] -->
- <string name="user_exit_guest_confirm_title">Remove guest?</string>
+ <string name="user_exit_guest_confirm_title">End guest session?</string>
<!-- Message to user to confirm exiting guest. [CHAR LIMIT=none] -->
<string name="user_exit_guest_confirm_message">All apps and data in this session will be deleted.</string>
<!-- Label for button in confirmation dialog when exiting guest session [CHAR LIMIT=35] -->
- <string name="user_exit_guest_dialog_remove">Remove</string>
+ <string name="user_exit_guest_dialog_remove">End session</string>
<!-- Title of preference to enable calling[CHAR LIMIT=40] -->
<string name="user_enable_calling">Turn on phone calls</string>
@@ -8584,7 +8583,7 @@
<string name="recent_conversations">Recent conversations</string>
<!-- [CHAR LIMIT=20] button title -->
- <string name="conversation_settings_clear_recents">Clear recents</string>
+ <string name="conversation_settings_clear_recents">Clear all of the recent ones</string>
<!-- a11y string -->
<string name="clear">Clear</string>
@@ -10863,7 +10862,7 @@
<string name="dark_ui_mode">Dark theme</string>
<!-- [CHAR LIMIT=60] Summary string on dark theme explaining why the toggle is disabled while the setting is still on-->
- <string name="dark_ui_mode_disabled_summary_dark_theme_on">On / Temporarily disabled due to Battery Saver</string>
+ <string name="dark_ui_mode_disabled_summary_dark_theme_on">Temporarily disabled due to Battery Saver</string>
<!-- [CHAR LIMIT=60] Summary string on dark theme explaining why the toggle is disabled while the setting is off-->
<string name="dark_ui_mode_disabled_summary_dark_theme_off">Temporarily turned on due to Battery Saver</string>
@@ -11403,6 +11402,19 @@
<!-- Toast message shown when autofill_reset_developer_options has been performed. [CHAR_LIMIT=none] -->
<string name="autofill_reset_developer_options_complete">Autofill developer options have been reset</string>
+ <!-- Developer options location category strings -->
+ <!-- Title for privacy category [CHAR LIMIT=30]-->
+ <string name="location_category">Location</string>
+ <!-- [CHAR LIMIT=130] Title for location indicator settings -->
+ <string name="location_indicator_settings_title">Status bar location indicator</string>
+ <!-- [CHAR LIMIT=130] Description for location indicator settings -->
+ <string name="location_indicator_settings_description">Show for all locations, including network and connectivity</string>
+
+ <!-- Location setting: preference title - enforce full raw GNSS satellite measurements [CHAR LIMIT=60] -->
+ <string name="enable_gnss_raw_meas_full_tracking">Force full GNSS measurements</string>
+ <!-- Location setting: preference summary - describes the behavior of forcing full raw GNSS satellite measurements [CHAR LIMIT=NONE] -->
+ <string name="enable_gnss_raw_meas_full_tracking_summary">Track all GNSS constellations and frequencies with no duty cycling</string>
+
<!-- Name of setting for switching device theme [CHAR LIMIT=60] -->
<string name="device_theme">Device theme</string>
<!-- Name of default device theme [CHAR LIMIT=60] -->
@@ -11470,11 +11482,6 @@
<!-- Part of a message for an empty state screen. A user will see this message if they try to use a certain feature, but the feature was turned off so it won't slow down their phone. [CHAR LIMIT=NONE] -->
<string name="disabled_feature_reason_slow_down_phone">This feature has been turned off because it slows down your phone</string>
- <!-- UI debug setting: preference title - enforce full raw GNSS satellite measurements [CHAR LIMIT=60] -->
- <string name="enable_gnss_raw_meas_full_tracking">Force full GNSS measurements</string>
- <!-- UI debug setting: preference summary - describes the behavior of forcing full raw GNSS satellite measurements [CHAR LIMIT=NONE] -->
- <string name="enable_gnss_raw_meas_full_tracking_summary">Track all GNSS constellations and frequencies with no duty cycling</string>
-
<!-- UI debug setting: preference title - show all crash dialogs [CHAR LIMIT=60] -->
<string name="show_first_crash_dialog">Always show crash dialog</string>
<!-- UI debug setting: preference summary - describes the behavior of showing a dialog every time an app crashes [CHAR LIMIT=NONE] -->
@@ -12512,9 +12519,23 @@
<!-- Search keywords for "Internet" settings [CHAR_LIMIT=NONE] -->
<string name="keywords_internet">network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, cell carrier, 4g, 3g, 2g, lte</string>
<!-- Label text to view airplane-safe networks. [CHAR LIMIT=40] -->
- <string name="view_airplane_safe_networks">View airplane-safe networks</string>
+ <string name="view_airplane_safe_networks">View airplane mode networks</string>
<!-- Label text to turn off airplane mode. [CHAR LIMIT=40] -->
- <string name="turn_off_airplane_mode">Turn off Airplane Mode</string>
+ <string name="turn_off_airplane_mode">Turn off airplane mode</string>
+
+ <!-- Summary text separator for preferences including a short description
+ (eg. "Connected / 5G"). [CHAR LIMIT=50] -->
+ <string name="preference_summary_default_combination"><xliff:g id="state" example="Connected">%1$s</xliff:g> / <xliff:g id="networkMode" example="LTE">%2$s</xliff:g></string>
+ <!-- Provider Model:
+ Summary indicating that a SIM has an active mobile data connection [CHAR LIMIT=50] -->
+ <string name="mobile_data_connection_active">Connected</string>
+ <!-- Provider Model:
+ Summary indicating that a SIM has no mobile data connection [CHAR LIMIT=50] -->
+ <string name="mobile_data_off_summary">Internet won\u0027t auto\u2011connect</string>
+ <!-- Provider Model: Summary indicating that no other networks available [CHAR LIMIT=50] -->
+ <string name="non_carrier_network_unavailable">No other networks available</string>
+ <!-- Provider Model: Summary indicating that no networks available [CHAR LIMIT=50] -->
+ <string name="all_network_unavailable">No networks available</string>
<!-- Summary for preference when Bedtime mode is on [CHAR LIMIT=NONE] -->
<string name="aware_summary_when_bedtime_on">Unavailable because bedtime mode is on</string>
@@ -12524,4 +12545,30 @@
<!-- Title for setting tile leading to Apps settings [CHAR LIMIT=40]-->
<string name="apps_dashboard_title">Apps</string>
+
+ <!-- Bluetooth message permission alert for notification content [CHAR LIMIT=none] -->
+ <string name="bluetooth_message_access_notification_content">Untrusted device wants to access your messages. Tap for details.</string>
+ <!-- Bluetooth message permission alert for dialog title [CHAR LIMIT=none] -->
+ <string name="bluetooth_message_access_dialog_title">Allow access to messages?</string>
+ <!-- Bluetooth message permission alert for dialog content [CHAR LIMIT=none] -->
+ <string name="bluetooth_message_access_dialog_content">An untrusted Bluetooth device, <xliff:g id="device_name" example="My device">%1$s</xliff:g>, wants to access your messages.\n\nYou haven\u2019t connected to <xliff:g id="device_name" example="My device">%2$s</xliff:g> before.</string>
+ <!-- Bluetooth phonebook permission alert for notification content [CHAR LIMIT=none] -->
+ <string name="bluetooth_phonebook_access_notification_content">Untrusted device wants to access your contacts and call log. Tap for details.</string>
+ <!-- Bluetooth phonebook permission alert for dialog title [CHAR LIMIT=none] -->
+ <string name="bluetooth_phonebook_access_dialog_title">Allow access to contacts and call log?</string>
+ <!-- Bluetooth phonebook permission alert for dialog content [CHAR LIMIT=none] -->
+ <string name="bluetooth_phonebook_access_dialog_content">An untrusted Bluetooth device, <xliff:g id="device_name" example="My device">%1$s</xliff:g>, wants to access your contacts and call log. This includes data about incoming and outgoing calls.\n\nYou haven\u2019t connected to <xliff:g id="device_name" example="My device">%2$s</xliff:g> before.</string>
+
+ <!-- Brightness category name in Display Settings [CHAR LIMIT=none] -->
+ <string name="category_name_brightness">Brightness</string>
+ <!-- Lock screen category name in Display Settings [CHAR LIMIT=none] -->
+ <string name="category_name_lock_display">Lock Display</string>
+ <!-- Visibility category name in Display Settings [CHAR LIMIT=none] -->
+ <string name="category_name_visibility">Visibility</string>
+ <!-- Color category name in Display Settings [CHAR LIMIT=none] -->
+ <string name="category_name_color">Color</string>
+ <!-- Others category name [CHAR LIMIT=none] -->
+ <string name="category_name_others">Others</string>
+ <!-- General category name [CHAR LIMIT=none] -->
+ <string name="category_name_general">General</string>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index fd4d268..ce6b095 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -782,6 +782,14 @@
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
</style>
+ <style name="ContextualSuggestionText" parent="@android:style/TextAppearance.DeviceDefault">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textSize">32sp</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
+ </style>
+
<style name="RequestManageCredentialsButtonPanel">
<item name="android:paddingStart">12dp</item>
<item name="android:paddingEnd">12dp</item>
diff --git a/res/values/themes_suw.xml b/res/values/themes_suw.xml
index 98ab28d..959ffb3 100644
--- a/res/values/themes_suw.xml
+++ b/res/values/themes_suw.xml
@@ -197,8 +197,8 @@
<item name="android:textAllCaps">false</item>
<item name="android:windowSoftInputMode">adjustResize</item>
- <!-- copied from Theme.DeviceDefault.Light.Dialog.Alert -->
- <item name="colorAccent">@*android:color/accent_device_default_light</item>
+ <!-- copied from Theme.DeviceDefault.Dialog.Alert -->
+ <item name="colorAccent">@*android:color/accent_device_default_dark</item>
<item name="dialogCornerRadius">@*android:dimen/config_dialogCornerRadius</item>
</style>
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index 6781e28..6efd884 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -45,52 +45,19 @@
android:title="@string/display_category_title">
<Preference
- android:fragment="com.android.settings.display.ToggleFontSizePreferenceFragment"
- android:key="font_size_preference_screen"
+ android:fragment="com.android.settings.accessibility.TextAndDisplayFragment"
+ android:key="text_and_display_preference_screen"
android:persistent="false"
- android:title="@string/title_font_size"
- settings:controller="com.android.settings.display.FontSizePreferenceController"
- settings:searchable="false"/>
+ android:title="@string/accessibility_text_and_display_title"
+ settings:searchable="true"/>
- <com.android.settings.display.ScreenZoomPreference
- android:fragment="com.android.settings.display.ScreenZoomSettings"
- android:key="accessibility_settings_screen_zoom"
- android:persistent="false"
- android:title="@string/screen_zoom_title"
- settings:searchable="false"/>
-
- <SwitchPreference
- android:key="dark_ui_mode_accessibility"
- android:persistent="false"
- android:title="@string/dark_ui_mode"
- settings:controller="com.android.settings.display.DarkUIPreferenceController"
- settings:searchable="false"/>
-
- <Preference
+ <Preference
android:fragment="com.android.settings.accessibility.MagnificationPreferenceFragment"
android:icon="@drawable/ic_accessibility_magnification"
android:key="magnification_preference_screen"
android:persistent="false"
android:title="@string/accessibility_screen_magnification_title"
settings:controller="com.android.settings.accessibility.MagnificationPreferenceController"/>
-
- <SwitchPreference
- android:key="toggle_large_pointer_icon"
- android:persistent="false"
- android:title="@string/accessibility_toggle_large_pointer_icon_title"
- settings:controller="com.android.settings.accessibility.LargePointerIconPreferenceController"/>
-
- <SwitchPreference
- android:key="toggle_disable_animations"
- android:persistent="false"
- android:title="@string/accessibility_disable_animations"
- settings:controller="com.android.settings.accessibility.DisableAnimationsPreferenceController"/>
-
- <SwitchPreference
- android:key="toggle_force_bold_text"
- android:persistent="false"
- android:title="@string/force_bold_text"
- settings:controller="com.android.settings.accessibility.FontWeightAdjustmentPreferenceController"/>
</PreferenceCategory>
<PreferenceCategory
@@ -203,42 +170,12 @@
settings:initialExpandedChildrenCount="1">
<SwitchPreference
- android:key="toggle_high_text_contrast_preference"
- android:persistent="false"
- android:title="@string/accessibility_toggle_high_text_contrast_preference_title"
- settings:controller="com.android.settings.accessibility.HighTextContrastPreferenceController"/>
-
- <Preference
- android:fragment="com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment"
- android:icon="@drawable/ic_daltonizer"
- android:key="daltonizer_preference"
- android:persistent="false"
- android:title="@string/accessibility_display_daltonizer_preference_title"
- settings:controller="com.android.settings.accessibility.DaltonizerPreferenceController"/>
-
- <Preference
- android:fragment="com.android.settings.accessibility.ToggleColorInversionPreferenceFragment"
- android:icon="@drawable/ic_color_inversion"
- android:key="toggle_inversion_preference"
- android:persistent="false"
- android:title="@string/accessibility_display_inversion_preference_title"
- settings:controller="com.android.settings.accessibility.ColorInversionPreferenceController"/>
-
- <SwitchPreference
android:key="accessibility_shortcut_preference"
android:persistent="false"
android:title="@string/accessibility_shortcut_service_on_lock_screen_title"
android:summary="@string/accessibility_shortcut_description"
settings:controller="com.android.settings.accessibility.AccessibilityShortcutPreferenceController"/>
- <!--TODO(b/170973645): Get icon-->
- <Preference
- android:fragment="com.android.settings.accessibility.ToggleReduceBrightColorsPreferenceFragment"
- android:key="reduce_bright_colors_preference"
- android:persistent="false"
- android:title="@string/reduce_bright_colors_preference_title"
- settings:controller="com.android.settings.accessibility.ReduceBrightColorsPreferenceController"/>
-
</PreferenceCategory>
</PreferenceScreen>
diff --git a/res/xml/accessibility_text_and_display.xml b/res/xml/accessibility_text_and_display.xml
new file mode 100644
index 0000000..7dce826
--- /dev/null
+++ b/res/xml/accessibility_text_and_display.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="accessibility_text_and_display"
+ android:persistent="false"
+ android:title="@string/accessibility_text_and_display_title">
+
+ <SwitchPreference
+ android:key="toggle_high_text_contrast_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_toggle_high_text_contrast_preference_title"
+ settings:controller="com.android.settings.accessibility.HighTextContrastPreferenceController"/>
+
+ <SwitchPreference
+ android:key="dark_ui_mode_accessibility"
+ android:persistent="false"
+ android:title="@string/dark_ui_mode"
+ settings:controller="com.android.settings.display.DarkUIPreferenceController"
+ settings:searchable="false"/>
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment"
+ android:icon="@drawable/ic_daltonizer"
+ android:key="daltonizer_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_display_daltonizer_preference_title"
+ settings:controller="com.android.settings.accessibility.DaltonizerPreferenceController"/>
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.ToggleColorInversionPreferenceFragment"
+ android:icon="@drawable/ic_color_inversion"
+ android:key="toggle_inversion_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_display_inversion_preference_title"
+ settings:controller="com.android.settings.accessibility.ColorInversionPreferenceController"/>
+
+ <!--TODO(b/170973645): Get icon-->
+ <Preference
+ android:fragment="com.android.settings.accessibility.ToggleReduceBrightColorsPreferenceFragment"
+ android:key="reduce_bright_colors_preference"
+ android:persistent="false"
+ android:title="@string/reduce_bright_colors_preference_title"
+ settings:controller="com.android.settings.accessibility.ReduceBrightColorsPreferenceController"/>
+
+ <SwitchPreference
+ android:key="toggle_disable_animations"
+ android:persistent="false"
+ android:title="@string/accessibility_disable_animations"
+ settings:controller="com.android.settings.accessibility.DisableAnimationsPreferenceController"/>
+
+ <com.android.settings.display.ScreenZoomPreference
+ android:fragment="com.android.settings.display.ScreenZoomSettings"
+ android:key="accessibility_settings_screen_zoom"
+ android:persistent="false"
+ android:title="@string/screen_zoom_title"
+ settings:searchable="false"/>
+
+ <Preference
+ android:fragment="com.android.settings.display.ToggleFontSizePreferenceFragment"
+ android:key="font_size_preference_screen"
+ android:persistent="false"
+ android:title="@string/title_font_size"
+ settings:controller="com.android.settings.display.FontSizePreferenceController"
+ settings:searchable="false"/>
+
+ <SwitchPreference
+ android:key="toggle_force_bold_text"
+ android:persistent="false"
+ android:title="@string/force_bold_text"
+ settings:controller="com.android.settings.accessibility.FontWeightAdjustmentPreferenceController"/>
+
+ <SwitchPreference
+ android:key="toggle_large_pointer_icon"
+ android:persistent="false"
+ android:title="@string/accessibility_toggle_large_pointer_icon_title"
+ settings:controller="com.android.settings.accessibility.LargePointerIconPreferenceController"/>
+
+ <PreferenceCategory
+ android:key="experimental_category"
+ android:persistent="false"
+ android:title="@string/experimental_category_title"
+ settings:initialExpandedChildrenCount="1">
+ </PreferenceCategory>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index f06ed2e..f5549f9 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -175,14 +175,6 @@
android:title="@string/automatic_system_heap_dump_title"
android:summary="@string/automatic_system_heap_dump_summary" />
- <Preference android:key="mock_location_app"
- android:title="@string/mock_location_app" />
-
- <SwitchPreference
- android:key="enable_gnss_raw_meas_full_tracking"
- android:title="@string/enable_gnss_raw_meas_full_tracking"
- android:summary="@string/enable_gnss_raw_meas_full_tracking_summary" />
-
<SwitchPreference
android:key="debug_view_attributes"
android:title="@string/debug_view_attributes" />
@@ -696,4 +688,25 @@
android:targetClass="com.android.settings.development.storage.BlobInfoListView" />
</Preference>
</PreferenceCategory>
+
+ <PreferenceCategory
+ android:key="location_category"
+ android:title="@string/location_category"
+ android:order="1300">
+
+ <Preference android:key="mock_location_app"
+ android:title="@string/mock_location_app" />
+
+ <SwitchPreference
+ android:key="enable_gnss_raw_meas_full_tracking"
+ android:title="@string/enable_gnss_raw_meas_full_tracking"
+ android:summary="@string/enable_gnss_raw_meas_full_tracking_summary" />
+
+ <SwitchPreference
+ android:title="@string/location_indicator_settings_title"
+ android:summary="@string/location_indicator_settings_description"
+ android:defaultValue="true"
+ android:key="location_indicator_settings"
+ settings:controller="com.android.settings.location.LocationIndicatorsPreferenceController"/>
+ </PreferenceCategory>
</PreferenceScreen>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 07564f0..8df5696 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -40,12 +40,12 @@
settings:controller="com.android.settings.display.DarkUIPreferenceController"
settings:keywords="@string/keywords_dark_ui_mode"/>
- <com.android.settings.display.NightDisplayPreference
+ <com.android.settings.widget.PrimarySwitchPreference
android:key="night_display"
android:title="@string/night_display_title"
android:fragment="com.android.settings.display.NightDisplaySettings"
- android:widgetLayout="@null"
- settings:widgetLayout="@null"/>
+ settings:controller="com.android.settings.display.NightDisplayPreferenceController"
+ settings:keywords="@string/keywords_display_night_display"/>
<Preference
android:key="auto_brightness_entry"
@@ -63,7 +63,7 @@
</com.android.settingslib.RestrictedPreference>
<!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
- <Preference
+ <com.android.settingslib.RestrictedPreference
android:key="screen_timeout"
android:title="@string/screen_timeout"
android:summary="@string/summary_placeholder"
diff --git a/res/xml/display_settings_v2.xml b/res/xml/display_settings_v2.xml
new file mode 100644
index 0000000..0b43914
--- /dev/null
+++ b/res/xml/display_settings_v2.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="display_settings_screen"
+ android:title="@string/display_settings"
+ settings:keywords="@string/keywords_display">
+
+ <PreferenceCategory
+ android:title="@string/category_name_brightness">
+
+ <com.android.settingslib.RestrictedPreference
+ android:key="brightness"
+ android:title="@string/brightness"
+ settings:keywords="@string/keywords_display_brightness_level"
+ settings:useAdminDisabledSummary="true"
+ settings:userRestriction="no_config_brightness">
+ <intent android:action="com.android.intent.action.SHOW_BRIGHTNESS_DIALOG"/>
+ </com.android.settingslib.RestrictedPreference>
+
+ <com.android.settings.widget.PrimarySwitchPreference
+ android:key="auto_brightness_entry"
+ android:title="@string/auto_brightness_title"
+ android:fragment="com.android.settings.display.AutoBrightnessSettings"
+ settings:controller="com.android.settings.display.AutoBrightnessPreferenceController"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/category_name_lock_display">
+
+ <Preference
+ android:key="lockscreen_from_display_settings"
+ android:title="@string/lockscreen_settings_title"
+ android:fragment="com.android.settings.security.LockscreenDashboardFragment"
+ settings:keywords="@string/keywords_ambient_display_screen"
+ settings:controller="com.android.settings.security.screenlock.LockScreenPreferenceController"/>
+
+ <com.android.settingslib.RestrictedPreference
+ android:key="screen_timeout"
+ android:title="@string/screen_timeout"
+ android:summary="@string/summary_placeholder"
+ android:fragment="com.android.settings.display.ScreenTimeoutSettings"
+ settings:controller="com.android.settings.display.ScreenTimeoutPreferenceController"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/category_name_visibility">
+
+ <com.android.settings.display.darkmode.DarkModePreference
+ android:key="dark_ui_mode"
+ android:title="@string/dark_ui_mode"
+ android:fragment="com.android.settings.display.darkmode.DarkModeSettingsFragment"
+ android:widgetLayout="@null"
+ settings:widgetLayout="@null"
+ settings:controller="com.android.settings.display.DarkUIPreferenceController"
+ settings:keywords="@string/keywords_dark_ui_mode"/>
+
+ <Preference
+ android:key="font_size"
+ android:title="@string/title_font_size"
+ android:fragment="com.android.settings.display.ToggleFontSizePreferenceFragment"
+ settings:controller="com.android.settings.display.FontSizePreferenceController"
+ settings:keywords="@string/keywords_font_size"/>
+
+ <com.android.settings.display.ScreenZoomPreference
+ android:key="display_settings_screen_zoom"
+ android:title="@string/screen_zoom_title"
+ android:fragment="com.android.settings.display.ScreenZoomSettings"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/category_name_color">
+
+ <com.android.settings.widget.PrimarySwitchPreference
+ android:key="night_display"
+ android:title="@string/night_display_title"
+ android:fragment="com.android.settings.display.NightDisplaySettings"
+ settings:controller="com.android.settings.display.NightDisplayPreferenceController"
+ settings:keywords="@string/keywords_display_night_display"/>
+
+ <Preference
+ android:key="color_mode"
+ android:title="@string/color_mode_title"
+ android:fragment="com.android.settings.display.ColorModePreferenceFragment"
+ settings:controller="com.android.settings.display.ColorModePreferenceController"
+ settings:keywords="@string/keywords_color_mode"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/category_name_general">
+
+ <SwitchPreference
+ android:key="auto_rotate"
+ android:title="@string/accelerometer_title"
+ settings:keywords="@string/keywords_auto_rotate"
+ settings:controller="com.android.settings.display.AutoRotatePreferenceController"/>
+
+ <SwitchPreference
+ android:key="display_white_balance"
+ android:title="@string/display_white_balance_title"
+ android:summary="@string/display_white_balance_summary"
+ settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController"/>
+
+ <SwitchPreference
+ android:key="peak_refresh_rate"
+ android:title="@string/peak_refresh_rate_title"
+ android:summary="@string/peak_refresh_rate_summary"
+ settings:controller="com.android.settings.display.PeakRefreshRatePreferenceController"/>
+
+ <SwitchPreference
+ android:key="show_operator_name"
+ android:title="@string/show_operator_name_title"
+ android:summary="@string/show_operator_name_summary"/>
+
+ <Preference
+ android:key="screensaver"
+ android:title="@string/screensaver_settings_title"
+ android:fragment="com.android.settings.dream.DreamSettings"/>
+
+ <SwitchPreference
+ android:key="camera_gesture"
+ android:title="@string/camera_gesture_title"
+ android:summary="@string/camera_gesture_desc"/>
+
+ <SwitchPreference
+ android:key="lift_to_wake"
+ android:title="@string/lift_to_wake_title"/>
+
+ <SwitchPreference
+ android:key="tap_to_wake"
+ android:title="@string/tap_to_wake"
+ android:summary="@string/tap_to_wake_summary"/>
+
+ <ListPreference
+ android:key="theme"
+ android:title="@string/device_theme"
+ android:summary="@string/summary_placeholder"/>
+
+ <Preference
+ android:key="vr_display_pref"
+ android:title="@string/display_vr_pref_title"
+ android:fragment="com.android.settings.display.VrDisplayPreferencePicker"/>
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml
index 20cf2be..52ade65 100644
--- a/res/xml/network_provider_internet.xml
+++ b/res/xml/network_provider_internet.xml
@@ -64,7 +64,7 @@
<com.android.settingslib.RestrictedSwitchPreference
android:key="airplane_safe_networks"
android:title="@string/airplane_safe_networks"
- android:icon="@drawable/ic_airplanemode_active"
+ android:icon="@drawable/ic_airplane_safe_networks_24dp"
android:summary="@string/airplane_safe_networks_summary"
android:order="-4"
settings:userRestriction="no_airplane_mode"
diff --git a/res/xml/notification_access_permission_details.xml b/res/xml/notification_access_permission_details.xml
index d956ce9..e0c7c1a 100644
--- a/res/xml/notification_access_permission_details.xml
+++ b/res/xml/notification_access_permission_details.xml
@@ -17,11 +17,18 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="notification_access_permission_detail_settings"
android:title="@string/manage_notification_access_title">
+ <com.android.settingslib.widget.LayoutPreference
+ android:key="pref_app_header"
+ android:layout="@layout/settings_entity_header"
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.HeaderPreferenceController"/>
+
<com.android.settings.widget.FilterTouchesSwitchPreference
android:key="notification_access_switch"
- android:title="@string/notification_access_detail_switch"/>
+ android:title="@string/notification_access_detail_switch"
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ApprovalPreferenceController"/>
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml
index 1b0e9fc..9497c8f 100644
--- a/res/xml/reset_dashboard_fragment.xml
+++ b/res/xml/reset_dashboard_fragment.xml
@@ -33,6 +33,12 @@
android:key="reset_app_prefs"
android:title="@string/reset_app_preferences" />
+ <!-- Erase Euicc data -->
+ <Preference
+ android:key="erase_euicc_data"
+ android:title="@string/reset_esim_title"
+ settings:controller="com.android.settings.network.EraseEuiccDataController" />
+
<!-- Factory reset -->
<com.android.settingslib.RestrictedPreference
android:key="factory_reset"
diff --git a/res/xml/top_level_settings_grouped.xml b/res/xml/top_level_settings_grouped.xml
index cdfab91..baee7b3 100644
--- a/res/xml/top_level_settings_grouped.xml
+++ b/res/xml/top_level_settings_grouped.xml
@@ -20,43 +20,38 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="top_level_settings_grouped">
- <PreferenceCategory
- android:key="connectivity"
- android:order="-130"
- settings:allowDividerAbove="false">
- <Preference
- android:fragment="com.android.settings.network.NetworkDashboardFragment"
- android:icon="@drawable/ic_homepage_network"
- android:key="top_level_network"
- android:order="-130"
- android:title="@string/network_dashboard_title"
- settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
+ <Preference
+ android:fragment="com.android.settings.network.NetworkDashboardFragment"
+ android:icon="@drawable/ic_homepage_network"
+ android:key="top_level_network"
+ android:order="-140"
+ android:title="@string/network_dashboard_title"
+ settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
- <Preference
- android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
- android:icon="@drawable/ic_homepage_connected_device"
- android:key="top_level_connected_devices"
- android:order="-120"
- android:title="@string/connected_devices_dashboard_title"
- settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
- </PreferenceCategory>
+ <Preference
+ android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
+ android:icon="@drawable/ic_homepage_connected_device"
+ android:key="top_level_connected_devices"
+ android:order="-130"
+ android:title="@string/connected_devices_dashboard_title"
+ settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
<PreferenceCategory
android:key="apps"
- android:order="-110"
+ android:order="-120"
settings:allowDividerAbove="false">
<Preference
android:fragment="com.android.settings.applications.AppAndNotificationDashboardFragment"
android:icon="@drawable/ic_homepage_apps"
android:key="top_level_apps_and_notifs"
- android:order="-110"
+ android:order="-120"
android:title="@string/apps_dashboard_title"/>
<Preference
android:fragment="com.android.settings.notification.ConfigureNotificationSettings"
android:icon="@drawable/ic_homepage_notification"
android:key="top_level_notification"
- android:order="-100"
+ android:order="-110"
android:title="@string/configure_notification_settings"/>
@@ -64,13 +59,13 @@
<PreferenceCategory
android:key="phone_essential"
- android:order="-90"
+ android:order="-100"
settings:allowDividerAbove="false">
<Preference
android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
android:icon="@drawable/ic_homepage_battery"
android:key="top_level_battery"
- android:order="-90"
+ android:order="-100"
android:title="@string/power_usage_summary_title"
settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
@@ -78,7 +73,7 @@
android:fragment="com.android.settings.deviceinfo.StorageSettings"
android:icon="@drawable/ic_homepage_storage"
android:key="top_level_storage"
- android:order="-80"
+ android:order="-90"
android:title="@string/storage_settings"
settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>
@@ -86,17 +81,24 @@
android:fragment="com.android.settings.notification.SoundSettings"
android:icon="@drawable/ic_homepage_sound"
android:key="top_level_sound"
- android:order="-70"
+ android:order="-80"
android:title="@string/sound_settings"/>
<Preference
android:fragment="com.android.settings.DisplaySettings"
android:icon="@drawable/ic_homepage_display"
android:key="top_level_display"
- android:order="-60"
+ android:order="-70"
android:title="@string/display_settings"
settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
+ <com.android.settingslib.RestrictedTopLevelPreference
+ android:icon="@drawable/ic_homepage_display"
+ android:key="top_level_wallpaper"
+ android:order="-60"
+ android:title="@string/wallpaper_settings_title"
+ settings:controller="com.android.settings.display.TopLevelWallpaperPreferenceController"/>
+
<Preference
android:fragment="com.android.settings.accessibility.AccessibilitySettings"
android:icon="@drawable/ic_homepage_accessibility"
diff --git a/res/xml/zen_mode_custom_rule_settings.xml b/res/xml/zen_mode_custom_rule_settings.xml
index 169a94f..8f360b9 100644
--- a/res/xml/zen_mode_custom_rule_settings.xml
+++ b/res/xml/zen_mode_custom_rule_settings.xml
@@ -22,11 +22,11 @@
<PreferenceCategory
android:key="zen_custom_rule_category">
- <com.android.settings.notification.zen.ZenCustomRadioButtonPreference
+ <com.android.settingslib.widget.RadioButtonPreference
android:key="zen_custom_rule_setting_default"
android:title="@string/zen_mode_custom_behavior_summary_default"/>
- <com.android.settings.notification.zen.ZenCustomRadioButtonPreference
+ <com.android.settingslib.widget.RadioButtonPreference
android:key="zen_custom_rule_setting"
android:title="@string/zen_mode_custom_behavior_summary" />
</PreferenceCategory>
diff --git a/res/xml/zen_mode_restrict_notifications_settings.xml b/res/xml/zen_mode_restrict_notifications_settings.xml
index f5e7615..051c208 100644
--- a/res/xml/zen_mode_restrict_notifications_settings.xml
+++ b/res/xml/zen_mode_restrict_notifications_settings.xml
@@ -23,19 +23,19 @@
<PreferenceCategory
android:key="restrict_category"
android:title="@string/zen_mode_restrict_notifications_category">
- <com.android.settings.notification.zen.ZenCustomRadioButtonPreference
+ <com.android.settingslib.widget.RadioButtonPreference
android:key="zen_mute_notifications"
android:title="@string/zen_mode_restrict_notifications_mute"
android:summary="@string/zen_mode_restrict_notifications_mute_summary"
settings:searchable="false"/>
- <com.android.settings.notification.zen.ZenCustomRadioButtonPreference
+ <com.android.settingslib.widget.RadioButtonPreference
android:key="zen_hide_notifications"
android:title="@string/zen_mode_restrict_notifications_hide"
android:summary="@string/zen_mode_restrict_notifications_hide_summary"
settings:searchable="false"/>
- <com.android.settings.notification.zen.ZenCustomRadioButtonPreference
+ <com.android.settingslib.widget.RadioButtonPreference
android:key="zen_custom"
android:title="@string/zen_mode_restrict_notifications_custom"
settings:searchable="false"/>
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index cbfbe7a..1cb9ade 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -19,13 +19,14 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
+import android.provider.SearchIndexableResource;
+import android.util.FeatureFlagUtils;
+import com.android.settings.core.FeatureFlags;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.display.BrightnessLevelPreferenceController;
import com.android.settings.display.CameraGesturePreferenceController;
import com.android.settings.display.LiftToWakePreferenceController;
-import com.android.settings.display.NightDisplayPreferenceController;
-import com.android.settings.display.NightModePreferenceController;
import com.android.settings.display.ScreenSaverPreferenceController;
import com.android.settings.display.ShowOperatorNamePreferenceController;
import com.android.settings.display.TapToWakePreferenceController;
@@ -37,6 +38,7 @@
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
@@ -55,6 +57,9 @@
@Override
protected int getPreferenceScreenResId() {
+ if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
+ return R.xml.display_settings_v2;
+ }
return R.xml.display_settings;
}
@@ -78,8 +83,6 @@
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new CameraGesturePreferenceController(context));
controllers.add(new LiftToWakePreferenceController(context));
- controllers.add(new NightDisplayPreferenceController(context));
- controllers.add(new NightModePreferenceController(context));
controllers.add(new ScreenSaverPreferenceController(context));
controllers.add(new TapToWakePreferenceController(context));
controllers.add(new VrDisplayPreferenceController(context));
@@ -90,7 +93,16 @@
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.display_settings) {
+ new BaseSearchIndexProvider() {
+
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(
+ Context context, boolean enabled) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = FeatureFlagUtils.isEnabled(context, FeatureFlags.SILKY_HOME)
+ ? R.xml.display_settings_v2 : R.xml.display_settings;
+ return Arrays.asList(sir);
+ }
@Override
public List<AbstractPreferenceController> createPreferenceControllers(
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 5ff59b5..c4fa90d 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -32,6 +32,7 @@
import android.telephony.SubscriptionManager;
import android.telephony.euicc.EuiccManager;
import android.text.TextUtils;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -53,7 +54,9 @@
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Optional;
/**
* Confirm and execute a reset of the device's network settings to a clean "just out of the box"
@@ -112,7 +115,7 @@
if (resultCode == Activity.RESULT_OK) {
showFinalConfirmation();
} else {
- establishInitialState();
+ establishInitialState(getActiveSubscriptionInfoList());
}
}
@@ -161,14 +164,15 @@
* inflate each view, caching all of the widget pointers we'll need at the
* time, then simply reuse the inflated views directly whenever we need
* to change contents.
+ *
+ * @param subscriptionsList is a list of SubscriptionInfo(s) which allow user to select from
*/
- private void establishInitialState() {
+ private void establishInitialState(List<SubscriptionInfo> subscriptionsList) {
mSubscriptionSpinner = (Spinner) mContentView.findViewById(R.id.reset_network_subscription);
mEsimContainer = mContentView.findViewById(R.id.erase_esim_container);
mEsimCheckbox = mContentView.findViewById(R.id.erase_esim);
- mSubscriptions = SubscriptionManager.from(getActivity())
- .getActiveSubscriptionInfoList();
+ mSubscriptions = subscriptionsList;
if (mSubscriptions != null && mSubscriptions.size() > 0) {
// Get the default subscription in the order of data, voice, sms, first up.
int defaultSubscription = SubscriptionManager.getDefaultDataSubscriptionId();
@@ -231,6 +235,31 @@
}
}
+ private List<SubscriptionInfo> getActiveSubscriptionInfoList() {
+ SubscriptionManager mgr = getActivity().getSystemService(SubscriptionManager.class);
+ if (mgr == null) {
+ Log.w(TAG, "No SubscriptionManager");
+ return Collections.emptyList();
+ }
+ return Optional.ofNullable(mgr.getActiveSubscriptionInfoList())
+ .orElse(Collections.emptyList());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // update options if subcription has been changed
+ List<SubscriptionInfo> updatedSubscriptions = getActiveSubscriptionInfoList();
+ if ((mSubscriptions != null)
+ && (mSubscriptions.size() == updatedSubscriptions.size())
+ && mSubscriptions.containsAll(updatedSubscriptions)) {
+ return;
+ }
+ Log.d(TAG, "subcription list changed");
+ establishInitialState(updatedSubscriptions);
+ }
+
private boolean showEuiccSettings(Context context) {
EuiccManager euiccManager =
(EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
@@ -261,7 +290,7 @@
mContentView = inflater.inflate(R.layout.reset_network, null);
- establishInitialState();
+ establishInitialState(getActiveSubscriptionInfoList());
return mContentView;
}
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index 97139c4..43f35a6 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -32,11 +32,14 @@
import android.net.wifi.p2p.WifiP2pManager;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.Looper;
import android.os.RecoverySystem;
import android.os.UserHandle;
import android.os.UserManager;
import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -63,6 +66,7 @@
* This is the confirmation screen.
*/
public class ResetNetworkConfirm extends InstrumentedFragment {
+ private static final String TAG = "ResetNetworkConfirm";
@VisibleForTesting View mContentView;
@VisibleForTesting boolean mEraseEsim;
@@ -71,12 +75,15 @@
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private ProgressDialog mProgressDialog;
private AlertDialog mAlertDialog;
+ private OnSubscriptionsChangedListener mSubscriptionsChangedListener;
/**
* Async task used to do all reset task. If error happens during
* erasing eSIM profiles or timeout, an error msg is shown.
*/
private class ResetNetworkTask extends AsyncTask<Void, Void, Boolean> {
+ private static final String TAG = "ResetNetworkTask";
+
private final Context mContext;
private final String mPackageName;
@@ -87,6 +94,7 @@
@Override
protected Boolean doInBackground(Void... params) {
+ boolean isResetSucceed = true;
ConnectivityManager connectivityManager = (ConnectivityManager)
mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
@@ -101,6 +109,10 @@
p2pFactoryReset(mContext);
+ if (mEraseEsim) {
+ isResetSucceed = RecoverySystem.wipeEuiccData(mContext, mPackageName);
+ }
+
TelephonyManager telephonyManager = (TelephonyManager)
mContext.getSystemService(TelephonyManager.class)
.createForSubscriptionId(mSubId);
@@ -125,11 +137,9 @@
}
restoreDefaultApn(mContext);
- if (mEraseEsim) {
- return RecoverySystem.wipeEuiccData(mContext, mPackageName);
- } else {
- return true;
- }
+ Log.d(TAG, "network factoryReset complete. succeeded: "
+ + String.valueOf(isResetSucceed));
+ return isResetSucceed;
}
@Override
@@ -161,6 +171,18 @@
return;
}
+ // abandon execution if subscription no longer active
+ if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ SubscriptionManager mgr = getSubscriptionManager();
+ // always remove listener
+ stopMonitorSubscriptionChange(mgr);
+ if (!isSubscriptionRemainActive(mgr, mSubId)) {
+ Log.w(TAG, "subId " + mSubId + " disappear when confirm");
+ mActivity.finish();
+ return;
+ }
+ }
+
mProgressDialog = getProgressDialog(mActivity);
mProgressDialog.show();
@@ -255,6 +277,56 @@
}
mActivity = getActivity();
+
+ if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return;
+ }
+ // close confirmation dialog when reset specific subscription
+ // but removed priori to the confirmation button been pressed
+ startMonitorSubscriptionChange(getSubscriptionManager());
+ }
+
+ private SubscriptionManager getSubscriptionManager() {
+ SubscriptionManager mgr = mActivity.getSystemService(SubscriptionManager.class);
+ if (mgr == null) {
+ Log.w(TAG, "No SubscriptionManager");
+ }
+ return mgr;
+ }
+
+ private void startMonitorSubscriptionChange(SubscriptionManager mgr) {
+ if (mgr == null) {
+ return;
+ }
+ // update monitor listener
+ mSubscriptionsChangedListener = new OnSubscriptionsChangedListener(
+ Looper.getMainLooper()) {
+ @Override
+ public void onSubscriptionsChanged() {
+ SubscriptionManager mgr = getSubscriptionManager();
+ if (isSubscriptionRemainActive(mgr, mSubId)) {
+ return;
+ }
+ // close UI if subscription no longer active
+ Log.w(TAG, "subId " + mSubId + " no longer active.");
+ stopMonitorSubscriptionChange(mgr);
+ mActivity.finish();
+ }
+ };
+ mgr.addOnSubscriptionsChangedListener(
+ mActivity.getMainExecutor(), mSubscriptionsChangedListener);
+ }
+
+ private boolean isSubscriptionRemainActive(SubscriptionManager mgr, int subscriptionId) {
+ return (mgr == null) ? false : (mgr.getActiveSubscriptionInfo(subscriptionId) != null);
+ }
+
+ private void stopMonitorSubscriptionChange(SubscriptionManager mgr) {
+ if ((mgr == null) || (mSubscriptionsChangedListener == null)) {
+ return;
+ }
+ mgr.removeOnSubscriptionsChangedListener(mSubscriptionsChangedListener);
+ mSubscriptionsChangedListener = null;
}
@Override
@@ -269,6 +341,7 @@
if (mAlertDialog != null) {
mAlertDialog.dismiss();
}
+ stopMonitorSubscriptionChange(getSubscriptionManager());
super.onDestroy();
}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index b226133..8389d84 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -144,6 +144,7 @@
public static class NotificationAccessSettingsActivity extends SettingsActivity { /* empty */ }
public static class NotificationAccessDetailsActivity extends SettingsActivity { /* empty */ }
public static class VrListenersSettingsActivity extends SettingsActivity { /* empty */ }
+ public static class PremiumSmsAccessActivity extends SettingsActivity { /* empty */ }
public static class PictureInPictureSettingsActivity extends SettingsActivity { /* empty */ }
public static class AppPictureInPictureSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenAccessSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index b6a9f59..eca3869 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -143,6 +143,11 @@
public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
/**
+ * Whether to show location indicators.
+ */
+ public static final String PROPERTY_LOCATION_INDICATORS_ENABLED = "location_indicators_enabled";
+
+ /**
* Finds a matching activity for a preference's intent. If a matching
* activity is not found, it will remove the preference.
*
@@ -1151,5 +1156,4 @@
public static boolean isProviderModelEnabled(Context context) {
return FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
}
-
}
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index e5bc3f5..4709c66 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -29,7 +29,6 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.graphics.drawable.Drawable;
-import android.hardware.display.ColorDisplayManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -43,7 +42,6 @@
import androidx.core.content.ContextCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
-import androidx.preference.SwitchPreference;
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.internal.content.PackageMonitor;
@@ -51,7 +49,6 @@
import com.android.settings.Utils;
import com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType;
import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.display.DarkUIPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -82,23 +79,14 @@
private static final String CATEGORY_EXPERIMENTAL = "experimental_category";
private static final String CATEGORY_DOWNLOADED_SERVICES = "user_installed_services_category";
- private static final String[] CATEGORIES = new String[] {
+ private static final String[] CATEGORIES = new String[]{
CATEGORY_SCREEN_READER, CATEGORY_AUDIO_AND_CAPTIONS, CATEGORY_DISPLAY,
CATEGORY_INTERACTION_CONTROL, CATEGORY_EXPERIMENTAL, CATEGORY_DOWNLOADED_SERVICES
};
// Preferences
- private static final String TOGGLE_INVERSION_PREFERENCE =
- "toggle_inversion_preference";
- private static final String TOGGLE_LARGE_POINTER_ICON =
- "toggle_large_pointer_icon";
- private static final String TOGGLE_DISABLE_ANIMATIONS = "toggle_disable_animations";
private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN =
"magnification_preference_screen";
- private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
- "daltonizer_preference";
- private static final String DISPLAY_REDUCE_BRIGHT_COLORS_PREFERENCE_SCREEN =
- "reduce_bright_colors_preference";
// Extras passed to sub-fragments.
static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -167,13 +155,7 @@
private final Map<ComponentName, PreferenceCategory> mPreBundledServiceComponentToCategoryMap =
new ArrayMap<>();
- private SwitchPreference mToggleLargePointerIconPreference;
- private SwitchPreference mToggleDisableAnimationsPreference;
private Preference mDisplayMagnificationPreferenceScreen;
- private Preference mDisplayDaltonizerPreferenceScreen;
- private Preference mToggleInversionPreference;
- private Preference mReduceBrightColorsPreference;
-
/**
* Check if the color transforms are color accelerated. Some transforms are experimental only
@@ -226,7 +208,6 @@
@Override
public void onAttach(Context context) {
super.onAttach(context);
- use(DarkUIPreferenceController.class).setParentFragment(this);
use(AccessibilityHearingAidPreferenceController.class)
.setFragmentManager(getFragmentManager());
}
@@ -259,8 +240,8 @@
/**
* Returns the summary for the current state of this accessibilityService.
*
- * @param context A valid context
- * @param info The accessibilityService's info
+ * @param context A valid context
+ * @param info The accessibilityService's info
* @param serviceEnabled Whether the accessibility service is enabled.
* @return The service summary
*/
@@ -299,8 +280,8 @@
/**
* Returns the description for the current state of this accessibilityService.
*
- * @param context A valid context
- * @param info The accessibilityService's info
+ * @param context A valid context
+ * @param info The accessibilityService's info
* @param serviceEnabled Whether the accessibility service is enabled.
* @return The service description
*/
@@ -325,24 +306,9 @@
mCategoryToPrefCategoryMap.put(CATEGORIES[i], prefCategory);
}
- // Display inversion.
- mToggleInversionPreference = findPreference(TOGGLE_INVERSION_PREFERENCE);
-
- // Large pointer icon.
- mToggleLargePointerIconPreference = findPreference(TOGGLE_LARGE_POINTER_ICON);
-
- mToggleDisableAnimationsPreference = findPreference(TOGGLE_DISABLE_ANIMATIONS);
-
// Display magnification.
mDisplayMagnificationPreferenceScreen = findPreference(
DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN);
-
- // Display color adjustments.
- mDisplayDaltonizerPreferenceScreen = findPreference(DISPLAY_DALTONIZER_PREFERENCE_SCREEN);
-
- // Reduce brightness.
- mReduceBrightColorsPreference =
- findPreference(DISPLAY_REDUCE_BRIGHT_COLORS_PREFERENCE_SCREEN);
}
private void updateAllPreferences() {
@@ -392,13 +358,13 @@
// Update the order of all the category according to the order defined in xml file.
updateCategoryOrderFromArray(CATEGORY_SCREEN_READER,
- R.array.config_order_screen_reader_services);
+ R.array.config_order_screen_reader_services);
updateCategoryOrderFromArray(CATEGORY_AUDIO_AND_CAPTIONS,
- R.array.config_order_audio_and_caption_services);
+ R.array.config_order_audio_and_caption_services);
updateCategoryOrderFromArray(CATEGORY_INTERACTION_CONTROL,
- R.array.config_order_interaction_control_services);
+ R.array.config_order_interaction_control_services);
updateCategoryOrderFromArray(CATEGORY_DISPLAY,
- R.array.config_order_display_services);
+ R.array.config_order_display_services);
// Need to check each time when updateServicePreferences() called.
if (downloadedServicesCategory.getPreferenceCount() == 0) {
@@ -468,7 +434,7 @@
* key with the string array of preference order which is defined in the xml.
*
* @param categoryKey The key of the category need to update the order
- * @param key The key of the string array which defines the order of category
+ * @param key The key of the string array which defines the order of category
*/
private void updateCategoryOrderFromArray(String categoryKey, int key) {
String[] services = getResources().getStringArray(key);
@@ -486,39 +452,11 @@
}
}
+ /**
+ * Updates preferences related to system configurations.
+ */
protected void updateSystemPreferences() {
- // Move color inversion and color correction preferences to Display category if device
- // supports HWC hardware-accelerated color transform.
- if (ColorDisplayManager.isColorTransformAccelerated(getContext())) {
- PreferenceCategory experimentalCategory =
- mCategoryToPrefCategoryMap.get(CATEGORY_EXPERIMENTAL);
- PreferenceCategory displayCategory =
- mCategoryToPrefCategoryMap.get(CATEGORY_DISPLAY);
- experimentalCategory.removePreference(mToggleInversionPreference);
- experimentalCategory.removePreference(mDisplayDaltonizerPreferenceScreen);
- experimentalCategory.removePreference(mReduceBrightColorsPreference);
- mDisplayMagnificationPreferenceScreen.setSummary(
- ToggleScreenMagnificationPreferenceFragment.getServiceSummary(getContext()));
- mDisplayDaltonizerPreferenceScreen.setOrder(
- mDisplayMagnificationPreferenceScreen.getOrder() + 1);
- mDisplayDaltonizerPreferenceScreen.setSummary(AccessibilityUtil.getSummary(
- getContext(), Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED));
- mToggleInversionPreference.setOrder(
- mDisplayDaltonizerPreferenceScreen.getOrder() + 1);
- mToggleLargePointerIconPreference.setOrder(
- mToggleInversionPreference.getOrder() + 1);
- mToggleDisableAnimationsPreference.setOrder(
- mToggleLargePointerIconPreference.getOrder() + 1);
- mToggleInversionPreference.setSummary(AccessibilityUtil.getSummary(
- getContext(), Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED));
- mReduceBrightColorsPreference.setOrder(
- mToggleDisableAnimationsPreference.getOrder() + 1);
- mReduceBrightColorsPreference.setSummary(AccessibilityUtil.getSummary(
- getContext(), Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED));
- displayCategory.addPreference(mToggleInversionPreference);
- displayCategory.addPreference(mDisplayDaltonizerPreferenceScreen);
- displayCategory.addPreference(mReduceBrightColorsPreference);
- }
+ // Do nothing.
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/accessibility/MagnificationCapabilities.java b/src/com/android/settings/accessibility/MagnificationCapabilities.java
new file mode 100644
index 0000000..079b06c
--- /dev/null
+++ b/src/com/android/settings/accessibility/MagnificationCapabilities.java
@@ -0,0 +1,103 @@
+/*
+ * 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.accessibility;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.IntDef;
+
+import com.android.settings.R;
+
+import com.google.common.primitives.Ints;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/** Class to provide magnification capabilities. */
+public final class MagnificationCapabilities {
+
+ private static final String KEY_CAPABILITY =
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY;
+
+ /**
+ * Annotation for supported magnification mode.
+ *
+ * @see Settings.Secure#ACCESSIBILITY_MAGNIFICATION_CAPABILITY
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ MagnificationMode.FULLSCREEN,
+ MagnificationMode.WINDOW,
+ MagnificationMode.ALL,
+ })
+
+ public @interface MagnificationMode {
+ int FULLSCREEN = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
+ int WINDOW = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
+ int ALL = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL;
+ }
+
+ /**
+ * Gets the summary for the given {@code capabilities}.
+ *
+ * @param context A {@link Context}.
+ * @param capabilities Magnification capabilities {@link MagnificationMode}
+ * @return The summary text represents the given capabilities
+ */
+ public static String getSummary(Context context, @MagnificationMode int capabilities) {
+ final String[] summaries = context.getResources().getStringArray(
+ R.array.magnification_mode_summaries);
+ final int[] values = context.getResources().getIntArray(
+ R.array.magnification_mode_values);
+
+ final int idx = Ints.indexOf(values, capabilities);
+ return summaries[idx == /* no index exist */ -1 ? 0 : idx];
+ }
+
+ /**
+ * Sets the magnification capabilities {@link MagnificationMode} to settings key. This
+ * overwrites any existing capabilities.
+ *
+ * @param context A {@link Context}.
+ * @param capabilities Magnification capabilities {@link MagnificationMode}
+ */
+ public static void setCapabilities(Context context, @MagnificationMode int capabilities) {
+ final ContentResolver contentResolver = context.getContentResolver();
+
+ Settings.Secure.putIntForUser(contentResolver, KEY_CAPABILITY, capabilities,
+ contentResolver.getUserId());
+ }
+
+ /**
+ * Returns the magnification capabilities {@link MagnificationMode} from setting's key. May be
+ * default value {@link MagnificationMode#FULLSCREEN} if not set.
+ *
+ * @param context A {@link Context}.
+ * @return The magnification capabilities {@link MagnificationMode}
+ */
+ @MagnificationMode
+ public static int getCapabilities(Context context) {
+ final ContentResolver contentResolver = context.getContentResolver();
+
+ return Settings.Secure.getIntForUser(contentResolver, KEY_CAPABILITY,
+ MagnificationMode.FULLSCREEN, contentResolver.getUserId());
+ }
+
+ private MagnificationCapabilities() {}
+}
diff --git a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
index b45ad88..5dc93b1 100644
--- a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
@@ -35,7 +35,7 @@
@Override
public CharSequence getSummary() {
- return MagnificationSettingsFragment.getMagnificationCapabilitiesSummary(
- mContext);
+ final int capabilities = MagnificationCapabilities.getCapabilities(mContext);
+ return MagnificationCapabilities.getSummary(mContext, capabilities);
}
}
diff --git a/src/com/android/settings/accessibility/MagnificationSettingsFragment.java b/src/com/android/settings/accessibility/MagnificationSettingsFragment.java
index 6b91fab..6ea6366 100644
--- a/src/com/android/settings/accessibility/MagnificationSettingsFragment.java
+++ b/src/com/android/settings/accessibility/MagnificationSettingsFragment.java
@@ -22,7 +22,6 @@
import android.app.Dialog;
import android.app.settings.SettingsEnums;
-import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.Settings;
@@ -38,8 +37,6 @@
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
-import com.google.common.primitives.Ints;
-
import java.util.StringJoiner;
/** Settings page for magnification. */
@@ -48,8 +45,6 @@
private static final String TAG = "MagnificationSettingsFragment";
private static final String PREF_KEY_MODE = "magnification_mode";
- private static final String KEY_CAPABILITY =
- Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY;
private static final int DIALOG_MAGNIFICATION_CAPABILITY = 1;
private static final int DIALOG_MAGNIFICATION_SWITCH_SHORTCUT = 2;
private static final String EXTRA_CAPABILITY = "capability";
@@ -61,29 +56,6 @@
private CheckBox mMagnifyWindowCheckBox;
private Dialog mDialog;
- static String getMagnificationCapabilitiesSummary(Context context) {
- final String[] magnificationModeSummaries = context.getResources().getStringArray(
- R.array.magnification_mode_summaries);
- final int[] magnificationModeValues = context.getResources().getIntArray(
- R.array.magnification_mode_values);
- final int capabilities = MagnificationSettingsFragment.getMagnificationCapabilities(
- context);
-
- final int idx = Ints.indexOf(magnificationModeValues, capabilities);
- return magnificationModeSummaries[idx == -1 ? 0 : idx];
- }
-
- private static int getMagnificationCapabilities(Context context) {
- return getSecureIntValue(context, KEY_CAPABILITY,
- Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
- }
-
- private static int getSecureIntValue(Context context, String key, int defaultValue) {
- return Settings.Secure.getIntForUser(
- context.getContentResolver(),
- key, defaultValue, context.getContentResolver().getUserId());
- }
-
@Override
public int getMetricsCategory() {
return SettingsEnums.ACCESSIBILITY_MAGNIFICATION_SETTINGS;
@@ -102,7 +74,7 @@
mCapabilities = savedInstanceState.getInt(EXTRA_CAPABILITY, NONE);
}
if (mCapabilities == NONE) {
- mCapabilities = getMagnificationCapabilities(getPrefContext());
+ mCapabilities = MagnificationCapabilities.getCapabilities(getPrefContext());
}
}
@@ -128,7 +100,7 @@
super.onCreate(icicle);
mModePreference = findPreference(PREF_KEY_MODE);
mModePreference.setOnPreferenceClickListener(preference -> {
- mCapabilities = getMagnificationCapabilities(getPrefContext());
+ mCapabilities = MagnificationCapabilities.getCapabilities(getPrefContext());
showDialog(DIALOG_MAGNIFICATION_CAPABILITY);
return true;
});
@@ -164,7 +136,7 @@
private void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) {
updateCapabilities(true);
mModePreference.setSummary(
- getMagnificationCapabilitiesSummary(getPrefContext()));
+ MagnificationCapabilities.getSummary(getPrefContext(), mCapabilities));
}
private void onSwitchShortcutDialogPositiveButtonClicked(View view) {
@@ -285,7 +257,7 @@
? Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW : 0;
mCapabilities = capabilities;
if (saveToDB) {
- setMagnificationCapabilities(capabilities);
+ MagnificationCapabilities.setCapabilities(getPrefContext(), mCapabilities);
}
}
@@ -294,15 +266,6 @@
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON;
}
- private void setSecureIntValue(String key, int value) {
- Settings.Secure.putIntForUser(getPrefContext().getContentResolver(),
- key, value, getPrefContext().getContentResolver().getUserId());
- }
-
- private void setMagnificationCapabilities(int capabilities) {
- setSecureIntValue(KEY_CAPABILITY, capabilities);
- }
-
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.accessibility_magnification_service_settings);
}
diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java
index 09243e5..ea7fb7c 100644
--- a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
import android.provider.Settings;
import androidx.preference.Preference;
@@ -34,7 +35,12 @@
@Override
public int getAvailabilityStatus() {
- // TODO(b/170970675): Call into ColorDisplayService (CDS) to get availability/config status
+ if (!ColorDisplayManager.isColorTransformAccelerated(mContext)) {
+ return UNSUPPORTED_ON_DEVICE;
+ } else if (Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0) != 1) {
+ return DISABLED_DEPENDENT_SETTING;
+ }
return AVAILABLE;
}
@@ -59,14 +65,14 @@
@Override
public int getSliderPosition() {
- // TODO(b/170970675): Call into CDS to get intensity
- return 0;
+ return Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0);
}
@Override
public boolean setSliderPosition(int position) {
- // TODO(b/170970675): Call into CDS to set intensity
- return true;
+ return Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, position);
}
@Override
diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java
index c5ce77c..82b3a64 100644
--- a/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java
+++ b/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
import android.provider.Settings;
import com.android.settings.core.BasePreferenceController;
@@ -37,7 +38,7 @@
@Override
public int getAvailabilityStatus() {
- // TODO(b/170970675): call into CDS to get availability/config status
- return AVAILABLE;
+ return ColorDisplayManager.isColorTransformAccelerated(mContext) ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
}
diff --git a/src/com/android/settings/accessibility/TextAndDisplayFragment.java b/src/com/android/settings/accessibility/TextAndDisplayFragment.java
new file mode 100644
index 0000000..b496e3d
--- /dev/null
+++ b/src/com/android/settings/accessibility/TextAndDisplayFragment.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
+import android.os.Bundle;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.display.DarkUIPreferenceController;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.SearchIndexable;
+
+/** Accessibility settings for text and display. */
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
+public class TextAndDisplayFragment extends DashboardFragment {
+
+ private static final String TAG = "TextAndDisplayFragment";
+
+ private static final String CATEGORY_EXPERIMENTAL = "experimental_category";
+
+ // Preferences
+ private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN = "daltonizer_preference";
+ private static final String TOGGLE_INVERSION_PREFERENCE = "toggle_inversion_preference";
+ private static final String DISPLAY_REDUCE_BRIGHT_COLORS_PREFERENCE_SCREEN =
+ "reduce_bright_colors_preference";
+ private static final String TOGGLE_DISABLE_ANIMATIONS = "toggle_disable_animations";
+ private static final String TOGGLE_LARGE_POINTER_ICON = "toggle_large_pointer_icon";
+
+ private Preference mDisplayDaltonizerPreferenceScreen;
+ private Preference mToggleInversionPreference;
+ private Preference mReduceBrightColorsPreference;
+ private SwitchPreference mToggleDisableAnimationsPreference;
+ private SwitchPreference mToggleLargePointerIconPreference;
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.ACCESSIBILITY_TEXT_AND_DISPLAY;
+ }
+
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ initializeAllPreferences();
+ updateSystemPreferences();
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ use(DarkUIPreferenceController.class).setParentFragment(this);
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_text_and_display;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ private void initializeAllPreferences() {
+ // Display color adjustments.
+ mDisplayDaltonizerPreferenceScreen = findPreference(DISPLAY_DALTONIZER_PREFERENCE_SCREEN);
+
+ // Display inversion.
+ mToggleInversionPreference = findPreference(TOGGLE_INVERSION_PREFERENCE);
+
+ // Reduce brightness.
+ mReduceBrightColorsPreference =
+ findPreference(DISPLAY_REDUCE_BRIGHT_COLORS_PREFERENCE_SCREEN);
+
+ // Disable animation.
+ mToggleDisableAnimationsPreference = findPreference(TOGGLE_DISABLE_ANIMATIONS);
+
+ // Large pointer icon.
+ mToggleLargePointerIconPreference = findPreference(TOGGLE_LARGE_POINTER_ICON);
+ }
+
+ /**
+ * Updates preferences related to system configurations.
+ */
+ private void updateSystemPreferences() {
+ final PreferenceCategory experimentalCategory = getPreferenceScreen().findPreference(
+ CATEGORY_EXPERIMENTAL);
+ if (ColorDisplayManager.isColorTransformAccelerated(getContext())) {
+ mDisplayDaltonizerPreferenceScreen.setSummary(AccessibilityUtil.getSummary(
+ getContext(), Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED));
+ mToggleInversionPreference.setSummary(AccessibilityUtil.getSummary(
+ getContext(), Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED));
+ mReduceBrightColorsPreference.setSummary(AccessibilityUtil.getSummary(
+ getContext(), Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED));
+ getPreferenceScreen().removePreference(experimentalCategory);
+ } else {
+ // Move following preferences to experimental category if device don't supports HWC
+ // hardware-accelerated color transform.
+ getPreferenceScreen().removePreference(mDisplayDaltonizerPreferenceScreen);
+ getPreferenceScreen().removePreference(mToggleInversionPreference);
+ getPreferenceScreen().removePreference(mReduceBrightColorsPreference);
+ getPreferenceScreen().removePreference(mToggleDisableAnimationsPreference);
+ getPreferenceScreen().removePreference(mToggleLargePointerIconPreference);
+ experimentalCategory.addPreference(mDisplayDaltonizerPreferenceScreen);
+ experimentalCategory.addPreference(mToggleInversionPreference);
+ experimentalCategory.addPreference(mReduceBrightColorsPreference);
+ experimentalCategory.addPreference(mToggleDisableAnimationsPreference);
+ experimentalCategory.addPreference(mToggleLargePointerIconPreference);
+ }
+ }
+
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.accessibility_text_and_display);
+}
diff --git a/src/com/android/settings/accessibility/ToggleAutoclickPreferenceController.java b/src/com/android/settings/accessibility/ToggleAutoclickPreferenceController.java
index b9af7ce..78f31df 100644
--- a/src/com/android/settings/accessibility/ToggleAutoclickPreferenceController.java
+++ b/src/com/android/settings/accessibility/ToggleAutoclickPreferenceController.java
@@ -25,6 +25,7 @@
import android.provider.Settings;
import android.util.ArrayMap;
+import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.LifecycleObserver;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -44,16 +45,23 @@
public class ToggleAutoclickPreferenceController extends BasePreferenceController implements
LifecycleObserver, RadioButtonPreference.OnClickListener, PreferenceControllerMixin {
- private static final String CONTROL_AUTOCLICK_DELAY_SECURE =
+ @VisibleForTesting
+ static final String CONTROL_AUTOCLICK_DELAY_SECURE =
Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY;
- private static final String KEY_AUTOCLICK_CUSTOM_SEEKBAR = "autoclick_custom_seekbar";
+
+ @VisibleForTesting
+ static final String KEY_AUTOCLICK_CUSTOM_SEEKBAR = "autoclick_custom_seekbar";
static final String KEY_DELAY_MODE = "delay_mode";
- private static final int AUTOCLICK_OFF_MODE = 0;
- private static final int AUTOCLICK_CUSTOM_MODE = 2000;
+ @VisibleForTesting
+ static final int AUTOCLICK_OFF_MODE = 0;
+
+ @VisibleForTesting
+ static final int AUTOCLICK_CUSTOM_MODE = 2000;
// Pair the preference key and autoclick mode value.
- private final Map<String, Integer> mAccessibilityAutoclickKeyToValueMap = new ArrayMap<>();
+ @VisibleForTesting
+ Map<String, Integer> mAccessibilityAutoclickKeyToValueMap = new ArrayMap<>();
private SharedPreferences mSharedPreferences;
private final ContentResolver mContentResolver;
@@ -70,13 +78,7 @@
private int mCurrentUiAutoClickMode;
public ToggleAutoclickPreferenceController(Context context, String preferenceKey) {
- super(context, preferenceKey);
-
- mSharedPreferences = context.getSharedPreferences(context.getPackageName(), MODE_PRIVATE);
- mContentResolver = context.getContentResolver();
- mResources = context.getResources();
-
- setAutoclickModeToKeyMap();
+ this(context, /* lifecycle= */ null, preferenceKey);
}
public ToggleAutoclickPreferenceController(Context context, Lifecycle lifecycle,
diff --git a/src/com/android/settings/accessibility/VideoPlayer.java b/src/com/android/settings/accessibility/VideoPlayer.java
index 8f94b76..d4aa6a6 100644
--- a/src/com/android/settings/accessibility/VideoPlayer.java
+++ b/src/com/android/settings/accessibility/VideoPlayer.java
@@ -25,6 +25,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.RawRes;
+import androidx.annotation.VisibleForTesting;
/**
* Plays the video by {@link MediaPlayer} on {@link TextureView}, calls {@link #create(Context, int,
@@ -32,19 +33,25 @@
* is no longer used, call {@link #release()} so that MediaPlayer object can be released.
*/
public class VideoPlayer implements SurfaceTextureListener {
- private final Context context;
- private final Object mediaPlayerLock = new Object();
+ private final Context mContext;
+ private final Object mMediaPlayerLock = new Object();
// Media player object can't be used after it has been released, so it will be set to null. But
// VideoPlayer is asynchronized, media player object might be paused or resumed again before
// released media player is set to null. Therefore, lock mediaPlayer and mediaPlayerState by
// mediaPlayerLock keep their states consistent.
+ @VisibleForTesting
@GuardedBy("mediaPlayerLock")
- private MediaPlayer mediaPlayer;
+ MediaPlayer mMediaPlayer;
+
+ @VisibleForTesting
@GuardedBy("mediaPlayerLock")
- private State mediaPlayerState = State.NONE;
+ State mMediaPlayerState = State.NONE;
+
@RawRes
- private final int videoRes;
- private Surface animationSurface;
+ private final int mVideoRes;
+
+ @VisibleForTesting
+ Surface mAnimationSurface;
/**
@@ -58,54 +65,54 @@
}
private VideoPlayer(Context context, @RawRes int videoRes, TextureView textureView) {
- this.context = context;
- this.videoRes = videoRes;
+ this.mContext = context;
+ this.mVideoRes = videoRes;
textureView.setSurfaceTextureListener(this);
}
public void pause() {
- synchronized (mediaPlayerLock) {
- if (mediaPlayerState == State.STARTED) {
- mediaPlayerState = State.PAUSED;
- mediaPlayer.pause();
+ synchronized (mMediaPlayerLock) {
+ if (mMediaPlayerState == State.STARTED) {
+ mMediaPlayerState = State.PAUSED;
+ mMediaPlayer.pause();
}
}
}
public void resume() {
- synchronized (mediaPlayerLock) {
- if (mediaPlayerState == State.PAUSED) {
- mediaPlayer.start();
- mediaPlayerState = State.STARTED;
+ synchronized (mMediaPlayerLock) {
+ if (mMediaPlayerState == State.PAUSED) {
+ mMediaPlayer.start();
+ mMediaPlayerState = State.STARTED;
}
}
}
/** Release media player when it's no longer needed. */
public void release() {
- synchronized (mediaPlayerLock) {
- if (mediaPlayerState != State.NONE && mediaPlayerState != State.END) {
- mediaPlayerState = State.END;
- mediaPlayer.release();
- mediaPlayer = null;
+ synchronized (mMediaPlayerLock) {
+ if (mMediaPlayerState != State.NONE && mMediaPlayerState != State.END) {
+ mMediaPlayerState = State.END;
+ mMediaPlayer.release();
+ mMediaPlayer = null;
}
}
- if (animationSurface != null) {
- animationSurface.release();
- animationSurface = null;
+ if (mAnimationSurface != null) {
+ mAnimationSurface.release();
+ mAnimationSurface = null;
}
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
- animationSurface = new Surface(surface);
- synchronized (mediaPlayerLock) {
- mediaPlayer = MediaPlayer.create(context, videoRes);
- mediaPlayerState = State.PREPARED;
- mediaPlayer.setSurface(animationSurface);
- mediaPlayer.setLooping(true);
- mediaPlayer.start();
- mediaPlayerState = State.STARTED;
+ mAnimationSurface = new Surface(surface);
+ synchronized (mMediaPlayerLock) {
+ mMediaPlayer = MediaPlayer.create(mContext, mVideoRes);
+ mMediaPlayerState = State.PREPARED;
+ mMediaPlayer.setSurface(mAnimationSurface);
+ mMediaPlayer.setLooping(true);
+ mMediaPlayer.start();
+ mMediaPlayerState = State.STARTED;
}
}
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java b/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java
new file mode 100644
index 0000000..a43b9fd
--- /dev/null
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java
@@ -0,0 +1,135 @@
+/*
+ * 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.applications.specialaccess.notificationaccess;
+
+import android.app.NotificationManager;
+import android.app.settings.SettingsEnums;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.AsyncTask;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+
+public class ApprovalPreferenceController extends BasePreferenceController {
+
+ private static final String TAG = "ApprovalPrefController";
+
+ private PackageInfo mPkgInfo;
+ private ComponentName mCn;
+ private PreferenceFragmentCompat mParent;
+ private NotificationManager mNm;
+ private PackageManager mPm;
+
+ public ApprovalPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ public ApprovalPreferenceController setPkgInfo(PackageInfo pkgInfo) {
+ mPkgInfo = pkgInfo;
+ return this;
+ }
+
+ public ApprovalPreferenceController setCn(ComponentName cn) {
+ mCn = cn;
+ return this;
+ }
+
+ public ApprovalPreferenceController setParent(PreferenceFragmentCompat parent) {
+ mParent = parent;
+ return this;
+ }
+
+ public ApprovalPreferenceController setNm(NotificationManager nm) {
+ mNm = nm;
+ return this;
+ }
+
+ public ApprovalPreferenceController setPm(PackageManager pm) {
+ mPm = pm;
+ return this;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void updateState(Preference pref) {
+ final SwitchPreference preference = (SwitchPreference) pref;
+ final CharSequence label = mPkgInfo.applicationInfo.loadLabel(mPm);
+ preference.setChecked(isServiceEnabled(mCn));
+ preference.setOnPreferenceChangeListener((p, newValue) -> {
+ final boolean access = (Boolean) newValue;
+ if (!access) {
+ if (!isServiceEnabled(mCn)) {
+ return true; // already disabled
+ }
+ // show a friendly dialog
+ new FriendlyWarningDialogFragment()
+ .setServiceInfo(mCn, label, mParent)
+ .show(mParent.getFragmentManager(), "friendlydialog");
+ return false;
+ } else {
+ if (isServiceEnabled(mCn)) {
+ return true; // already enabled
+ }
+ // show a scary dialog
+ new ScaryWarningDialogFragment()
+ .setServiceInfo(mCn, label, mParent)
+ .show(mParent.getFragmentManager(), "dialog");
+ return false;
+ }
+ });
+ }
+
+ public void disable(final ComponentName cn) {
+ logSpecialPermissionChange(true, cn.getPackageName());
+ mNm.setNotificationListenerAccessGranted(cn, false);
+ AsyncTask.execute(() -> {
+ if (!mNm.isNotificationPolicyAccessGrantedForPackage(
+ cn.getPackageName())) {
+ mNm.removeAutomaticZenRules(cn.getPackageName());
+ }
+ });
+ }
+
+ protected void enable(ComponentName cn) {
+ logSpecialPermissionChange(true, cn.getPackageName());
+ mNm.setNotificationListenerAccessGranted(cn, true);
+ }
+
+ protected boolean isServiceEnabled(ComponentName cn) {
+ return mNm.isNotificationListenerAccessGranted(cn);
+ }
+
+ @VisibleForTesting
+ void logSpecialPermissionChange(boolean enable, String packageName) {
+ final int logCategory = enable ? SettingsEnums.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW
+ : SettingsEnums.APP_SPECIAL_PERMISSION_NOTIVIEW_DENY;
+ FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(mContext,
+ logCategory, packageName);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java b/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java
new file mode 100644
index 0000000..94736e4
--- /dev/null
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java
@@ -0,0 +1,107 @@
+/*
+ * 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.applications.specialaccess.notificationaccess;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.util.IconDrawableFactory;
+import android.view.View;
+
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.LayoutPreference;
+
+public class HeaderPreferenceController extends BasePreferenceController
+ implements PreferenceControllerMixin, LifecycleObserver {
+
+ private DashboardFragment mFragment;
+ private EntityHeaderController mHeaderController;
+ private PackageInfo mPackageInfo;
+ private PackageManager mPm;
+ private CharSequence mServiceName;
+
+ public HeaderPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ public HeaderPreferenceController setFragment(DashboardFragment fragment) {
+ mFragment = fragment;
+ return this;
+ }
+
+ public HeaderPreferenceController setPackageInfo(PackageInfo packageInfo) {
+ mPackageInfo = packageInfo;
+ return this;
+ }
+
+ public HeaderPreferenceController setPm(PackageManager pm) {
+ mPm = pm;
+ return this;
+ }
+
+ public HeaderPreferenceController setServiceName(CharSequence serviceName) {
+ mServiceName = serviceName;
+ return this;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ if (mFragment == null) {
+ return;
+ }
+ LayoutPreference pref = screen.findPreference(getPreferenceKey());
+ mHeaderController = EntityHeaderController.newInstance(
+ mFragment.getActivity(), mFragment, pref.findViewById(R.id.entity_header));
+ pref = mHeaderController
+ .setRecyclerView(mFragment.getListView(), mFragment.getSettingsLifecycle())
+ .setIcon(IconDrawableFactory.newInstance(mFragment.getActivity())
+ .getBadgedIcon(mPackageInfo.applicationInfo))
+ .setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
+ .setSummary(mServiceName)
+ .setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
+ .setPackageName(mPackageInfo.packageName)
+ .setUid(mPackageInfo.applicationInfo.uid)
+ .setHasAppInfoLink(true)
+ .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE,
+ EntityHeaderController.ActionType.ACTION_NONE)
+ .done(mFragment.getActivity(), mContext);
+ pref.findViewById(R.id.entity_header).setVisibility(View.VISIBLE);
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_START)
+ public void onStart() {
+ if (mHeaderController != null) {
+ mHeaderController.styleActionBar(mFragment.getActivity());
+ }
+ }
+}
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java b/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
index 58a6d7f..c0416a3 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
@@ -16,52 +16,56 @@
package com.android.settings.applications.specialaccess.notificationaccess;
+import static com.android.settings.applications.AppInfoBase.ARG_PACKAGE_NAME;
+
import android.app.Activity;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.service.notification.NotificationListenerService;
-import android.util.IconDrawableFactory;
import android.util.Log;
import android.util.Slog;
-import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
-import androidx.preference.Preference;
-import androidx.preference.SwitchPreference;
+import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.applications.AppInfoBase;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.EntityHeaderController;
-import com.android.settingslib.applications.AppUtils;
+import com.android.settings.SettingsActivity;
+import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.applications.ApplicationsState;
+import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
-public class NotificationAccessDetails extends AppInfoBase {
+public class NotificationAccessDetails extends DashboardFragment {
private static final String TAG = "NotifAccessDetails";
- private static final String SWITCH_PREF_KEY = "notification_access_switch";
- private boolean mCreated;
private ComponentName mComponentName;
private CharSequence mServiceName;
+ protected PackageInfo mPackageInfo;
+ protected int mUserId;
+ protected String mPackageName;
+ protected RestrictedLockUtils.EnforcedAdmin mAppsControlDisallowedAdmin;
+ protected boolean mAppsControlDisallowedBySystem;
private boolean mIsNls;
-
- private NotificationManager mNm;
private PackageManager mPm;
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onAttach(Context context) {
+ super.onAttach(context);
final Intent intent = getIntent();
if (mComponentName == null && intent != null) {
String cn = intent.getStringExtra(Settings.EXTRA_NOTIFICATION_LISTENER_COMPONENT_NAME);
@@ -73,38 +77,20 @@
}
}
}
- super.onCreate(savedInstanceState);
- mNm = getContext().getSystemService(NotificationManager.class);
mPm = getPackageManager();
- addPreferencesFromResource(R.xml.notification_access_permission_details);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (mCreated) {
- Log.w(TAG, "onActivityCreated: ignoring duplicate call");
- return;
- }
- mCreated = true;
- if (mPackageInfo == null) return;
+ retrieveAppEntry();
loadNotificationListenerService();
- final Activity activity = getActivity();
- final Preference pref = EntityHeaderController
- .newInstance(activity, this, null /* header */)
- .setRecyclerView(getListView(), getSettingsLifecycle())
- .setIcon(IconDrawableFactory.newInstance(getContext())
- .getBadgedIcon(mPackageInfo.applicationInfo))
- .setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
- .setSummary(mServiceName)
- .setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
- .setPackageName(mPackageName)
- .setUid(mPackageInfo.applicationInfo.uid)
- .setHasAppInfoLink(true)
- .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE,
- EntityHeaderController.ActionType.ACTION_NONE)
- .done(activity, getPrefContext());
- getPreferenceScreen().addPreference(pref);
+ use(ApprovalPreferenceController.class)
+ .setPkgInfo(mPackageInfo)
+ .setCn(mComponentName)
+ .setNm(context.getSystemService(NotificationManager.class))
+ .setPm(context.getPackageManager())
+ .setParent(this);
+ use(HeaderPreferenceController.class)
+ .setFragment(this)
+ .setPackageInfo(mPackageInfo)
+ .setPm(context.getPackageManager())
+ .setServiceName(mServiceName);
}
@Override
@@ -112,9 +98,7 @@
return SettingsEnums.NOTIFICATION_ACCESS_DETAIL;
}
- @Override
protected boolean refreshUi() {
- final Context context = getContext();
if (mComponentName == null) {
// No service given
Slog.d(TAG, "No component name provided");
@@ -130,72 +114,74 @@
Slog.d(TAG, "NLSes aren't allowed in work profiles");
return false;
}
- updatePreference(findPreference(SWITCH_PREF_KEY));
return true;
}
@Override
- protected AlertDialog createDialog(int id, int errorCode) {
- return null;
+ public void onResume() {
+ super.onResume();
+ mAppsControlDisallowedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+ getActivity(), UserManager.DISALLOW_APPS_CONTROL, mUserId);
+ mAppsControlDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
+ getActivity(), UserManager.DISALLOW_APPS_CONTROL, mUserId);
+
+ if (!refreshUi()) {
+ setIntentAndFinish(true /* appChanged */);
+ }
}
- public void updatePreference(SwitchPreference preference) {
- final CharSequence label = mPackageInfo.applicationInfo.loadLabel(mPm);
- preference.setChecked(isServiceEnabled(mComponentName));
- preference.setOnPreferenceChangeListener((p, newValue) -> {
- final boolean access = (Boolean) newValue;
- if (!access) {
- if (!isServiceEnabled(mComponentName)) {
- return true; // already disabled
- }
- // show a friendly dialog
- new FriendlyWarningDialogFragment()
- .setServiceInfo(mComponentName, label, this)
- .show(getFragmentManager(), "friendlydialog");
- return false;
- } else {
- if (isServiceEnabled(mComponentName)) {
- return true; // already enabled
- }
- // show a scary dialog
- new ScaryWarningDialogFragment()
- .setServiceInfo(mComponentName, label, this)
- .show(getFragmentManager(), "dialog");
- return false;
+ protected void setIntentAndFinish(boolean appChanged) {
+ Log.i(TAG, "appChanged=" + appChanged);
+ Intent intent = new Intent();
+ intent.putExtra(ManageApplications.APP_CHG, appChanged);
+ SettingsActivity sa = (SettingsActivity) getActivity();
+ sa.finishPreferencePanel(Activity.RESULT_OK, intent);
+ }
+
+ protected void retrieveAppEntry() {
+ final Bundle args = getArguments();
+ mPackageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
+ Intent intent = (args == null) ?
+ getIntent() : (Intent) args.getParcelable("intent");
+ if (mPackageName == null) {
+ if (intent != null && intent.getData() != null) {
+ mPackageName = intent.getData().getSchemeSpecificPart();
}
- });
+ }
+ if (intent != null && intent.hasExtra(Intent.EXTRA_USER_HANDLE)) {
+ mUserId = ((UserHandle) intent.getParcelableExtra(
+ Intent.EXTRA_USER_HANDLE)).getIdentifier();
+ } else {
+ mUserId = UserHandle.myUserId();
+ }
+
+ try {
+ mPackageInfo = mPm.getPackageInfoAsUser(mPackageName,
+ PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.GET_SIGNING_CERTIFICATES |
+ PackageManager.GET_PERMISSIONS, mUserId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Exception when retrieving package:" + mPackageName, e);
+ }
}
- @VisibleForTesting
- void logSpecialPermissionChange(boolean enable, String packageName) {
- int logCategory = enable ? SettingsEnums.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW
- : SettingsEnums.APP_SPECIAL_PERMISSION_NOTIVIEW_DENY;
- FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(),
- logCategory, packageName);
- }
-
+ // Dialogs only have access to the parent fragment, not the controller, so pass the information
+ // along to keep business logic out of this file
public void disable(final ComponentName cn) {
- logSpecialPermissionChange(true, cn.getPackageName());
- mNm.setNotificationListenerAccessGranted(cn, false);
- AsyncTask.execute(() -> {
- if (!mNm.isNotificationPolicyAccessGrantedForPackage(
- cn.getPackageName())) {
- mNm.removeAutomaticZenRules(cn.getPackageName());
- }
- });
- refreshUi();
+ final PreferenceScreen screen = getPreferenceScreen();
+ ApprovalPreferenceController controller = use(ApprovalPreferenceController.class);
+ controller.disable(cn);
+ controller.updateState(screen.findPreference(controller.getPreferenceKey()));
}
protected void enable(ComponentName cn) {
- logSpecialPermissionChange(true, cn.getPackageName());
- mNm.setNotificationListenerAccessGranted(cn, true);
- refreshUi();
+ final PreferenceScreen screen = getPreferenceScreen();
+ ApprovalPreferenceController controller = use(ApprovalPreferenceController.class);
+ controller.enable(cn);
+ controller.updateState(screen.findPreference(controller.getPreferenceKey()));
}
- protected boolean isServiceEnabled(ComponentName cn) {
- return mNm.isNotificationListenerAccessGranted(cn);
- }
-
+ // To save binder calls, load this in the fragment rather than each preference controller
protected void loadNotificationListenerService() {
mIsNls = false;
@@ -218,4 +204,14 @@
}
}
}
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.notification_access_permission_details;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index 4822607..2985a9d 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -89,6 +89,9 @@
if (this instanceof InternalActivity) {
mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId());
+ if (BiometricUtils.containsGatekeeperPasswordHandle(getIntent())) {
+ mGkPwHandle = BiometricUtils.getGatekeeperPasswordHandle(getIntent());
+ }
}
if (savedInstanceState != null) {
@@ -366,7 +369,7 @@
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
}
BiometricUtils.launchEnrollForResult(this, intent, 0 /* requestCode */, hardwareAuthToken,
- null /* gkPwHandle */, mUserId);
+ mGkPwHandle, mUserId);
}
private void launchCredentialOnlyEnroll() {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index c2dc3ac..23a1133 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -48,9 +48,14 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
mFingerprintManager = Utils.getFingerprintManagerOrNull(this);
+ if (mFingerprintManager == null) {
+ Log.e(TAG, "Null FingerprintManager");
+ finish();
+ return;
+ }
+
+ super.onCreate(savedInstanceState);
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton(
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java b/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
index be383dc..e40e30d 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
@@ -99,9 +99,9 @@
if (mRequestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
showDialog(getString(R.string.bluetooth_connection_permission_request), mRequestType);
} else if (mRequestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
- showDialog(getString(R.string.bluetooth_phonebook_request), mRequestType);
+ showDialog(getString(R.string.bluetooth_phonebook_access_dialog_title), mRequestType);
} else if (mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {
- showDialog(getString(R.string.bluetooth_map_request), mRequestType);
+ showDialog(getString(R.string.bluetooth_message_access_dialog_title), mRequestType);
} else if (mRequestType == BluetoothDevice.REQUEST_TYPE_SIM_ACCESS) {
showDialog(getString(R.string.bluetooth_sap_request), mRequestType);
}
@@ -136,9 +136,9 @@
p.mView = createSapDialogView();
break;
}
- p.mPositiveButtonText = getString(R.string.yes);
+ p.mPositiveButtonText = getString(R.string.allow);
p.mPositiveButtonListener = this;
- p.mNegativeButtonText = getString(R.string.no);
+ p.mNegativeButtonText = getString(R.string.deny);
p.mNegativeButtonListener = this;
mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
setupAlert();
@@ -168,7 +168,7 @@
String mRemoteName = Utils.createRemoteName(this, mDevice);
mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null);
messageView = (TextView)mView.findViewById(R.id.message);
- messageView.setText(getString(R.string.bluetooth_pb_acceptance_dialog_text,
+ messageView.setText(getString(R.string.bluetooth_phonebook_access_dialog_content,
mRemoteName, mRemoteName));
return mView;
}
@@ -177,7 +177,7 @@
String mRemoteName = Utils.createRemoteName(this, mDevice);
mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null);
messageView = (TextView)mView.findViewById(R.id.message);
- messageView.setText(getString(R.string.bluetooth_map_acceptance_dialog_text,
+ messageView.setText(getString(R.string.bluetooth_message_access_dialog_content,
mRemoteName, mRemoteName));
return mView;
}
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index 684f90f..7fac4991c 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -140,13 +140,13 @@
switch (mRequestType) {
case BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS:
title = context.getString(R.string.bluetooth_phonebook_request);
- message = context.getString(R.string.bluetooth_pb_acceptance_dialog_text,
- deviceAlias, deviceAlias);
+ message = context.getString(
+ R.string.bluetooth_phonebook_access_notification_content);
break;
case BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS:
title = context.getString(R.string.bluetooth_map_request);
- message = context.getString(R.string.bluetooth_map_acceptance_dialog_text,
- deviceAlias, deviceAlias);
+ message = context.getString(
+ R.string.bluetooth_message_access_notification_content);
break;
case BluetoothDevice.REQUEST_TYPE_SIM_ACCESS:
title = context.getString(R.string.bluetooth_sap_request);
@@ -172,6 +172,7 @@
.setContentTitle(title)
.setTicker(message)
.setContentText(message)
+ .setStyle(new Notification.BigTextStyle().bigText(message))
.setSmallIcon(android.R.drawable.stat_sys_data_bluetooth)
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_MAX)
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 25be4fa..2c21771 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -53,6 +53,7 @@
import com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails;
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails;
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings;
+import com.android.settings.applications.specialaccess.premiumsms.PremiumSmsAccess;
import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings;
import com.android.settings.applications.specialaccess.zenaccess.ZenAccessDetails;
import com.android.settings.backup.PrivacySettings;
@@ -270,6 +271,7 @@
VrListenerSettings.class.getName(),
PictureInPictureSettings.class.getName(),
PictureInPictureDetails.class.getName(),
+ PremiumSmsAccess.class.getName(),
ManagedProfileSettings.class.getName(),
ChooseAccountFragment.class.getName(),
IccLockSettings.class.getName(),
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
index b755ba7..fe97759 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
@@ -21,6 +21,7 @@
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
/** Interface should be implemented if you have added new suggestions */
public interface SuggestionFeatureProvider {
@@ -42,4 +43,9 @@
* Returns the {@link SharedPreferences} that holds metadata for suggestions.
*/
SharedPreferences getSharedPrefs(Context context);
+
+ /**
+ * Returns the class of {@link Fragment} that supports contextual suggestion.
+ */
+ Class<? extends Fragment> getContextualSuggestionFragment();
}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
index 60a8c54..deb1c7e 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
@@ -22,6 +22,7 @@
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
import com.android.settings.Settings.NightDisplaySuggestionActivity;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollSuggestionActivity;
@@ -86,6 +87,11 @@
return context.getSharedPreferences(SHARED_PREF_FILENAME, Context.MODE_PRIVATE);
}
+ @Override
+ public Class<? extends Fragment> getContextualSuggestionFragment() {
+ return null;
+ }
+
public SuggestionFeatureProviderImpl(Context context) {
final Context appContext = context.getApplicationContext();
mMetricsFeatureProvider = FeatureFactory.getFactory(appContext)
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index 93df2f1..9cbb921 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -32,6 +32,7 @@
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
+import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -156,24 +157,24 @@
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- ProgressBar bar = (ProgressBar) holder.findViewById(R.id.determinateBar);
+ ProgressBar bar = getProgressBar(holder);
if (mChartEnabled && (!TextUtils.isEmpty(mStartLabel) || !TextUtils.isEmpty(mEndLabel))) {
bar.setVisibility(View.VISIBLE);
- holder.findViewById(R.id.label_bar).setVisibility(View.VISIBLE);
+ getLabelBar(holder).setVisibility(View.VISIBLE);
bar.setProgress((int) (mProgress * 100));
- ((TextView) holder.findViewById(android.R.id.text1)).setText(mStartLabel);
- ((TextView) holder.findViewById(android.R.id.text2)).setText(mEndLabel);
+ (getLabel1(holder)).setText(mStartLabel);
+ (getLabel2(holder)).setText(mEndLabel);
} else {
bar.setVisibility(View.GONE);
- holder.findViewById(R.id.label_bar).setVisibility(View.GONE);
+ getLabelBar(holder).setVisibility(View.GONE);
}
updateDataUsageLabels(holder);
- TextView usageTitle = (TextView) holder.findViewById(R.id.usage_title);
- TextView carrierInfo = (TextView) holder.findViewById(R.id.carrier_and_update);
- Button launchButton = (Button) holder.findViewById(R.id.launch_mdp_app_button);
- TextView limitInfo = (TextView) holder.findViewById(R.id.data_limits);
+ TextView usageTitle = getUsageTitle(holder);
+ TextView carrierInfo = getCarrierInfo(holder);
+ Button launchButton = getLaunchButton(holder);
+ TextView limitInfo = getDataLimits(holder);
if (mWifiMode && mSingleWifi) {
updateCycleTimeText(holder);
@@ -187,7 +188,7 @@
} else if (mWifiMode) {
usageTitle.setText(R.string.data_usage_wifi_title);
usageTitle.setVisibility(View.VISIBLE);
- TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
+ TextView cycleTime = getCycleTime(holder);
cycleTime.setText(mUsagePeriod);
carrierInfo.setVisibility(View.GONE);
limitInfo.setVisibility(View.GONE);
@@ -235,7 +236,7 @@
}
private void updateDataUsageLabels(PreferenceViewHolder holder) {
- TextView usageNumberField = (TextView) holder.findViewById(R.id.data_usage_view);
+ TextView usageNumberField = getDataUsed(holder);
final Formatter.BytesResult usedResult = Formatter.formatBytes(getContext().getResources(),
mDataplanUse, Formatter.FLAG_CALCULATE_ROUNDED | Formatter.FLAG_IEC_UNITS);
@@ -250,11 +251,10 @@
TextUtils.expandTemplate(template, usageNumberText, usedResult.units);
usageNumberField.setText(usageText);
- final MeasurableLinearLayout layout =
- (MeasurableLinearLayout) holder.findViewById(R.id.usage_layout);
+ final MeasurableLinearLayout layout = getLayout(holder);
if (mHasMobileData && mNumPlans >= 0 && mDataplanSize > 0L) {
- TextView usageRemainingField = (TextView) holder.findViewById(R.id.data_remaining_view);
+ TextView usageRemainingField = getDataRemaining(holder);
long dataRemaining = mDataplanSize - mDataplanUse;
if (dataRemaining >= 0) {
usageRemainingField.setText(
@@ -276,7 +276,7 @@
}
private void updateCycleTimeText(PreferenceViewHolder holder) {
- TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
+ TextView cycleTime = getCycleTime(holder);
// Takes zero as a special case which value is never set.
if (mCycleEndTimeMs == CYCLE_TIME_UNINITIAL_VALUE) {
@@ -362,9 +362,68 @@
}
@VisibleForTesting
- long getHistoricalUsageLevel() {
+ protected long getHistoricalUsageLevel() {
final DataUsageController controller = new DataUsageController(getContext());
return controller.getHistoricalUsageLevel(NetworkTemplate.buildTemplateWifiWildcard());
}
+ @VisibleForTesting
+ protected TextView getUsageTitle(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(R.id.usage_title);
+ }
+
+ @VisibleForTesting
+ protected TextView getCycleTime(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(R.id.cycle_left_time);
+ }
+
+ @VisibleForTesting
+ protected TextView getCarrierInfo(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(R.id.carrier_and_update);
+ }
+
+ @VisibleForTesting
+ protected TextView getDataLimits(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(R.id.data_limits);
+ }
+
+ @VisibleForTesting
+ protected TextView getDataUsed(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(R.id.data_usage_view);
+ }
+
+ @VisibleForTesting
+ protected TextView getDataRemaining(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(R.id.data_remaining_view);
+ }
+
+ @VisibleForTesting
+ protected Button getLaunchButton(PreferenceViewHolder holder) {
+ return (Button) holder.findViewById(R.id.launch_mdp_app_button);
+ }
+
+ @VisibleForTesting
+ protected LinearLayout getLabelBar(PreferenceViewHolder holder) {
+ return (LinearLayout) holder.findViewById(R.id.label_bar);
+ }
+
+ @VisibleForTesting
+ protected TextView getLabel1(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(android.R.id.text1);
+ }
+
+ @VisibleForTesting
+ protected TextView getLabel2(PreferenceViewHolder holder) {
+ return (TextView) holder.findViewById(android.R.id.text2);
+ }
+
+ @VisibleForTesting
+ protected ProgressBar getProgressBar(PreferenceViewHolder holder) {
+ return (ProgressBar) holder.findViewById(R.id.determinateBar);
+ }
+
+ @VisibleForTesting
+ protected MeasurableLinearLayout getLayout(PreferenceViewHolder holder) {
+ return (MeasurableLinearLayout) holder.findViewById(R.id.usage_layout);
+ }
}
diff --git a/src/com/android/settings/datausage/OWNERS b/src/com/android/settings/datausage/OWNERS
new file mode 100644
index 0000000..49449ec
--- /dev/null
+++ b/src/com/android/settings/datausage/OWNERS
@@ -0,0 +1,5 @@
+# Default reviewers for this and subdirectories.
+andychou@google.com
+goldmanj@google.com
+bonianchen@google.com
+wengsu@google.com
diff --git a/src/com/android/settings/development/WirelessDebuggingPreferenceController.java b/src/com/android/settings/development/WirelessDebuggingPreferenceController.java
index 592028c..2d4e889 100644
--- a/src/com/android/settings/development/WirelessDebuggingPreferenceController.java
+++ b/src/com/android/settings/development/WirelessDebuggingPreferenceController.java
@@ -20,7 +20,8 @@
import android.database.ContentObserver;
import android.debug.IAdbManager;
import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
+import android.net.Network;
+import android.net.NetworkCapabilities;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
@@ -141,10 +142,16 @@
public static boolean isWifiConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
- if (cm != null) {
- NetworkInfo info = cm.getActiveNetworkInfo();
- if (info != null && info.isConnected()) {
- return info.getType() == ConnectivityManager.TYPE_WIFI;
+ if (cm == null) {
+ return false;
+ }
+ for (Network network : cm.getAllNetworks()) {
+ final NetworkCapabilities nc = cm.getNetworkCapabilities(network);
+ if (nc == null) {
+ continue;
+ }
+ if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+ return true;
}
}
return false;
diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java
index e64c8c0..203a688 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTiles.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java
@@ -48,6 +48,8 @@
import androidx.annotation.VisibleForTesting;
import com.android.internal.app.LocalePicker;
+import com.android.internal.inputmethod.Completable;
+import com.android.internal.inputmethod.ResultCallbacks;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.view.IInputMethodManager;
import com.android.settings.R;
@@ -260,9 +262,12 @@
return false;
}
- private boolean isImeTraceEnabled() {
+ @VisibleForTesting
+ boolean isImeTraceEnabled() {
try {
- return mInputMethodManager.isImeTraceEnabled();
+ final Completable.Boolean value = Completable.createBoolean();
+ mInputMethodManager.isImeTraceEnabled(ResultCallbacks.of(value));
+ return Completable.getResult(value);
} catch (RemoteException e) {
Log.e(TAG, "Could not get ime trace status, defaulting to false.", e);
}
diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
index 6ada11b..e6d9dfd 100644
--- a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
@@ -25,6 +25,7 @@
import android.provider.Settings;
import android.text.SpannedString;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -44,6 +45,8 @@
OnSaveInstanceState,
OnCreate {
private static final String KEY_PENDING_DEVICE_NAME = "key_pending_device_name";
+ @VisibleForTesting
+ static final int RES_SHOW_DEVICE_NAME_BOOL = R.bool.config_show_device_name;
private String mDeviceName;
protected WifiManager mWifiManager;
private final BluetoothAdapter mBluetoothAdapter;
diff --git a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java
index 955c60c..e5fd3da 100644
--- a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.os.SystemProperties;
+import android.text.TextUtils;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
@@ -31,8 +32,8 @@
@Override
public int getAvailabilityStatus() {
- return mContext.getResources().getBoolean(R.bool.config_show_device_model)
- ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return mContext.getResources().getBoolean(R.bool.config_show_device_model) &&
+ !TextUtils.isEmpty(getSummary()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/deviceinfo/legal/ModuleLicenseProvider.java b/src/com/android/settings/deviceinfo/legal/ModuleLicenseProvider.java
index 6731c69..5f72945 100644
--- a/src/com/android/settings/deviceinfo/legal/ModuleLicenseProvider.java
+++ b/src/com/android/settings/deviceinfo/legal/ModuleLicenseProvider.java
@@ -62,7 +62,7 @@
@Override
public String getType(Uri uri) {
- checkUri(getContext(), uri);
+ checkUri(getModuleContext(), uri);
return LICENSE_FILE_MIME_TYPE;
}
@@ -83,7 +83,7 @@
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) {
- final Context context = getContext();
+ final Context context = getModuleContext();
checkUri(context, uri);
Preconditions.checkArgument("r".equals(mode), "Read is the only supported mode");
@@ -191,4 +191,10 @@
private static SharedPreferences getPrefs(Context context) {
return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
+
+ // Method to allow context injection for testing purposes.
+ @VisibleForTesting
+ protected Context getModuleContext() {
+ return getContext();
+ }
}
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index 10409fc..414039b 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -16,6 +16,8 @@
package com.android.settings.deviceinfo.simstatus;
+import static androidx.lifecycle.Lifecycle.Event;
+
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -54,21 +56,23 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
import com.android.settings.R;
import com.android.settingslib.DeviceInfoUtils;
import com.android.settingslib.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.utils.ThreadUtils;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
-public class SimStatusDialogController implements LifecycleObserver, OnResume, OnPause {
+/**
+ * Controller for Sim Status information within the About Phone Settings page.
+ */
+public class SimStatusDialogController implements LifecycleObserver {
private final static String TAG = "SimStatusDialogCtrl";
@@ -263,7 +267,10 @@
}
}
- @Override
+ /**
+ * OnResume lifecycle event, resume listening for phone state or subscription changes.
+ */
+ @OnLifecycleEvent(Event.ON_RESUME)
public void onResume() {
if (mSubscriptionInfo == null) {
return;
@@ -288,7 +295,10 @@
mIsRegisteredListener = true;
}
- @Override
+ /**
+ * onPause lifecycle event, no longer listen for phone state or subscription changes.
+ */
+ @OnLifecycleEvent(Event.ON_PAUSE)
public void onPause() {
if (mSubscriptionInfo == null) {
if (mIsRegisteredListener) {
@@ -318,7 +328,8 @@
mDialog.setText(NETWORK_PROVIDER_VALUE_ID, carrierName);
}
- private void updatePhoneNumber() {
+ @VisibleForTesting
+ protected void updatePhoneNumber() {
// If formattedNumber is null or empty, it'll display as "Unknown".
mDialog.setText(PHONE_NUMBER_VALUE_ID,
DeviceInfoUtils.getBidiFormattedPhoneNumber(mContext, mSubscriptionInfo));
@@ -592,7 +603,7 @@
}
@VisibleForTesting
- void requestForUpdateEid() {
+ protected void requestForUpdateEid() {
ThreadUtils.postOnBackgroundThread(() -> {
final AtomicReference<String> eid = getEid(mSlotIndex);
ThreadUtils.postOnMainThread(() -> updateEid(eid));
@@ -600,7 +611,7 @@
}
@VisibleForTesting
- AtomicReference<String> getEid(int slotIndex) {
+ protected AtomicReference<String> getEid(int slotIndex) {
boolean shouldHaveEid = false;
String eid = null;
if (mTelephonyManager.getActiveModemCount() > MAX_PHONE_COUNT_SINGLE_SIM) {
@@ -638,7 +649,7 @@
}
@VisibleForTesting
- void updateEid(AtomicReference<String> eid) {
+ protected void updateEid(AtomicReference<String> eid) {
if (eid == null) {
mDialog.removeSettingFromScreen(EID_INFO_LABEL_ID);
mDialog.removeSettingFromScreen(EID_INFO_VALUE_ID);
@@ -753,7 +764,7 @@
}
@VisibleForTesting
- PhoneStateListener getPhoneStateListener() {
+ protected PhoneStateListener getPhoneStateListener() {
return new PhoneStateListener() {
@Override
public void onDataConnectionStateChanged(int state) {
diff --git a/src/com/android/settings/display/NightDisplayPreference.java b/src/com/android/settings/display/NightDisplayPreference.java
deleted file mode 100644
index 7020c49..0000000
--- a/src/com/android/settings/display/NightDisplayPreference.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 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.display;
-
-import android.content.Context;
-import android.hardware.display.ColorDisplayManager;
-import android.hardware.display.NightDisplayListener;
-import android.util.AttributeSet;
-
-import androidx.preference.SwitchPreference;
-
-import java.time.LocalTime;
-
-public class NightDisplayPreference extends SwitchPreference
- implements NightDisplayListener.Callback {
-
- private ColorDisplayManager mColorDisplayManager;
- private NightDisplayListener mNightDisplayListener;
- private NightDisplayTimeFormatter mTimeFormatter;
-
- public NightDisplayPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- mColorDisplayManager = context.getSystemService(ColorDisplayManager.class);
- mNightDisplayListener = new NightDisplayListener(context);
- mTimeFormatter = new NightDisplayTimeFormatter(context);
- }
-
- @Override
- public void onAttached() {
- super.onAttached();
-
- // Listen for changes only while attached.
- mNightDisplayListener.setCallback(this);
-
- // Update the summary since the state may have changed while not attached.
- updateSummary();
- }
-
- @Override
- public void onDetached() {
- super.onDetached();
-
- // Stop listening for state changes.
- mNightDisplayListener.setCallback(null);
- }
-
- @Override
- public void onActivated(boolean activated) {
- updateSummary();
- }
-
- @Override
- public void onAutoModeChanged(int autoMode) {
- updateSummary();
- }
-
- @Override
- public void onCustomStartTimeChanged(LocalTime startTime) {
- updateSummary();
- }
-
- @Override
- public void onCustomEndTimeChanged(LocalTime endTime) {
- updateSummary();
- }
-
- private void updateSummary() {
- setSummary(mTimeFormatter.getAutoModeTimeSummary(getContext(), mColorDisplayManager));
- }
-}
diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java
index 6891d65..003373c 100644
--- a/src/com/android/settings/display/NightDisplayPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayPreferenceController.java
@@ -15,18 +15,33 @@
import android.content.Context;
import android.hardware.display.ColorDisplayManager;
+import android.hardware.display.NightDisplayListener;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.widget.PrimarySwitchPreference;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
-public class NightDisplayPreferenceController extends AbstractPreferenceController implements
- PreferenceControllerMixin {
+/** A controller can control the behavior of night display setting. */
+public class NightDisplayPreferenceController extends TogglePreferenceController
+ implements NightDisplayListener.Callback, LifecycleObserver, OnStart, OnStop {
- private static final String KEY_NIGHT_DISPLAY = "night_display";
+ private final ColorDisplayManager mColorDisplayManager;
+ private final NightDisplayListener mNightDisplayListener;
+ private final NightDisplayTimeFormatter mTimeFormatter;
+ private PrimarySwitchPreference mPreference;
- public NightDisplayPreferenceController(Context context) {
- super(context);
+ public NightDisplayPreferenceController(Context context, String key) {
+ super(context, key);
+
+ mColorDisplayManager = context.getSystemService(ColorDisplayManager.class);
+ mNightDisplayListener = new NightDisplayListener(context);
+ mTimeFormatter = new NightDisplayTimeFormatter(context);
}
public static boolean isSuggestionComplete(Context context) {
@@ -41,12 +56,47 @@
}
@Override
- public boolean isAvailable() {
- return ColorDisplayManager.isNightDisplayAvailable(mContext);
+ public void onStart() {
+ // Listen for changes only while attached.
+ mNightDisplayListener.setCallback(this);
}
@Override
- public String getPreferenceKey() {
- return KEY_NIGHT_DISPLAY;
+ public void onStop() {
+ // Stop listening for state changes.
+ mNightDisplayListener.setCallback(null);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return ColorDisplayManager.isNightDisplayAvailable(mContext)
+ ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return mColorDisplayManager.isNightDisplayActivated();
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ return mColorDisplayManager.setNightDisplayActivated(isChecked);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ preference.setSummary(mTimeFormatter.getAutoModeSummary(mContext, mColorDisplayManager));
+ }
+
+ @Override
+ public void onActivated(boolean activated) {
+ updateState(mPreference);
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/display/NightDisplayTimeFormatter.java b/src/com/android/settings/display/NightDisplayTimeFormatter.java
index 1449ac1..aa715de 100644
--- a/src/com/android/settings/display/NightDisplayTimeFormatter.java
+++ b/src/com/android/settings/display/NightDisplayTimeFormatter.java
@@ -17,8 +17,8 @@
package com.android.settings.display;
import android.content.Context;
-
import android.hardware.display.ColorDisplayManager;
+
import com.android.settings.R;
import java.text.DateFormat;
@@ -45,13 +45,6 @@
return mTimeFormatter.format(c.getTime());
}
- public String getAutoModeTimeSummary(Context context, ColorDisplayManager manager) {
- final int summaryFormatResId =
- manager.isNightDisplayActivated() ? R.string.night_display_summary_on
- : R.string.night_display_summary_off;
- return context.getString(summaryFormatResId, getAutoModeSummary(context, manager));
- }
-
public String getAutoModeSummary(Context context, ColorDisplayManager manager) {
final boolean isActivated = manager.isNightDisplayActivated();
final int autoMode = manager.getNightDisplayAutoMode();
diff --git a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
index 2e39e8e..c44376c 100644
--- a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
+++ b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
@@ -26,10 +26,13 @@
import android.os.UserManager;
import android.provider.Settings;
+import androidx.preference.Preference;
+
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.RestrictedPreference;
/**
* The controller of {@link ScreenTimeoutSettings}.
@@ -43,39 +46,58 @@
@Override
public int getAvailabilityStatus() {
- return isDisableByAdmin() ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
+ return AVAILABLE;
}
@Override
- public CharSequence getSummary() {
- if (isDisableByAdmin()) {
- return mContext.getString(com.android.settings.R.string.disabled_by_policy_title);
- } else {
- final long currentTimeout = getCurrentScreenTimeout();
- final CharSequence[] timeoutEntries = mContext.getResources().getStringArray(
- R.array.screen_timeout_entries);
- final CharSequence[] timeoutValues = mContext.getResources().getStringArray(
- R.array.screen_timeout_values);
- final CharSequence description = TimeoutPreferenceController.getTimeoutDescription(
- currentTimeout, timeoutEntries, timeoutValues);
- return mContext.getString(R.string.screen_timeout_summary, description);
+ public void updateState(Preference preference) {
+ final RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdmin();
+ if (admin != null) {
+ preference.setEnabled(false);
+ ((RestrictedPreference) preference).setDisabledByAdmin(admin);
}
+ preference.setSummary(getTimeoutSummary());
}
- private boolean isDisableByAdmin() {
+ private CharSequence getTimeoutSummary() {
+ final long currentTimeout = getCurrentScreenTimeout();
+ final CharSequence[] timeoutEntries = mContext.getResources().getStringArray(
+ R.array.screen_timeout_entries);
+ final CharSequence[] timeoutValues = mContext.getResources().getStringArray(
+ R.array.screen_timeout_values);
+ final CharSequence description = getTimeoutDescription(
+ currentTimeout, timeoutEntries, timeoutValues);
+ return mContext.getString(R.string.screen_timeout_summary, description);
+ }
+
+ private RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin() {
final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
if (dpm != null) {
- final RestrictedLockUtils.EnforcedAdmin admin =
- RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
- mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT,
- UserHandle.myUserId());
- return admin != null;
+ return RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+ mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT,
+ UserHandle.myUserId());
}
- return false;
+ return null;
}
private long getCurrentScreenTimeout() {
return Settings.System.getLong(mContext.getContentResolver(),
SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
}
+
+ private static CharSequence getTimeoutDescription(
+ long currentTimeout, CharSequence[] entries, CharSequence[] values) {
+ if (currentTimeout < 0 || entries == null || values == null
+ || values.length != entries.length) {
+ return null;
+ }
+
+ for (int i = 0; i < values.length; i++) {
+ long timeout = Long.parseLong(values[i].toString());
+ if (currentTimeout == timeout) {
+ return entries[i];
+ }
+ }
+ return null;
+ }
}
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index 290e4ff..a90c886 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -28,6 +28,7 @@
import android.provider.Settings;
import android.util.Log;
+import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
@@ -36,13 +37,13 @@
import com.android.settings.support.actionbar.HelpMenuController;
import com.android.settings.support.actionbar.HelpResourceProvider;
import com.android.settings.widget.RadioButtonPickerFragment;
-import com.android.settings.widget.RadioButtonPreferenceWithExtraWidget;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.FooterPreference;
+import com.android.settingslib.widget.RadioButtonPreference;
import com.google.common.annotations.VisibleForTesting;
@@ -59,9 +60,17 @@
/** If there is no setting in the provider, use this. */
public static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
+ private static final int DEFAULT_ORDER_OF_LOWEST_PREFERENCE = Integer.MAX_VALUE - 1;
+
private CharSequence[] mInitialEntries;
private CharSequence[] mInitialValues;
private FooterPreference mPrivacyPreference;
+
+ @VisibleForTesting
+ RestrictedLockUtils.EnforcedAdmin mAdmin;
+ @VisibleForTesting
+ Preference mDisableOptionsPreference;
+
@VisibleForTesting
AdaptiveSleepPermissionPreferenceController mAdaptiveSleepPermissionController;
@@ -88,6 +97,15 @@
mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy);
mPrivacyPreference.setSelectable(false);
mPrivacyPreference.setLayoutResource(R.layout.preference_footer);
+
+ mDisableOptionsPreference = new FooterPreference(context);
+ mDisableOptionsPreference.setLayoutResource(R.layout.preference_footer);
+ mDisableOptionsPreference.setTitle(R.string.admin_disabled_other_options);
+ mDisableOptionsPreference.setIcon(R.drawable.ic_info_outline_24dp);
+
+ // The 'disabled by admin' preference should always be at the end of the setting page.
+ mDisableOptionsPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE);
+ mPrivacyPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE - 1);
}
@Override
@@ -120,14 +138,22 @@
final PreferenceScreen screen = getPreferenceScreen();
screen.removeAll();
+ if (mAdmin != null) {
+ mDisableOptionsPreference.setOnPreferenceClickListener(p -> {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin);
+ return true;
+ });
+ screen.addPreference(mDisableOptionsPreference);
+ }
+
final List<? extends CandidateInfo> candidateList = getCandidates();
if (candidateList == null) {
return;
}
for (CandidateInfo info : candidateList) {
- RadioButtonPreferenceWithExtraWidget pref =
- new RadioButtonPreferenceWithExtraWidget(getPrefContext());
+ RadioButtonPreference pref =
+ new RadioButtonPreference(getPrefContext());
bindPreference(pref, info.getKey(), info, defaultKey);
screen.addPreference(pref);
}
@@ -137,6 +163,14 @@
mAdaptiveSleepController.addToScreen(screen);
screen.addPreference(mPrivacyPreference);
}
+
+ if (mAdmin != null) {
+ mDisableOptionsPreference.setOnPreferenceClickListener(p -> {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin);
+ return true;
+ });
+ screen.addPreference(mDisableOptionsPreference);
+ }
}
@Override
@@ -178,9 +212,8 @@
if (dpm == null) {
return Long.MAX_VALUE;
}
- final RestrictedLockUtils.EnforcedAdmin admin =
- RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context);
- if (admin != null) {
+ mAdmin = RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context);
+ if (mAdmin != null) {
return dpm.getMaximumTimeToLock(null /* admin */, UserHandle.myUserId());
}
return Long.MAX_VALUE;
diff --git a/src/com/android/settings/display/TimeoutPreferenceController.java b/src/com/android/settings/display/TimeoutPreferenceController.java
deleted file mode 100644
index 60b7e24..0000000
--- a/src/com/android/settings/display/TimeoutPreferenceController.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2016 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.display;
-
-import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.util.Log;
-
-import androidx.preference.Preference;
-
-import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.RestrictedLockUtils;
-import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.core.AbstractPreferenceController;
-
-public class TimeoutPreferenceController extends AbstractPreferenceController implements
- PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
-
- private static final String TAG = "TimeoutPrefContr";
-
- /** If there is no setting in the provider, use this. */
- public static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
-
- private final String mScreenTimeoutKey;
-
- public TimeoutPreferenceController(Context context, String key) {
- super(context);
- mScreenTimeoutKey = key;
- }
-
- @Override
- public boolean isAvailable() {
- return true;
- }
-
- @Override
- public String getPreferenceKey() {
- return mScreenTimeoutKey;
- }
-
- @Override
- public void updateState(Preference preference) {
- final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preference;
- final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
- SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
- timeoutListPreference.setValue(String.valueOf(currentTimeout));
- final DevicePolicyManager dpm =
- (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (dpm != null) {
- final RestrictedLockUtils.EnforcedAdmin admin =
- RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(mContext);
- final long maxTimeout =
- dpm.getMaximumTimeToLock(null /* admin */, UserHandle.myUserId());
- timeoutListPreference.removeUnusableTimeouts(maxTimeout, admin);
- }
- updateTimeoutPreferenceDescription(timeoutListPreference,
- Long.parseLong(timeoutListPreference.getValue()));
-
- final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
- mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT,
- UserHandle.myUserId());
- if (admin != null) {
- timeoutListPreference.removeUnusableTimeouts(0/* disable all*/, admin);
- }
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- try {
- int value = Integer.parseInt((String) newValue);
- Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
- updateTimeoutPreferenceDescription((TimeoutListPreference) preference, value);
- } catch (NumberFormatException e) {
- Log.e(TAG, "could not persist screen timeout setting", e);
- }
- return true;
- }
-
- public static CharSequence getTimeoutDescription(
- long currentTimeout, CharSequence[] entries, CharSequence[] values) {
- if (currentTimeout < 0 || entries == null || values == null
- || values.length != entries.length) {
- return null;
- }
-
- for (int i = 0; i < values.length; i++) {
- long timeout = Long.parseLong(values[i].toString());
- if (currentTimeout == timeout) {
- return entries[i];
- }
- }
- return null;
- }
-
- private void updateTimeoutPreferenceDescription(TimeoutListPreference preference,
- long currentTimeout) {
- final CharSequence[] entries = preference.getEntries();
- final CharSequence[] values = preference.getEntryValues();
- final String summary;
- if (preference.isDisabledByAdmin()) {
- summary = mContext.getString(com.android.settings.R.string.disabled_by_policy_title);
- } else {
- final CharSequence timeoutDescription = getTimeoutDescription(
- currentTimeout, entries, values);
- summary = timeoutDescription == null
- ? ""
- : mContext.getString(R.string.screen_timeout_summary, timeoutDescription);
- }
- preference.setSummary(summary);
- }
-
-}
diff --git a/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java b/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java
new file mode 100644
index 0000000..beef4f3
--- /dev/null
+++ b/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java
@@ -0,0 +1,136 @@
+/*
+ * 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.display;
+
+import static android.os.UserManager.DISALLOW_SET_WALLPAPER;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.RestrictedTopLevelPreference;
+
+import java.util.List;
+
+/** This controller manages the wallpaper preference of the top level page. */
+public class TopLevelWallpaperPreferenceController extends BasePreferenceController {
+ private static final String TAG = "TopLevelWallpaperPreferenceController";
+ private static final String LAUNCHED_SETTINGS = "app_launched_settings";
+
+ private final String mWallpaperPackage;
+ private final String mWallpaperClass;
+ private final String mStylesAndWallpaperClass;
+ private final String mWallpaperLaunchExtra;
+
+ public TopLevelWallpaperPreferenceController(Context context, String key) {
+ super(context, key);
+ mWallpaperPackage = mContext.getString(R.string.config_wallpaper_picker_package);
+ mWallpaperClass = mContext.getString(R.string.config_wallpaper_picker_class);
+ mStylesAndWallpaperClass =
+ mContext.getString(R.string.config_styles_and_wallpaper_picker_class);
+ mWallpaperLaunchExtra = mContext.getString(R.string.config_wallpaper_picker_launch_extra);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ Preference preference = screen.findPreference(getPreferenceKey());
+ preference.setTitle(getTitle());
+ }
+
+ public String getTitle() {
+ return mContext.getString(areStylesAvailable()
+ ? R.string.style_and_wallpaper_settings_title : R.string.wallpaper_settings_title);
+ }
+
+ public ComponentName getComponentName() {
+ return new ComponentName(mWallpaperPackage, getComponentClassString());
+ }
+
+ public String getComponentClassString() {
+ return areStylesAvailable() ? mStylesAndWallpaperClass : mWallpaperClass;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ if ((TextUtils.isEmpty(mWallpaperClass) && TextUtils.isEmpty(mStylesAndWallpaperClass))
+ || TextUtils.isEmpty(mWallpaperPackage)) {
+ Log.e(TAG, "No Wallpaper picker specified!");
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ return canResolveWallpaperComponent(getComponentClassString())
+ ? AVAILABLE_UNSEARCHABLE : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ disablePreferenceIfManaged((RestrictedTopLevelPreference) preference);
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (getPreferenceKey().equals(preference.getKey())) {
+ final Intent intent = new Intent().setComponent(
+ getComponentName()).putExtra(mWallpaperLaunchExtra, LAUNCHED_SETTINGS);
+ if (areStylesAvailable()) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ preference.getContext().startActivity(intent);
+ return true;
+ }
+ return super.handlePreferenceTreeClick(preference);
+ }
+
+ /** Returns whether Styles & Wallpaper is enabled and available. */
+ public boolean areStylesAvailable() {
+ return !TextUtils.isEmpty(mStylesAndWallpaperClass)
+ && canResolveWallpaperComponent(mStylesAndWallpaperClass);
+ }
+
+ private boolean canResolveWallpaperComponent(String className) {
+ final ComponentName componentName = new ComponentName(mWallpaperPackage, className);
+ final PackageManager pm = mContext.getPackageManager();
+ final Intent intent = new Intent().setComponent(componentName);
+ final List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0 /* flags */);
+ return resolveInfos != null && !resolveInfos.isEmpty();
+ }
+
+ private void disablePreferenceIfManaged(RestrictedTopLevelPreference pref) {
+ final String restriction = DISALLOW_SET_WALLPAPER;
+ if (pref != null) {
+ pref.setDisabledByAdmin(null);
+ if (RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext,
+ restriction, UserHandle.myUserId())) {
+ // Do not show the admin dialog for system restriction.
+ pref.setEnabled(false);
+ } else {
+ pref.checkRestrictionAndSetDisabled(restriction);
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/display/darkmode/DarkModePreference.java b/src/com/android/settings/display/darkmode/DarkModePreference.java
index baaa1f7..c69bb01 100644
--- a/src/com/android/settings/display/darkmode/DarkModePreference.java
+++ b/src/com/android/settings/display/darkmode/DarkModePreference.java
@@ -74,10 +74,10 @@
return;
}
final int mode = mUiModeManager.getNightMode();
- String detail;
+ String summary;
if (mode == UiModeManager.MODE_NIGHT_AUTO) {
- detail = getContext().getString(active
+ summary = getContext().getString(active
? R.string.dark_ui_summary_on_auto_mode_auto
: R.string.dark_ui_summary_off_auto_mode_auto);
} else if (mode == UiModeManager.MODE_NIGHT_CUSTOM) {
@@ -85,17 +85,14 @@
? mUiModeManager.getCustomNightModeEnd()
: mUiModeManager.getCustomNightModeStart();
final String timeStr = mFormat.of(time);
- detail = getContext().getString(active
+ summary = getContext().getString(active
? R.string.dark_ui_summary_on_auto_mode_custom
: R.string.dark_ui_summary_off_auto_mode_custom, timeStr);
} else {
- detail = getContext().getString(active
+ summary = getContext().getString(active
? R.string.dark_ui_summary_on_auto_mode_never
: R.string.dark_ui_summary_off_auto_mode_never);
}
- String summary = getContext().getString(active
- ? R.string.dark_ui_summary_on
- : R.string.dark_ui_summary_off, detail);
setSummary(summary);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 9066444..11d7564 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -52,7 +52,8 @@
* Controller that update the battery header view
*/
public class BatteryHeaderPreferenceController extends BasePreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnStart {
+ implements PreferenceControllerMixin, LifecycleObserver, OnStart,
+ BatteryPreferenceController {
@VisibleForTesting
static final String KEY_BATTERY_HEADER = "battery_header";
private static final String ANNOTATION_URL = "url";
@@ -121,16 +122,20 @@
.styleActionBar(mActivity);
}
+ private CharSequence generateLabel(BatteryInfo info) {
+ if (BatteryUtils.isBatteryDefenderOn(info)) {
+ return null;
+ } else if (info.remainingLabel == null) {
+ return info.statusLabel;
+ } else {
+ return info.remainingLabel;
+ }
+ }
+
public void updateHeaderPreference(BatteryInfo info) {
mBatteryPercentText.setText(formatBatteryPercentageText(info.batteryLevel));
if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info)) {
- if (BatteryUtils.isBatteryDefenderOn(info)) {
- mSummary1.setText(null);
- } else if (info.remainingLabel == null) {
- mSummary1.setText(info.statusLabel);
- } else {
- mSummary1.setText(info.remainingLabel);
- }
+ mSummary1.setText(generateLabel(info));
}
mBatteryMeterView.setBatteryLevel(info.batteryLevel);
@@ -141,8 +146,8 @@
/**
* Callback which receives text for the summary line.
*/
- public void updateBatteryStatus(String statusLabel) {
- mSummary1.setText(statusLabel);
+ public void updateBatteryStatus(String label, BatteryInfo info) {
+ mSummary1.setText(label != null ? label : generateLabel(info));
}
public void quickUpdateHeaderPreference() {
diff --git a/src/com/android/settings/fuelgauge/BatteryPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryPreferenceController.java
new file mode 100644
index 0000000..badf5c8
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryPreferenceController.java
@@ -0,0 +1,30 @@
+/*
+ * 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.fuelgauge;
+
+/**
+ * Common interface for a preference controller that updates battery status
+ */
+public interface BatteryPreferenceController {
+
+ /**
+ * Updates the label for the preference controller. If the label is null, the
+ * implementation should revert back to the original label based on the
+ * battery info.
+ */
+ void updateBatteryStatus(String label, BatteryInfo info);
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java
index c3fc247..46f00c7 100644
--- a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java
@@ -25,5 +25,5 @@
* Trigger a battery status update; return false if built-in status should be used.
*/
boolean triggerBatteryStatusUpdate(
- BatteryHeaderPreferenceController batteryHeaderPreferenceController, BatteryInfo info);
+ BatteryPreferenceController controller, BatteryInfo info);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java
index 47d376d..dc4b5db 100644
--- a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java
@@ -31,7 +31,7 @@
@Override
public boolean triggerBatteryStatusUpdate(
- BatteryHeaderPreferenceController batteryHeaderPreferenceController, BatteryInfo info) {
+ BatteryPreferenceController controller, BatteryInfo info) {
return false;
}
}
diff --git a/src/com/android/settings/fuelgauge/FakeUid.java b/src/com/android/settings/fuelgauge/FakeUid.java
index c592f51..309f259 100644
--- a/src/com/android/settings/fuelgauge/FakeUid.java
+++ b/src/com/android/settings/fuelgauge/FakeUid.java
@@ -356,6 +356,11 @@
}
@Override
+ public long getScreenOnEnergy() {
+ return 0;
+ }
+
+ @Override
public long getMobileRadioApWakeupCount(int which) {
return 0;
}
diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index c2e6a6f..1912c2f 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -26,18 +26,21 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.FeatureFlags;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
public class TopLevelBatteryPreferenceController extends BasePreferenceController implements
- LifecycleObserver, OnStart, OnStop {
+ LifecycleObserver, OnStart, OnStop, BatteryPreferenceController {
@VisibleForTesting
- boolean mIsBatteryPresent = true;
+ protected boolean mIsBatteryPresent = true;
private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
private Preference mPreference;
private BatteryInfo mBatteryInfo;
+ private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
+ private String mBatteryStatusLabel;
public TopLevelBatteryPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -51,6 +54,9 @@
updateState(mPreference);
}, true /* shortString */);
});
+
+ mBatteryStatusFeatureProvider = FeatureFactory.getFactory(context)
+ .getBatteryStatusFeatureProvider(context);
}
@Override
@@ -77,6 +83,10 @@
@Override
public CharSequence getSummary() {
+ return getSummary(true /* batteryStatusUpdate */);
+ }
+
+ private CharSequence getSummary(boolean batteryStatusUpdate) {
// Remove homepage summaries for silky home.
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
return null;
@@ -85,23 +95,48 @@
if (!mIsBatteryPresent) {
return mContext.getText(R.string.battery_missing_message);
}
- return getDashboardLabel(mContext, mBatteryInfo);
+ return getDashboardLabel(mContext, mBatteryInfo, batteryStatusUpdate);
}
- static CharSequence getDashboardLabel(Context context, BatteryInfo info) {
+ protected CharSequence getDashboardLabel(Context context, BatteryInfo info,
+ boolean batteryStatusUpdate) {
if (info == null || context == null) {
return null;
}
- CharSequence label;
+
+ if (batteryStatusUpdate) {
+ if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info)) {
+ mBatteryStatusLabel = null; // will generateLabel()
+ }
+ }
+
+ return (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel;
+ }
+
+ private CharSequence generateLabel(BatteryInfo info) {
if (!info.discharging && info.chargeLabel != null) {
- label = info.chargeLabel;
+ return info.chargeLabel;
} else if (info.remainingLabel == null) {
- label = info.batteryPercentString;
+ return info.batteryPercentString;
} else {
- label = context.getString(R.string.power_remaining_settings_home_page,
+ return mContext.getString(R.string.power_remaining_settings_home_page,
info.batteryPercentString,
info.remainingLabel);
}
- return label;
+ }
+
+ /**
+ * Callback which receives text for the label.
+ */
+ public void updateBatteryStatus(String label, BatteryInfo info) {
+ mBatteryStatusLabel = label; // Null if adaptive charging is not active
+
+ if (mPreference != null) {
+ // Do not triggerBatteryStatusUpdate(), otherwise there will be an infinite loop
+ final CharSequence summary = getSummary(false /* batteryStatusUpdate */);
+ if (summary != null) {
+ mPreference.setSummary(summary);
+ }
+ }
}
}
diff --git a/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceController.java b/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceController.java
index 3dba3f0..28e4154 100644
--- a/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceController.java
+++ b/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceController.java
@@ -21,6 +21,8 @@
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
+import android.telephony.PhoneNumberUtils;
+import android.text.Spannable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -69,8 +71,17 @@
@Override
public CharSequence getSummary() {
- return mContext.getString(R.string.emergency_gesture_call_for_help_summary,
- mEmergencyNumberUtils.getPoliceNumber());
+ String number = mEmergencyNumberUtils.getPoliceNumber();
+ String summary = mContext.getString(R.string.emergency_gesture_call_for_help_summary,
+ number);
+ int numberStartIndex = summary.indexOf(number);
+ if (numberStartIndex < 0) {
+ return summary;
+ }
+ Spannable summarySpan = Spannable.Factory.getInstance().newSpannable(summary);
+ PhoneNumberUtils.addTtsSpan(summarySpan, numberStartIndex,
+ numberStartIndex + number.length());
+ return summarySpan;
}
@Override
diff --git a/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java
index 5eba539..04a32de 100644
--- a/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java
+++ b/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java
@@ -76,7 +76,7 @@
@Override
public boolean isChecked() {
return Settings.Secure.getInt(mContext.getContentResolver(),
- SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, OFF) == ON;
+ SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, ON) == ON;
}
@Override
diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
index bed14a8..ddcdd59 100644
--- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
+++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
@@ -21,9 +21,6 @@
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_GONE;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_SETTING;
-
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
@@ -49,7 +46,6 @@
import com.android.settings.support.actionbar.HelpResourceProvider;
import com.android.settings.utils.CandidateInfoExtra;
import com.android.settings.widget.RadioButtonPickerFragment;
-import com.android.settings.widget.RadioButtonPreferenceWithExtraWidget;
import com.android.settings.widget.VideoPreference;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.CandidateInfo;
@@ -119,8 +115,8 @@
return;
}
for (CandidateInfo info : candidateList) {
- RadioButtonPreferenceWithExtraWidget pref =
- new RadioButtonPreferenceWithExtraWidget(getPrefContext());
+ RadioButtonPreference pref =
+ new RadioButtonPreference(getPrefContext());
bindPreference(pref, info.getKey(), info, defaultKey);
bindPreferenceExtra(pref, info.getKey(), info, defaultKey, systemDefaultKey);
screen.addPreference(pref);
@@ -131,20 +127,15 @@
@Override
public void bindPreferenceExtra(RadioButtonPreference pref,
String key, CandidateInfo info, String defaultKey, String systemDefaultKey) {
- if (!(info instanceof CandidateInfoExtra)
- || !(pref instanceof RadioButtonPreferenceWithExtraWidget)) {
+ if (!(info instanceof CandidateInfoExtra)) {
return;
}
pref.setSummary(((CandidateInfoExtra) info).loadSummary());
- RadioButtonPreferenceWithExtraWidget p = (RadioButtonPreferenceWithExtraWidget) pref;
if (info.getKey() == KEY_SYSTEM_NAV_GESTURAL) {
- p.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_SETTING);
- p.setExtraWidgetOnClickListener((v) -> startActivity(new Intent(
+ pref.setExtraWidgetOnClickListener((v) -> startActivity(new Intent(
GestureNavigationSettingsFragment.GESTURE_NAVIGATION_SETTINGS)));
- } else {
- p.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_GONE);
}
}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 237318f..5eb9d94 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -21,6 +21,7 @@
import android.app.settings.SettingsEnums;
import android.os.Bundle;
import android.util.FeatureFlagUtils;
+import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -41,6 +42,9 @@
public class SettingsHomepageActivity extends FragmentActivity {
+ private static final String TAG = "SettingsHomepageActivity";
+ private int mSearchBoxHeight;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -50,7 +54,9 @@
root.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
- setHomepageContainerPaddingTop();
+ final View appBar = findViewById(R.id.app_bar_container);
+ appBar.setMinimumHeight(getSearchBoxHeight());
+ setDefaultHomepageContainerPaddingTop();
final Toolbar toolbar = findViewById(R.id.search_action_bar);
FeatureFactory.getFactory(this).getSearchFeatureProvider()
@@ -60,16 +66,36 @@
getLifecycle().addObserver(new AvatarViewMixin(this, avatarView));
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
- if (FeatureFlagUtils.isEnabled(this, FeatureFlags.CONTEXTUAL_HOME)
- && !getSystemService(ActivityManager.class).isLowRamDevice()) {
- // Only allow contextual feature on high ram devices.
- showFragment(new ContextualCardsFragment(), R.id.contextual_cards_content);
+ if (!getSystemService(ActivityManager.class).isLowRamDevice()) {
+ // Only allow contextual features on high ram devices.
+ if (FeatureFlagUtils.isEnabled(this, FeatureFlags.SILKY_HOME)) {
+ showSuggestionFragment();
+ }
+ if (FeatureFlagUtils.isEnabled(this, FeatureFlags.CONTEXTUAL_HOME)) {
+ showFragment(new ContextualCardsFragment(), R.id.contextual_cards_content);
+ }
}
showFragment(new TopLevelSettings(), R.id.main_content);
((FrameLayout) findViewById(R.id.main_content))
.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
}
+ private void showSuggestionFragment() {
+ final Class<? extends Fragment> fragment = FeatureFactory.getFactory(this)
+ .getSuggestionFeatureProvider(this).getContextualSuggestionFragment();
+ if (fragment == null) {
+ return;
+ }
+
+ try {
+ showFragment(fragment.newInstance(), R.id.contextual_suggestion_content);
+ setHomepageContainerTopOffset(getResources()
+ .getDimensionPixelSize(R.dimen.suggestion_height));
+ } catch (IllegalAccessException | InstantiationException e) {
+ Log.w(TAG, "Cannot show fragment", e);
+ }
+ }
+
private void showFragment(Fragment fragment, int id) {
final FragmentManager fragmentManager = getSupportFragmentManager();
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@@ -84,18 +110,32 @@
}
@VisibleForTesting
- void setHomepageContainerPaddingTop() {
- final View view = this.findViewById(R.id.homepage_container);
-
- final int searchBarHeight = getResources().getDimensionPixelSize(R.dimen.search_bar_height);
- final int searchBarMargin = getResources().getDimensionPixelSize(R.dimen.search_bar_margin);
-
- // The top padding is the height of action bar(48dp) + top/bottom margins(16dp)
- final int paddingTop = searchBarHeight + searchBarMargin * 2;
+ void setHomepageContainerTopOffset(int offset) {
+ final View view = findViewById(R.id.homepage_container);
+ final int paddingTop = getSearchBoxHeight() + offset;
view.setPadding(0 /* left */, paddingTop, 0 /* right */, 0 /* bottom */);
// Prevent inner RecyclerView gets focus and invokes scrolling.
view.setFocusableInTouchMode(true);
view.requestFocus();
}
+
+ @VisibleForTesting
+ void setDefaultHomepageContainerPaddingTop() {
+ setHomepageContainerTopOffset(0);
+ }
+
+ @VisibleForTesting
+ int getSearchBoxHeight() {
+ if (mSearchBoxHeight != 0) {
+ return mSearchBoxHeight;
+ }
+
+ final int searchBarHeight = getResources().getDimensionPixelSize(R.dimen.search_bar_height);
+ final int searchBarMargin = getResources().getDimensionPixelSize(R.dimen.search_bar_margin);
+
+ // The height of search box is the height of search bar(48dp) + top/bottom margins(24dp)
+ mSearchBoxHeight = searchBarHeight + searchBarMargin * 2;
+ return mSearchBoxHeight;
+ }
}
diff --git a/src/com/android/settings/location/LocationIndicatorsPreferenceController.java b/src/com/android/settings/location/LocationIndicatorsPreferenceController.java
new file mode 100644
index 0000000..f7b7408
--- /dev/null
+++ b/src/com/android/settings/location/LocationIndicatorsPreferenceController.java
@@ -0,0 +1,52 @@
+/*
+ * 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.location;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.DeviceConfig;
+
+import com.android.settings.Utils;
+import com.android.settings.core.TogglePreferenceController;
+
+/** Controller for location indicators toggle. */
+public class LocationIndicatorsPreferenceController extends TogglePreferenceController {
+
+ public LocationIndicatorsPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public boolean isChecked() {
+ return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ Utils.PROPERTY_LOCATION_INDICATORS_ENABLED, false);
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
+ Utils.PROPERTY_LOCATION_INDICATORS_ENABLED, Boolean.toString(isChecked), true);
+ return true;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ // Location indicators feature is only available on devices that support location.
+ return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION)
+ ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+}
diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
index b8c3d8f..14e8267 100644
--- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java
+++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
@@ -18,8 +18,6 @@
import static android.media.AudioManager.STREAM_DEVICES_CHANGED_ACTION;
-import static com.android.settings.media.MediaOutputSlice.MEDIA_PACKAGE_NAME;
-
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -55,6 +53,8 @@
private static final String TAG = "MediaDeviceUpdateWorker";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ public static final String MEDIA_PACKAGE_NAME = "media_package_name";
+
protected final Context mContext;
protected final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
private final DevicesChangedBroadcastReceiver mReceiver;
diff --git a/src/com/android/settings/media/MediaOutputGroupSlice.java b/src/com/android/settings/media/MediaOutputGroupSlice.java
deleted file mode 100644
index 0359ca9..0000000
--- a/src/com/android/settings/media/MediaOutputGroupSlice.java
+++ /dev/null
@@ -1,268 +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.media;
-
-import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
-
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.builders.ListBuilder;
-import androidx.slice.builders.SliceAction;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.slices.CustomSliceable;
-import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settings.slices.SliceBroadcastReceiver;
-import com.android.settingslib.media.MediaDevice;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Show the Media device that can be transfer the media.
- */
-public class MediaOutputGroupSlice implements CustomSliceable {
-
- @VisibleForTesting
- static final String GROUP_DEVICES = "group_devices";
- @VisibleForTesting
- static final String MEDIA_DEVICE_ID = "media_device_id";
- @VisibleForTesting
- static final String CUSTOMIZED_ACTION = "customized_action";
- @VisibleForTesting
- static final int ACTION_VOLUME_ADJUSTMENT = 1;
- @VisibleForTesting
- static final int ACTION_MEDIA_SESSION_OPERATION = 2;
- @VisibleForTesting
- static final int ERROR = -1;
-
- private static final String TAG = "MediaOutputGroupSlice";
- private static final int COLOR_DISABLED = (int) (255 * 0.3);
-
- private final Context mContext;
- private MediaDeviceUpdateWorker mWorker;
-
- public MediaOutputGroupSlice(Context context) {
- mContext = context;
- }
-
- @Override
- public Slice getSlice() {
- final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
- .setAccentColor(COLOR_NOT_TINTED);
- // Add "Group" row
- final IconCompat titleIcon = IconCompat.createWithResource(mContext,
- R.drawable.ic_speaker_group_black_24dp);
- final Bitmap emptyBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
- if (getWorker() == null) {
- return listBuilder.build();
- }
- final int maxVolume = getWorker().getSessionVolumeMax();
- final String title = mContext.getString(R.string.media_output_group);
- final SliceAction primaryAction = SliceAction.createDeeplink(
- getBroadcastIntent(GROUP_DEVICES,
- GROUP_DEVICES.hashCode(),
- ACTION_MEDIA_SESSION_OPERATION),
- titleIcon, ListBuilder.ICON_IMAGE, GROUP_DEVICES);
- final SliceAction endItemAction = SliceAction.createDeeplink(
- getBroadcastIntent(GROUP_DEVICES,
- GROUP_DEVICES.hashCode() + ACTION_MEDIA_SESSION_OPERATION,
- ACTION_MEDIA_SESSION_OPERATION),
- IconCompat.createWithBitmap(emptyBitmap), ListBuilder.ICON_IMAGE, "");
- if (maxVolume > 0 && !getWorker().hasAdjustVolumeUserRestriction()) {
- // Add InputRange row
- listBuilder.addInputRange(new ListBuilder.InputRangeBuilder()
- .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
- .addEndItem(endItemAction)
- .setTitle(title)
- .setPrimaryAction(primaryAction)
- .setInputAction(getBroadcastIntent(GROUP_DEVICES,
- GROUP_DEVICES.hashCode() + ACTION_VOLUME_ADJUSTMENT,
- ACTION_VOLUME_ADJUSTMENT))
- .setMax(maxVolume)
- .setValue(getWorker().getSessionVolume()));
- } else { // No max volume information. Add generic Row
- listBuilder.addRow(new ListBuilder.RowBuilder()
- .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setPrimaryAction(primaryAction));
- }
- // Add device row
- addRow(listBuilder, getWorker().getSelectedMediaDevice(), true);
- addRow(listBuilder, getWorker().getSelectableMediaDevice(), false);
- return listBuilder.build();
- }
-
- private void addRow(ListBuilder listBuilder, List<MediaDevice> mediaDevices, boolean selected) {
- final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction();
- List<MediaDevice> deselectableMediaDevices = new ArrayList<>();
- if (selected) {
- deselectableMediaDevices = getWorker().getDeselectableMediaDevice();
- }
- for (MediaDevice device : mediaDevices) {
- final int maxVolume = device.getMaxVolume();
- final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon());
- final String title = device.getName();
- final SliceAction disabledIconSliceAction = SliceAction.createDeeplink(
- getBroadcastIntent(null, 0, 0),
- getDisabledCheckboxIcon(), ListBuilder.ICON_IMAGE, "");
- final SliceAction enabledIconSliceAction = SliceAction.createToggle(
- getBroadcastIntent(device.getId(),
- device.hashCode() + ACTION_MEDIA_SESSION_OPERATION,
- ACTION_MEDIA_SESSION_OPERATION),
- IconCompat.createWithResource(mContext, R.drawable.ic_check_box_anim),
- "",
- selected);
- if (maxVolume > 0 && selected && !adjustVolumeUserRestriction) {
- // Add InputRange row
- final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
- .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setInputAction(getBroadcastIntent(device.getId(),
- device.hashCode() + ACTION_VOLUME_ADJUSTMENT,
- ACTION_VOLUME_ADJUSTMENT))
- .setMax(device.getMaxVolume())
- .setValue(device.getCurrentVolume());
- // Add endItem with different icons
- if (selected && (!getWorker().isDeviceIncluded(deselectableMediaDevices, device)
- || mediaDevices.size() == 1)) {
- builder.addEndItem(disabledIconSliceAction);
- } else {
- builder.addEndItem(enabledIconSliceAction);
- }
- listBuilder.addInputRange(builder);
- } else { // No max volume information. Add generic Row
- final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
- .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
- .setTitle(title);
- // Add endItem with different icons
- if (selected && (!getWorker().isDeviceIncluded(deselectableMediaDevices, device)
- || mediaDevices.size() == 1)) {
- rowBuilder.addEndItem(disabledIconSliceAction);
- } else {
- rowBuilder.addEndItem(enabledIconSliceAction);
- }
- listBuilder.addRow(rowBuilder);
- }
- }
- }
-
- private IconCompat getDisabledCheckboxIcon() {
- final Drawable drawable = mContext.getDrawable(R.drawable.ic_check_box_blue_24dp).mutate();
- final Bitmap checkbox = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(checkbox);
- drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
- drawable.setAlpha(COLOR_DISABLED);
- drawable.draw(canvas);
-
- return IconCompat.createWithBitmap(checkbox);
- }
-
- private PendingIntent getBroadcastIntent(String id, int requestCode, int action) {
- final Intent intent = new Intent(getUri().toString());
- intent.setClass(mContext, SliceBroadcastReceiver.class);
- intent.putExtra(MEDIA_DEVICE_ID, id);
- intent.putExtra(CUSTOMIZED_ACTION, action);
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- return PendingIntent.getBroadcast(mContext, requestCode, intent,
- PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
- }
-
- private MediaDeviceUpdateWorker getWorker() {
- if (mWorker == null) {
- mWorker = SliceBackgroundWorker.getInstance(getUri());
- }
- return mWorker;
- }
-
- @Override
- public Uri getUri() {
- return MEDIA_OUTPUT_GROUP_SLICE_URI;
- }
-
- @Override
- public void onNotifyChange(Intent intent) {
- final String id = intent.getStringExtra(MEDIA_DEVICE_ID);
- if (TextUtils.isEmpty(id)) {
- Log.e(TAG, "Unable to handle notification. The device is unavailable");
- return;
- }
- final MediaDeviceUpdateWorker worker = getWorker();
- final MediaDevice device = worker.getMediaDeviceById(id);
- switch (intent.getIntExtra(CUSTOMIZED_ACTION, ERROR)) {
- case ACTION_VOLUME_ADJUSTMENT:
- final int newPosition = intent.getIntExtra(EXTRA_RANGE_VALUE, ERROR);
- if (newPosition == ERROR) {
- Log.e(TAG, "Unable to adjust volume. The volume value is unavailable");
- return;
- }
- // Group volume adjustment
- if (TextUtils.equals(id, GROUP_DEVICES)) {
- worker.adjustSessionVolume(newPosition);
- } else {
- if (device == null) {
- Log.e(TAG, "Unable to adjust volume. The device(" + id
- + ") is unavailable");
- return;
- }
- // Single device volume adjustment
- worker.adjustVolume(device, newPosition);
- }
- break;
- case ACTION_MEDIA_SESSION_OPERATION:
- if (device == null) {
- Log.e(TAG, "Unable to adjust session volume. The device(" + id
- + ") is unavailable");
- return;
- }
- if (worker.isDeviceIncluded(worker.getSelectableMediaDevice(), device)) {
- worker.addDeviceToPlayMedia(device);
- } else if (worker.isDeviceIncluded(worker.getDeselectableMediaDevice(), device)) {
- worker.removeDeviceFromPlayMedia(device);
- } else {
- // Do nothing
- Log.d(TAG, device.getName() + " is not selectable nor deselectable");
- }
- break;
- }
- }
-
- @Override
- public Intent getIntent() {
- return null;
- }
-
- @Override
- public Class getBackgroundWorkerClass() {
- return MediaDeviceUpdateWorker.class;
- }
-}
diff --git a/src/com/android/settings/media/MediaOutputIndicatorSlice.java b/src/com/android/settings/media/MediaOutputIndicatorSlice.java
index 40ee05b..69e5dde 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorSlice.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorSlice.java
@@ -87,7 +87,7 @@
@Override
public Intent getIntent() {
- // This Slice reflects active media device information and launch MediaOutputSlice. It does
+ // This Slice reflects active media device information and launch MediaOutputDialog. It does
// not contain its owned Slice data
return null;
}
diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java
deleted file mode 100644
index ae7e0e8..0000000
--- a/src/com/android/settings/media/MediaOutputSlice.java
+++ /dev/null
@@ -1,415 +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.media;
-
-import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
-import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
-
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
-
-import android.app.PendingIntent;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.text.SpannableString;
-import android.text.TextUtils;
-import android.text.style.ForegroundColorSpan;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.builders.ListBuilder;
-import androidx.slice.builders.SliceAction;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.bluetooth.BluetoothPairingDetail;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.slices.CustomSliceable;
-import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settings.slices.SliceBroadcastReceiver;
-import com.android.settingslib.media.LocalMediaManager;
-import com.android.settingslib.media.MediaDevice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
-
-import java.util.Collection;
-
-/**
- * Show the Media device that can be transfer the media.
- */
-public class MediaOutputSlice implements CustomSliceable {
-
- private static final String TAG = "MediaOutputSlice";
- private static final String MEDIA_DEVICE_ID = "media_device_id";
- private static final String MEDIA_GROUP_DEVICE = "media_group_device";
- private static final String MEDIA_GROUP_REQUEST = "media_group_request";
- private static final int NON_SLIDER_VALUE = -1;
-
- public static final String MEDIA_PACKAGE_NAME = "media_package_name";
-
- private final Context mContext;
-
- private MediaDeviceUpdateWorker mWorker;
-
- public MediaOutputSlice(Context context) {
- mContext = context;
- }
-
- @VisibleForTesting
- void init(MediaDeviceUpdateWorker worker) {
- mWorker = worker;
- }
-
- @Override
- public Slice getSlice() {
- final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
- .setAccentColor(COLOR_NOT_TINTED);
- if (!isVisible()) {
- Log.d(TAG, "getSlice() is not visible");
- return listBuilder.build();
- }
-
- final Collection<MediaDevice> devices = getMediaDevices();
- final MediaDeviceUpdateWorker worker = getWorker();
-
- if (worker.getSelectedMediaDevice().size() > 1) {
- // Insert group item to the first when it is available
- if (worker.getSessionVolumeMax() > 0 && !worker.hasAdjustVolumeUserRestriction()) {
- listBuilder.addInputRange(getGroupSliderRow());
- } else {
- listBuilder.addRow(getGroupRow());
- }
- // Add all other devices
- for (MediaDevice device : devices) {
- addRow(device, null /* connectedDevice */, listBuilder);
- }
- } else {
- final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice();
- if (devices.size() == 1) {
- // Zero state
- final MediaDevice device = devices.iterator().next();
- addRow(device, device, listBuilder);
- // Add "pair new" only when local output device exists
- final int type = device.getDeviceType();
- if (type == MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE
- || type == MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE
- || type == MediaDevice.MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE) {
- listBuilder.addRow(getPairNewRow());
- }
- } else {
- final boolean isTouched = worker.getIsTouched();
- // Fix the last top device when user press device to transfer.
- final MediaDevice topDevice = isTouched ? worker.getTopDevice() : connectedDevice;
-
- if (topDevice != null) {
- addRow(topDevice, connectedDevice, listBuilder);
- worker.setTopDevice(topDevice);
- }
-
- for (MediaDevice device : devices) {
- if (topDevice == null || !TextUtils.equals(topDevice.getId(), device.getId())) {
- addRow(device, connectedDevice, listBuilder);
- }
- }
- }
- }
- return listBuilder.build();
- }
-
- private ListBuilder.RowBuilder getPairNewRow() {
- final Drawable d = mContext.getDrawable(R.drawable.ic_add_24dp);
- d.setColorFilter(new PorterDuffColorFilter(Utils.getColorAccentDefaultColor(mContext),
- PorterDuff.Mode.SRC_IN));
- final IconCompat icon = Utils.createIconWithDrawable(d);
- final String title = mContext.getString(R.string.bluetooth_pairing_pref_title);
- final Intent intent = new SubSettingLauncher(mContext)
- .setDestination(BluetoothPairingDetail.class.getName())
- .setTitleRes(R.string.bluetooth_pairing_page_title)
- .setSourceMetricsCategory(SettingsEnums.PANEL_MEDIA_OUTPUT)
- .toIntent();
- final SliceAction primarySliceAction = SliceAction.createDeeplink(
- PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
- PendingIntent.FLAG_IMMUTABLE),
- IconCompat.createWithResource(mContext, R.drawable.ic_add_24dp/*ic_add_blue_24dp*/),
- ListBuilder.ICON_IMAGE,
- mContext.getText(R.string.bluetooth_pairing_pref_title));
- final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder()
- .setTitleItem(icon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setPrimaryAction(primarySliceAction);
- return builder;
- }
-
- private ListBuilder.InputRangeBuilder getGroupSliderRow() {
- final IconCompat icon = IconCompat.createWithResource(mContext,
- R.drawable.ic_speaker_group_black_24dp);
- final CharSequence sessionName = getWorker().getSessionName();
- final CharSequence title = TextUtils.isEmpty(sessionName)
- ? mContext.getString(R.string.media_output_group) : sessionName;
- final PendingIntent broadcastAction =
- getBroadcastIntent(mContext, MEDIA_GROUP_DEVICE, MEDIA_GROUP_DEVICE.hashCode());
- final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon,
- ListBuilder.ICON_IMAGE, title);
- final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
- .setTitleItem(icon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setPrimaryAction(primarySliceAction)
- .setInputAction(getSliderInputAction(MEDIA_GROUP_DEVICE.hashCode(),
- MEDIA_GROUP_DEVICE))
- .setMax(getWorker().getSessionVolumeMax())
- .setValue(getWorker().getSessionVolume())
- .addEndItem(getEndItemSliceAction());
- return builder;
- }
-
- private ListBuilder.RowBuilder getGroupRow() {
- final IconCompat icon = IconCompat.createWithResource(mContext,
- R.drawable.ic_speaker_group_black_24dp);
- final CharSequence sessionName = getWorker().getSessionName();
- final CharSequence title = TextUtils.isEmpty(sessionName)
- ? mContext.getString(R.string.media_output_group) : sessionName;
- final PendingIntent broadcastAction =
- getBroadcastIntent(mContext, MEDIA_GROUP_DEVICE, MEDIA_GROUP_DEVICE.hashCode());
- final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon,
- ListBuilder.ICON_IMAGE, title);
- final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder()
- .setTitleItem(icon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setPrimaryAction(primarySliceAction)
- .addEndItem(getEndItemSliceAction());
- return builder;
- }
-
- private void addRow(MediaDevice device, MediaDevice connectedDevice, ListBuilder listBuilder) {
- if (connectedDevice != null && TextUtils.equals(device.getId(), connectedDevice.getId())) {
- final String title = device.getName();
- final IconCompat icon = getDeviceIconCompat(device);
-
- final PendingIntent broadcastAction =
- getBroadcastIntent(mContext, device.getId(), device.hashCode());
- final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon,
- ListBuilder.ICON_IMAGE, title);
-
- if (device.getMaxVolume() > 0 && !getWorker().hasAdjustVolumeUserRestriction()) {
- final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
- .setTitleItem(icon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setPrimaryAction(primarySliceAction)
- .setInputAction(getSliderInputAction(device.hashCode(), device.getId()))
- .setMax(device.getMaxVolume())
- .setValue(device.getCurrentVolume());
- // Check end item visibility
- if (device.getDeviceType() == MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE
- && !getWorker().getSelectableMediaDevice().isEmpty()) {
- builder.addEndItem(getEndItemSliceAction());
- }
- listBuilder.addInputRange(builder);
- } else {
- Log.d(TAG, "addRow device = " + device.getName() + " MaxVolume = "
- + device.getMaxVolume());
- final ListBuilder.RowBuilder builder = getMediaDeviceRow(device);
- // Check end item visibility
- if (device.getDeviceType() == MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE
- && !getWorker().getSelectableMediaDevice().isEmpty()) {
- builder.addEndItem(getEndItemSliceAction());
- }
- listBuilder.addRow(builder);
- }
- } else {
- if (device.getState() == LocalMediaManager.MediaDeviceState.STATE_CONNECTING) {
- listBuilder.addRange(getTransferringMediaDeviceRow(device));
- } else {
- listBuilder.addRow(getMediaDeviceRow(device));
- }
- }
- }
-
- private PendingIntent getSliderInputAction(int requestCode, String id) {
- final Intent intent = new Intent(getUri().toString())
- .setData(getUri())
- .putExtra(MEDIA_DEVICE_ID, id)
- .setClass(mContext, SliceBroadcastReceiver.class);
-
- return PendingIntent.getBroadcast(mContext, requestCode, intent,
- PendingIntent.FLAG_IMMUTABLE);
- }
-
- private SliceAction getEndItemSliceAction() {
- final Intent intent = new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT_GROUP)
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
- getWorker().getPackageName());
- final int requestCode = TextUtils.isEmpty(getWorker().getPackageName())
- ? 0
- : getWorker().getPackageName().hashCode();
- return SliceAction.createDeeplink(
- PendingIntent.getActivity(mContext, requestCode, intent,
- PendingIntent.FLAG_IMMUTABLE),
- IconCompat.createWithResource(mContext, R.drawable.ic_add_blue_24dp),
- ListBuilder.ICON_IMAGE,
- mContext.getText(R.string.add));
- }
-
- private IconCompat getDeviceIconCompat(MediaDevice device) {
- Drawable drawable = device.getIcon();
- if (drawable == null) {
- Log.d(TAG, "getDeviceIconCompat() device : " + device.getName() + ", drawable is null");
- // Use default Bluetooth device icon to handle getIcon() is null case.
- drawable = mContext.getDrawable(com.android.internal.R.drawable.ic_bt_headphones_a2dp);
- }
-
- return Utils.createIconWithDrawable(drawable);
- }
-
- private MediaDeviceUpdateWorker getWorker() {
- if (mWorker == null) {
- mWorker = SliceBackgroundWorker.getInstance(getUri());
- }
- return mWorker;
- }
-
- private Collection<MediaDevice> getMediaDevices() {
- final Collection<MediaDevice> devices = getWorker().getMediaDevices();
- return devices;
- }
-
- private ListBuilder.RangeBuilder getTransferringMediaDeviceRow(MediaDevice device) {
- final IconCompat deviceIcon = getDeviceIconCompat(device);
- final SliceAction sliceAction = SliceAction.create(getBroadcastIntent(mContext,
- device.getId(), device.hashCode()), deviceIcon, ListBuilder.ICON_IMAGE,
- mContext.getText(R.string.media_output_switching));
-
- return new ListBuilder.RangeBuilder()
- .setTitleItem(deviceIcon, ListBuilder.ICON_IMAGE)
- .setMode(ListBuilder.RANGE_MODE_INDETERMINATE)
- .setTitle(device.getName())
- .setPrimaryAction(sliceAction);
- }
-
- private ListBuilder.RowBuilder getMediaDeviceRow(MediaDevice device) {
- final String deviceName = device.getName();
- final PendingIntent broadcastAction =
- getBroadcastIntent(mContext, device.getId(), device.hashCode());
- final IconCompat deviceIcon = getDeviceIconCompat(device);
- final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
- .setTitleItem(deviceIcon, ListBuilder.ICON_IMAGE);
-
- if (device.getDeviceType() == MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE
- && !device.isConnected()) {
- final int state = device.getState();
- if (state == LocalMediaManager.MediaDeviceState.STATE_CONNECTING_FAILED) {
- rowBuilder.setTitle(deviceName);
- rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
- ListBuilder.ICON_IMAGE, deviceName));
- rowBuilder.setSubtitle(mContext.getText(R.string.bluetooth_connect_failed));
- } else {
- // Append status to title only for the disconnected Bluetooth device.
- final SpannableString spannableTitle = new SpannableString(
- mContext.getString(R.string.media_output_disconnected_status, deviceName));
- spannableTitle.setSpan(new ForegroundColorSpan(
- Utils.getColorAttrDefaultColor(mContext,
- android.R.attr.textColorSecondary)),
- deviceName.length(),
- spannableTitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
- rowBuilder.setTitle(spannableTitle);
- rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
- ListBuilder.ICON_IMAGE, spannableTitle));
- }
- } else {
- rowBuilder.setTitle(deviceName);
- rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
- ListBuilder.ICON_IMAGE, deviceName));
- if (device.getState() == LocalMediaManager.MediaDeviceState.STATE_CONNECTING_FAILED) {
- rowBuilder.setSubtitle(mContext.getText(R.string.media_output_switch_error_text));
- }
- }
-
- return rowBuilder;
- }
-
- private PendingIntent getBroadcastIntent(Context context, String id, int requestCode) {
- final Intent intent = new Intent(getUri().toString());
- intent.setClass(context, SliceBroadcastReceiver.class);
- intent.putExtra(MEDIA_DEVICE_ID, id);
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- return PendingIntent.getBroadcast(context, requestCode, intent,
- PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
- }
-
- @Override
- public Uri getUri() {
- return MEDIA_OUTPUT_SLICE_URI;
- }
-
- @Override
- public void onNotifyChange(Intent intent) {
- final MediaDeviceUpdateWorker worker = getWorker();
- final String id = intent != null ? intent.getStringExtra(MEDIA_DEVICE_ID) : "";
- if (TextUtils.isEmpty(id)) {
- return;
- }
-
- final int newPosition = intent.getIntExtra(EXTRA_RANGE_VALUE, NON_SLIDER_VALUE);
- if (TextUtils.equals(id, MEDIA_GROUP_DEVICE)) {
- // Session volume adjustment
- worker.adjustSessionVolume(newPosition);
- } else {
- final MediaDevice device = worker.getMediaDeviceById(id);
- if (device == null) {
- Log.d(TAG, "onNotifyChange: Unable to get device " + id);
- return;
- }
-
- if (newPosition == NON_SLIDER_VALUE) {
- // Intent for device connection
- Log.d(TAG, "onNotifyChange: Switch to " + device.getName());
- worker.setIsTouched(true);
- worker.connectDevice(device);
- } else {
- // Single device volume adjustment
- worker.adjustVolume(device, newPosition);
- }
- }
- }
-
- @Override
- public Intent getIntent() {
- return null;
- }
-
- @Override
- public Class getBackgroundWorkerClass() {
- return MediaDeviceUpdateWorker.class;
- }
-
- private boolean isVisible() {
- // To decide Slice's visibility.
- // Return true if
- // 1. AudioMode is not in on-going call
- // 2. worker is not null
- // 3. Available devices are more than 0
- return getWorker() != null
- && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext)
- && getWorker().getMediaDevices().size() > 0;
- }
-}
diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java
new file mode 100644
index 0000000..d221fbd
--- /dev/null
+++ b/src/com/android/settings/network/EraseEuiccDataController.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.preference.Preference;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.system.ResetDashboardFragment;
+
+/**
+ * Controller for erasing Euicc data
+ */
+public class EraseEuiccDataController extends BasePreferenceController implements
+ PreferenceControllerMixin {
+ private ResetDashboardFragment mHostFragment;
+
+ public EraseEuiccDataController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ public void setFragment(ResetDashboardFragment hostFragment) {
+ mHostFragment = hostFragment;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ return false;
+ }
+ EraseEuiccDataDialogFragment.show(mHostFragment);
+ return true;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE_UNSEARCHABLE;
+ }
+}
diff --git a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java
new file mode 100644
index 0000000..3aee9b1
--- /dev/null
+++ b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java
@@ -0,0 +1,85 @@
+/*
+ * 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;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.content.DialogInterface;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.RecoverySystem;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.system.ResetDashboardFragment;
+
+public class EraseEuiccDataDialogFragment extends InstrumentedDialogFragment implements
+ DialogInterface.OnClickListener {
+
+ public static final String TAG = "EraseEuiccDataDlg";
+ private static final String PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK =
+ "com.android.settings.network";
+
+ public static void show(ResetDashboardFragment host) {
+ final EraseEuiccDataDialogFragment dialog = new EraseEuiccDataDialogFragment();
+ dialog.setTargetFragment(host, 0 /* requestCode */);
+ final FragmentManager manager = host.getActivity().getSupportFragmentManager();
+ dialog.show(manager, TAG);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.RESET_EUICC;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.reset_esim_title)
+ .setMessage(R.string.reset_esim_desc)
+ .setPositiveButton(R.string.erase_euicc_data_button, this)
+ .setNegativeButton(R.string.cancel, null)
+ .setOnDismissListener(this)
+ .create();
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Fragment fragment = getTargetFragment();
+ if (!(fragment instanceof ResetDashboardFragment)) {
+ Log.e(TAG, "getTargetFragment return unexpected type");
+ }
+
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ AsyncTask.execute(new Runnable() {
+ @Override
+ public void run() {
+ RecoverySystem.wipeEuiccData(
+ getContext(), PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK);
+ }
+ });
+ }
+ }
+}
diff --git a/src/com/android/settings/network/MobilePlanPreferenceController.java b/src/com/android/settings/network/MobilePlanPreferenceController.java
index 255dfcd..b4135b8 100644
--- a/src/com/android/settings/network/MobilePlanPreferenceController.java
+++ b/src/com/android/settings/network/MobilePlanPreferenceController.java
@@ -145,7 +145,7 @@
}
// Get provisioning URL
- String url = mCm.getMobileProvisioningUrl();
+ String url = mTm.getMobileProvisioningUrl();
if (!TextUtils.isEmpty(url)) {
Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
Intent.CATEGORY_APP_BROWSER);
diff --git a/src/com/android/settings/network/NetworkMobileProviderController.java b/src/com/android/settings/network/NetworkMobileProviderController.java
index 4c29256..5dc6c0d 100644
--- a/src/com/android/settings/network/NetworkMobileProviderController.java
+++ b/src/com/android/settings/network/NetworkMobileProviderController.java
@@ -24,6 +24,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.settingslib.core.lifecycle.Lifecycle;
/**
@@ -115,4 +116,10 @@
}
mPreferenceCategory.setVisible(available);
}
+
+ public void setWifiPickerTrackerHelper(WifiPickerTrackerHelper helper) {
+ if (mSubscriptionsController != null) {
+ mSubscriptionsController.setWifiPickerTrackerHelper(helper);
+ }
+ }
}
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index 90e3ac4..c4c767b 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -27,19 +27,12 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
import android.os.PowerManager;
-import android.os.Process;
-import android.os.SimpleClock;
-import android.os.SystemClock;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
@@ -74,6 +67,7 @@
import com.android.settings.wifi.WifiConfigUiBase2;
import com.android.settings.wifi.WifiConnectListener;
import com.android.settings.wifi.WifiDialog2;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.settings.wifi.WifiUtils;
import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
import com.android.settings.wifi.dpp.WifiDppUtils;
@@ -88,8 +82,6 @@
import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
import com.android.wifitrackerlib.WifiPickerTracker;
-import java.time.Clock;
-import java.time.ZoneOffset;
import java.util.List;
import java.util.Optional;
@@ -103,8 +95,10 @@
implements Indexable, WifiPickerTracker.WifiPickerTrackerCallback,
WifiDialog2.WifiDialog2Listener, DialogInterface.OnDismissListener {
- private static final String TAG = "NetworkProviderSettings";
+ public static final String ACTION_NETWORK_PROVIDER_SETTINGS =
+ "android.settings.NETWORK_PROVIDER_SETTINGS";
+ private static final String TAG = "NetworkProviderSettings";
// IDs of context menu
static final int MENU_ID_CONNECT = Menu.FIRST + 1;
@VisibleForTesting
@@ -113,11 +107,6 @@
static final int MENU_ID_FORGET = Menu.FIRST + 3;
static final int MENU_ID_MODIFY = Menu.FIRST + 4;
- // Max age of tracked WifiEntries
- private static final long MAX_SCAN_AGE_MILLIS = 15_000;
- // Interval between initiating WifiPickerTracker scans
- private static final long SCAN_INTERVAL_MILLIS = 10_000;
-
@VisibleForTesting
static final int ADD_NETWORK_REQUEST = 2;
static final int CONFIG_NETWORK_REQUEST = 3;
@@ -185,11 +174,9 @@
*/
private boolean mIsRestricted;
- // Worker thread used for WifiPickerTracker work
- private HandlerThread mWorkerThread;
-
@VisibleForTesting
WifiPickerTracker mWifiPickerTracker;
+ private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
private WifiDialog2 mDialog;
@@ -277,27 +264,9 @@
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- final Context context = getContext();
- mWorkerThread = new HandlerThread(TAG
- + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
- Process.THREAD_PRIORITY_BACKGROUND);
- mWorkerThread.start();
- final Clock elapsedRealtimeClock = new SimpleClock(ZoneOffset.UTC) {
- @Override
- public long millis() {
- return SystemClock.elapsedRealtime();
- }
- };
- mWifiPickerTracker = new WifiPickerTracker(getSettingsLifecycle(), context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- this);
+ mWifiPickerTrackerHelper =
+ new WifiPickerTrackerHelper(getSettingsLifecycle(), getContext(), this);
+ mWifiPickerTracker = mWifiPickerTrackerHelper.getWifiPickerTracker();
final Activity activity = getActivity();
@@ -354,6 +323,10 @@
if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
}
+
+ if (mNetworkMobileProviderController != null) {
+ mNetworkMobileProviderController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);
+ }
}
@Override
@@ -363,13 +336,6 @@
}
@Override
- public void onDestroyView() {
- mWorkerThread.quit();
-
- super.onDestroyView();
- }
-
- @Override
public void onStart() {
super.onStart();
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
index bdadfe4..4878f31 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
@@ -28,7 +28,6 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.net.NetworkUtils;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -56,6 +55,8 @@
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.google.common.net.InternetDomainName;
+
import java.util.HashMap;
import java.util.Map;
@@ -278,7 +279,7 @@
final Button saveButton = getSaveButton();
if (saveButton != null) {
saveButton.setEnabled(modeProvider
- ? NetworkUtils.isWeaklyValidatedHostname(mEditText.getText().toString())
+ ? InternetDomainName.isValid(mEditText.getText().toString())
: true);
}
}
diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java
new file mode 100644
index 0000000..a495e89
--- /dev/null
+++ b/src/com/android/settings/network/ProviderModelSlice.java
@@ -0,0 +1,216 @@
+/*
+ * 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;
+
+
+import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+
+import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.telephony.SubscriptionManager;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.slice.Slice;
+import androidx.slice.builders.ListBuilder;
+
+import com.android.settings.R;
+import com.android.settings.SubSettings;
+import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.network.telephony.NetworkProviderWorker;
+import com.android.settings.slices.CustomSliceable;
+import com.android.settings.slices.SliceBackgroundWorker;
+import com.android.settings.slices.SliceBuilderUtils;
+import com.android.settings.wifi.slice.WifiSlice;
+import com.android.settings.wifi.slice.WifiSliceItem;
+import com.android.wifitrackerlib.WifiEntry;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * {@link CustomSliceable} for Wi-Fi and mobile data connection, used by generic clients.
+ */
+// ToDo If the provider model become default design in the future, the code needs to refactor
+// the whole structure and use new "data object", and then split provider model out of old design.
+public class ProviderModelSlice extends WifiSlice {
+
+ private static final String TAG = "ProviderModelSlice";
+ private final ProviderModelSliceHelper mHelper;
+
+ public ProviderModelSlice(Context context) {
+ super(context);
+ mHelper = getHelper();
+ }
+
+ @Override
+ public Uri getUri() {
+ return PROVIDER_MODEL_SLICE_URI;
+ }
+
+ private static void log(String s) {
+ Log.d(TAG, s);
+ }
+
+ protected boolean isApRowCollapsed() {
+ return false;
+ }
+
+ @Override
+ public Slice getSlice() {
+ // The provider model slice step:
+ // First section: Add a Wi-Fi item which state is connected.
+ // Second section: Add a carrier item.
+ // Third section: Add the Wi-Fi items which are not connected.
+ // Fourth section: If device has connection problem, this row show the message for user.
+
+ if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled()) {
+ log("Airplane mode is enabled.");
+ // ToDo Next CL will add the Airplane mode Message.
+ return mHelper.createListBuilder(getUri()).build();
+ }
+
+ int maxListSize = 0;
+ List<WifiSliceItem> wifiList = null;
+ final NetworkProviderWorker worker = getWorker();
+ if (worker != null) {
+ // get Wi-Fi list.
+ wifiList = worker.getResults();
+ maxListSize = worker.getApRowCount();
+ } else {
+ log("network provider worker is null.");
+ }
+
+ final boolean hasCarrier = mHelper.hasCarrier();
+ log("hasCarrier: " + hasCarrier);
+
+
+ final ListBuilder listBuilder = mHelper.createListBuilder(getUri());
+
+ // First section: Add a Wi-Fi item which state is connected.
+ final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
+ if (connectedWifiItem != null) {
+ log("get Wi-Fi item witch is connected");
+ listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
+ maxListSize--;
+ }
+
+ // Second section: Add a carrier item.
+ if (hasCarrier) {
+ listBuilder.addRow(mHelper.createCarrierRow());
+ maxListSize--;
+ }
+
+ // Third section: Add the Wi-Fi items which are not connected.
+ if (wifiList != null) {
+ log("get Wi-Fi items which are not connected");
+ final List<WifiSliceItem> disconnectedWifiList = wifiList.stream()
+ .filter(wifiSliceItem -> wifiSliceItem.getConnectedState()
+ != WifiEntry.CONNECTED_STATE_CONNECTED)
+ .limit(maxListSize)
+ .collect(Collectors.toList());
+ for (WifiSliceItem item : disconnectedWifiList) {
+ listBuilder.addRow(getWifiSliceItemRow(item));
+ }
+ }
+
+ // Fourth section: If device has connection problem, this row show the message for user.
+ // 1) show non_carrier_network_unavailable:
+ // - while no wifi item
+ // 2) show all_network_unavailable:
+ // - while no wifi item + no carrier
+ // - while no wifi item + no data capability
+ if (worker == null || wifiList == null) {
+ log("wifiList is null");
+ int resId = R.string.non_carrier_network_unavailable;
+ if (!hasCarrier || mHelper.isNoCarrierData()) {
+ log("No carrier item or no carrier data.");
+ resId = R.string.all_network_unavailable;
+ }
+
+ if (!hasCarrier) {
+ // If there is no item in ProviderModelItem, slice needs a header.
+ listBuilder.setHeader(mHelper.createHeader());
+ }
+ listBuilder.addGridRow(mHelper.createMessageGridRow(resId));
+ }
+
+ return listBuilder.build();
+ }
+
+ /**
+ * Update the current carrier's mobile data status.
+ */
+ @Override
+ public void onNotifyChange(Intent intent) {
+ final SubscriptionManager subscriptionManager = mHelper.getSubscriptionManager();
+ if (subscriptionManager == null) {
+ return;
+ }
+ final int defaultSubId = subscriptionManager.getDefaultDataSubscriptionId();
+ log("defaultSubId:" + defaultSubId);
+ if (!SubscriptionManager.isUsableSubscriptionId(defaultSubId)) {
+ return; // No subscription - do nothing.
+ }
+ boolean requestConnectCarrier = !intent.hasExtra(EXTRA_TOGGLE_STATE);
+ // Enable the mobile data always if the user requests to connect to the carrier network.
+ boolean newState = requestConnectCarrier ? true
+ : intent.getBooleanExtra(EXTRA_TOGGLE_STATE, mHelper.isMobileDataEnabled());
+
+ MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState,
+ false /* disableOtherSubscriptions */);
+
+ final NetworkProviderWorker worker = getWorker();
+ if (worker == null) {
+ return;
+ }
+ if (requestConnectCarrier) {
+ worker.connectCarrierNetwork();
+ } else {
+ worker.setCarrierNetworkEnabled(newState);
+ }
+ }
+
+ @Override
+ public Intent getIntent() {
+ final String screenTitle = mContext.getText(R.string.provider_internet_settings).toString();
+ return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
+ NetworkProviderSettings.class.getName(), "" /* key */, screenTitle,
+ SettingsEnums.SLICE)
+ .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+ .setData(getUri());
+ }
+
+ @Override
+ public Class getBackgroundWorkerClass() {
+ return NetworkProviderWorker.class;
+ }
+
+ @VisibleForTesting
+ ProviderModelSliceHelper getHelper() {
+ return new ProviderModelSliceHelper(mContext, this);
+ }
+
+ @VisibleForTesting
+ NetworkProviderWorker getWorker() {
+ return SliceBackgroundWorker.getInstance(getUri());
+ }
+}
diff --git a/src/com/android/settings/network/ProviderModelSliceHelper.java b/src/com/android/settings/network/ProviderModelSliceHelper.java
new file mode 100644
index 0000000..3164af4
--- /dev/null
+++ b/src/com/android/settings/network/ProviderModelSliceHelper.java
@@ -0,0 +1,278 @@
+/*
+ * 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;
+
+import static com.android.settings.network.telephony.MobileNetworkUtils.NO_CELL_DATA_TYPE_ICON;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.slice.builders.GridRowBuilder;
+import androidx.slice.builders.ListBuilder;
+import androidx.slice.builders.SliceAction;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.slices.CustomSliceable;
+import com.android.settings.wifi.slice.WifiSliceItem;
+import com.android.settingslib.WirelessUtils;
+import com.android.settingslib.net.SignalStrengthUtil;
+import com.android.settingslib.utils.ThreadUtils;
+import com.android.wifitrackerlib.WifiEntry;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * The helper is for slice of carrier and non-Carrier, used by ProviderModelSlice.
+ */
+public class ProviderModelSliceHelper {
+ private static final String TAG = "ProviderModelSlice";
+ private final SubscriptionManager mSubscriptionManager;
+ private final TelephonyManager mTelephonyManager;
+ protected final Context mContext;
+ private CustomSliceable mSliceable;
+
+ public ProviderModelSliceHelper(Context context, CustomSliceable sliceable) {
+ mContext = context;
+ mSliceable = sliceable;
+ mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+ mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ }
+
+ private static void log(String s) {
+ Log.d(TAG, s);
+ }
+
+ protected ListBuilder.HeaderBuilder createHeader() {
+ return new ListBuilder.HeaderBuilder()
+ .setTitle(mContext.getText(R.string.summary_placeholder))
+ .setPrimaryAction(getPrimarySliceAction());
+ }
+
+ protected ListBuilder createListBuilder(Uri uri) {
+ final ListBuilder builder = new ListBuilder(mContext, uri, ListBuilder.INFINITY)
+ .setAccentColor(-1)
+ .setKeywords(getKeywords());
+ return builder;
+ }
+
+ protected GridRowBuilder createMessageGridRow(int messageResId) {
+ final CharSequence title = mContext.getText(messageResId);
+ return new GridRowBuilder()
+ // Add cells to the grid row.
+ .addCell(new GridRowBuilder.CellBuilder().addTitleText(title))
+ .setPrimaryAction(getPrimarySliceAction());
+ }
+
+ @Nullable
+ protected WifiSliceItem getConnectedWifiItem(List<WifiSliceItem> wifiList) {
+ if (wifiList == null) {
+ return null;
+ }
+ Optional<WifiSliceItem> item = wifiList.stream()
+ .filter(x -> x.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED)
+ .findFirst();
+ return item.isPresent() ? item.get() : null;
+ }
+
+ protected boolean hasCarrier() {
+ if (isAirplaneModeEnabled()
+ || mSubscriptionManager == null || mTelephonyManager == null
+ || mSubscriptionManager.getDefaultDataSubscriptionId()
+ == mSubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return false;
+ }
+ return true;
+ }
+
+ protected ListBuilder.RowBuilder createCarrierRow() {
+ final String title = getMobileTitle();
+ final String summary = getMobileSummary();
+ Drawable drawable = mContext.getDrawable(
+ R.drawable.ic_signal_strength_zero_bar_no_internet);
+ try {
+ drawable = getMobileDrawable(drawable);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ final IconCompat levelIcon = Utils.createIconWithDrawable(drawable);
+ final PendingIntent rowIntent = mSliceable.getBroadcastIntent(mContext);
+ final SliceAction primaryAction = SliceAction.create(rowIntent,
+ levelIcon, ListBuilder.ICON_IMAGE, title);
+ final SliceAction toggleAction = SliceAction.createToggle(rowIntent,
+ "mobile_toggle" /* actionTitle */, isMobileDataEnabled());
+ final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
+ .setTitle(title)
+ .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE)
+ .addEndItem(toggleAction)
+ .setPrimaryAction(primaryAction)
+ .setSubtitle(summary);
+ return rowBuilder;
+ }
+
+ protected SliceAction getPrimarySliceAction() {
+ return SliceAction.createDeeplink(
+ getPrimaryAction(),
+ Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT)),
+ ListBuilder.ICON_IMAGE, mContext.getText(R.string.summary_placeholder));
+ }
+
+ private PendingIntent getPrimaryAction() {
+ final Intent intent = new Intent("android.settings.NETWORK_PROVIDER_SETTINGS")
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */,
+ intent, PendingIntent.FLAG_IMMUTABLE /* flags */);
+ }
+
+ private boolean shouldInflateSignalStrength(int subId) {
+ return SignalStrengthUtil.shouldInflateSignalStrength(mContext, subId);
+ }
+
+ protected boolean isAirplaneModeEnabled() {
+ return WirelessUtils.isAirplaneModeOn(mContext);
+ }
+
+ protected boolean isMobileDataEnabled() {
+ if (mTelephonyManager == null) {
+ return false;
+ }
+ return mTelephonyManager.isDataEnabled();
+ }
+
+ protected boolean isDataSimActive() {
+ return MobileNetworkUtils.activeNetworkIsCellular(mContext);
+ }
+
+ protected boolean isNoCarrierData() {
+ if (mTelephonyManager == null) {
+ return false;
+ }
+ boolean mobileDataOnAndNoData = isMobileDataEnabled()
+ && mTelephonyManager.getDataState() != mTelephonyManager.DATA_CONNECTED;
+ ServiceState serviceState = mTelephonyManager.getServiceState();
+ boolean mobileDataOffAndOutOfService = !isMobileDataEnabled() && serviceState != null
+ && serviceState.getState() == serviceState.STATE_OUT_OF_SERVICE;
+ log("mobileDataOnAndNoData: " + mobileDataOnAndNoData
+ + ",mobileDataOffAndOutOfService: " + mobileDataOffAndOutOfService);
+ return mobileDataOnAndNoData || mobileDataOffAndOutOfService;
+ }
+
+ private boolean isAirplaneSafeNetworksModeEnabled() {
+ // TODO: isAirplaneSafeNetworksModeEnabled is not READY
+ return false;
+ }
+
+ @VisibleForTesting
+ Drawable getMobileDrawable(Drawable drawable) throws Throwable {
+ // set color and drawable
+ if (mTelephonyManager == null) {
+ log("mTelephonyManager == null");
+ return drawable;
+ }
+ if (!isNoCarrierData()) {
+ Semaphore lock = new Semaphore(0);
+ AtomicReference<Drawable> shared = new AtomicReference<>();
+ ThreadUtils.postOnMainThread(() -> {
+ shared.set(getDrawableWithSignalStrength());
+ lock.release();
+ });
+ lock.acquire();
+ drawable = shared.get();
+ }
+
+ if (isDataSimActive()) {
+ drawable.setTint(Utils.getColorAccentDefaultColor(mContext));
+ }
+ return drawable;
+ }
+
+ /**
+ * To get the signal bar icon with level.
+ *
+ * @return The Drawable which is a signal bar icon with level.
+ */
+ public Drawable getDrawableWithSignalStrength() {
+ final SignalStrength strength = mTelephonyManager.getSignalStrength();
+ int level = (strength == null) ? 0 : strength.getLevel();
+ int numLevels = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
+ if (mSubscriptionManager != null && shouldInflateSignalStrength(
+ mSubscriptionManager.getDefaultDataSubscriptionId())) {
+ level += 1;
+ numLevels += 1;
+ }
+ return MobileNetworkUtils.getSignalStrengthIcon(mContext, level, numLevels,
+ NO_CELL_DATA_TYPE_ICON, false);
+ }
+
+ private String getMobileSummary() {
+ String summary = "";
+ //TODO: get radio technology.
+ String networkType = "";
+ if (isDataSimActive()) {
+ summary = mContext.getString(R.string.preference_summary_default_combination,
+ mContext.getString(R.string.mobile_data_connection_active), networkType);
+ } else if (!isMobileDataEnabled()) {
+ summary = mContext.getString(R.string.mobile_data_off_summary);
+ }
+ return summary;
+ }
+
+ private String getMobileTitle() {
+ String title = mContext.getText(R.string.mobile_data_settings_title).toString();
+ if (mSubscriptionManager == null) {
+ return title;
+ }
+ final SubscriptionInfo defaultSubscription = mSubscriptionManager.getActiveSubscriptionInfo(
+ mSubscriptionManager.getDefaultDataSubscriptionId());
+ if (defaultSubscription != null) {
+ title = defaultSubscription.getDisplayName().toString();
+ }
+ return title;
+ }
+
+ protected SubscriptionManager getSubscriptionManager() {
+ return mSubscriptionManager;
+ }
+
+ private Set<String> getKeywords() {
+ final String keywords = mContext.getString(R.string.keywords_internet);
+ return Arrays.stream(TextUtils.split(keywords, ","))
+ .map(String::trim)
+ .collect(Collectors.toSet());
+ }
+}
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index 864078c..6e67543 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -21,10 +21,13 @@
import static com.android.settings.network.telephony.MobileNetworkUtils.NO_CELL_DATA_TYPE_ICON;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.provider.Settings;
+import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -46,6 +49,8 @@
import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.network.telephony.SignalStrengthListener;
+import com.android.settings.widget.GearPreference;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.net.SignalStrengthUtil;
@@ -55,9 +60,15 @@
import java.util.Set;
/**
- * This manages a set of Preferences it places into a PreferenceGroup owned by some parent
+ * If the provider model is not enabled, this controller manages a set of Preferences it places into
+ * a PreferenceGroup owned by some parent
* controller class - one for each available subscription. This controller is only considered
* available if there are 2 or more subscriptions.
+ *
+ * If the provider model is enabled, this controller manages preference with data subscription
+ * information and make its state display on preference.
+ * TODO this class will clean up the multiple subscriptions functionality after the provider
+ * model is released.
*/
public class SubscriptionsPreferenceController extends AbstractPreferenceController implements
LifecycleObserver, SubscriptionsChangeListener.SubscriptionsChangeListenerClient,
@@ -68,16 +79,31 @@
private UpdateListener mUpdateListener;
private String mPreferenceGroupKey;
private PreferenceGroup mPreferenceGroup;
- private SubscriptionManager mManager;
+ private TelephonyManager mTelephonyManager;
+ private SubscriptionManager mSubscriptionManager;
private SubscriptionsChangeListener mSubscriptionsListener;
private MobileDataEnabledListener mDataEnabledListener;
private DataConnectivityListener mConnectivityListener;
private SignalStrengthListener mSignalStrengthListener;
+ private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+ @VisibleForTesting
+ final BroadcastReceiver mDataSubscriptionChangedReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) {
+ update();
+ }
+ }
+ };
// Map of subscription id to Preference
private Map<Integer, Preference> mSubscriptionPreferences;
private int mStartOrder;
+ private GearPreference mSubsGearPref;
+
+ private SubsPrefCtrlInjector mSubsPrefCtrlInjector;
/**
* This interface lets a parent of this class know that some change happened - this could
* either be because overall availability changed, or because we've added/removed/updated some
@@ -107,21 +133,37 @@
mUpdateListener = updateListener;
mPreferenceGroupKey = preferenceGroupKey;
mStartOrder = startOrder;
- mManager = context.getSystemService(SubscriptionManager.class);
+ mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
mSubscriptionPreferences = new ArrayMap<>();
mSubscriptionsListener = new SubscriptionsChangeListener(context, this);
mDataEnabledListener = new MobileDataEnabledListener(context, this);
mConnectivityListener = new DataConnectivityListener(context, this);
mSignalStrengthListener = new SignalStrengthListener(context, this);
lifecycle.addObserver(this);
+ mSubsPrefCtrlInjector = createSubsPrefCtrlInjector();
+ }
+
+ private void registerDataSubscriptionChangedReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
+ mContext.registerReceiver(mDataSubscriptionChangedReceiver, filter);
+ }
+
+ private void unRegisterDataSubscriptionChangedReceiver() {
+ if (mDataSubscriptionChangedReceiver != null) {
+ mContext.unregisterReceiver(mDataSubscriptionChangedReceiver);
+ }
+
}
@OnLifecycleEvent(ON_RESUME)
public void onResume() {
mSubscriptionsListener.start();
- mDataEnabledListener.start(SubscriptionManager.getDefaultDataSubscriptionId());
+ mDataEnabledListener.start(mSubsPrefCtrlInjector.getDefaultDataSubscriptionId());
mConnectivityListener.start();
mSignalStrengthListener.resume();
+ registerDataSubscriptionChangedReceiver();
update();
}
@@ -131,6 +173,7 @@
mDataEnabledListener.stop();
mConnectivityListener.stop();
mSignalStrengthListener.pause();
+ unRegisterDataSubscriptionChangedReceiver();
}
@Override
@@ -143,29 +186,116 @@
if (mPreferenceGroup == null) {
return;
}
-
if (!isAvailable()) {
+ if (mSubsGearPref != null) {
+ mPreferenceGroup.removePreference(mSubsGearPref);
+ }
for (Preference pref : mSubscriptionPreferences.values()) {
mPreferenceGroup.removePreference(pref);
}
+
mSubscriptionPreferences.clear();
mSignalStrengthListener.updateSubscriptionIds(Collections.emptySet());
mUpdateListener.onChildrenUpdated();
return;
}
+ if (mSubsPrefCtrlInjector.isProviderModelEnabled(mContext)) {
+ updateForProvider();
+ } else {
+ updateForBase();
+ }
+ }
+
+ private void updateForProvider() {
+ SubscriptionInfo subInfo = mSubscriptionManager.getDefaultDataSubscriptionInfo();
+ if (subInfo == null) {
+ mPreferenceGroup.removeAll();
+ return;
+ }
+ if (mSubsGearPref == null) {
+ mPreferenceGroup.removeAll();
+ mSubsGearPref = new GearPreference(mContext, null);
+ mSubsGearPref.setOnPreferenceClickListener(preference -> {
+ connectCarrierNetwork();
+ return true;
+ });
+ mSubsGearPref.setOnGearClickListener(p ->
+ startMobileNetworkActivity(mContext, subInfo.getSubscriptionId()));
+ }
+
+ mSubsGearPref.setTitle(subInfo.getDisplayName());
+ mSubsGearPref.setOrder(mStartOrder);
+ //TODO(b/176141828) Wait for api provided by system ui.
+ mSubsGearPref.setSummary(getMobilePreferenceSummary());
+ mSubsGearPref.setIcon(getIcon(subInfo.getSubscriptionId()));
+ mPreferenceGroup.addPreference(mSubsGearPref);
+
+ final Set<Integer> activeDataSubIds = new ArraySet<>();
+ activeDataSubIds.add(subInfo.getSubscriptionId());
+ mSignalStrengthListener.updateSubscriptionIds(activeDataSubIds);
+ mUpdateListener.onChildrenUpdated();
+ }
+
+ private String getMobilePreferenceSummary() {
+ //TODO(b/176141828) Waiting for the api provided by system UI.
+ String result = "5G";
+ if (MobileNetworkUtils.activeNetworkIsCellular(mContext)) {
+ result = "Active, " + result;
+ }
+ return result;
+ }
+
+ private Drawable getIcon(int subId) {
+ final TelephonyManager tmForSubId = mTelephonyManager.createForSubscriptionId(subId);
+ final SignalStrength strength = tmForSubId.getSignalStrength();
+ int level = (strength == null) ? 0 : strength.getLevel();
+
+ int numLevels = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
+ if (shouldInflateSignalStrength(subId)) {
+ level += 1;
+ numLevels += 1;
+ }
+
+ final boolean isMobileDataOn = tmForSubId.isDataEnabled();
+ final boolean isActiveCellularNetwork =
+ mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext);
+ final boolean isMobileDataAccessible = tmForSubId.getDataState()
+ == TelephonyManager.DATA_CONNECTED;
+ final ServiceState serviceState = tmForSubId.getServiceState();
+ final boolean isVoiceOutOfService = (serviceState == null)
+ ? true
+ : (serviceState.getState() == ServiceState.STATE_OUT_OF_SERVICE);
+
+ Drawable icon = mSubsPrefCtrlInjector.getIcon(mContext, level, numLevels, false);
+
+ if (isActiveCellularNetwork) {
+ icon.setTint(Utils.getColorAccentDefaultColor(mContext));
+ return icon;
+ }
+ if ((isMobileDataOn && isMobileDataAccessible)
+ || (!isMobileDataOn && !isVoiceOutOfService)) {
+ return icon;
+ }
+
+ icon = mContext.getDrawable(R.drawable.ic_signal_strength_zero_bar_no_internet);
+ return icon;
+ }
+
+ private void updateForBase() {
final Map<Integer, Preference> existingPrefs = mSubscriptionPreferences;
mSubscriptionPreferences = new ArrayMap<>();
int order = mStartOrder;
final Set<Integer> activeSubIds = new ArraySet<>();
- final int dataDefaultSubId = SubscriptionManager.getDefaultDataSubscriptionId();
- for (SubscriptionInfo info : SubscriptionUtil.getActiveSubscriptions(mManager)) {
+ final int dataDefaultSubId = mSubsPrefCtrlInjector.getDefaultDataSubscriptionId();
+ for (SubscriptionInfo info :
+ SubscriptionUtil.getActiveSubscriptions(mSubscriptionManager)) {
final int subId = info.getSubscriptionId();
// Avoid from showing subscription(SIM)s which has been marked as hidden
// For example, only one subscription will be shown when there're multiple
// subscriptions with same group UUID.
- if (!isSubscriptionCanBeDisplayed(mContext, subId)) {
+ if (!mSubsPrefCtrlInjector.canSubscriptionBeDisplayed(mContext, subId)) {
continue;
}
activeSubIds.add(subId);
@@ -181,9 +311,7 @@
pref.setOrder(order++);
pref.setOnPreferenceClickListener(clickedPref -> {
- final Intent intent = new Intent(mContext, MobileNetworkActivity.class);
- intent.putExtra(Settings.EXTRA_SUB_ID, subId);
- mContext.startActivity(intent);
+ startMobileNetworkActivity(mContext, subId);
return true;
});
@@ -198,6 +326,12 @@
mUpdateListener.onChildrenUpdated();
}
+ private static void startMobileNetworkActivity(Context context, int subId) {
+ final Intent intent = new Intent(context, MobileNetworkActivity.class);
+ intent.putExtra(Settings.EXTRA_SUB_ID, subId);
+ context.startActivity(intent);
+ }
+
@VisibleForTesting
boolean shouldInflateSignalStrength(int subId) {
return SignalStrengthUtil.shouldInflateSignalStrength(mContext, subId);
@@ -214,14 +348,9 @@
level += 1;
numLevels += 1;
}
- final boolean showCutOut = !isDefaultForData || !mgr.isDataEnabled();
- pref.setIcon(getIcon(level, numLevels, showCutOut));
- }
- @VisibleForTesting
- Drawable getIcon(int level, int numLevels, boolean cutOut) {
- return MobileNetworkUtils.getSignalStrengthIcon(mContext, level, numLevels,
- NO_CELL_DATA_TYPE_ICON, cutOut);
+ final boolean showCutOut = !isDefaultForData || !mgr.isDataEnabled();
+ pref.setIcon(mSubsPrefCtrlInjector.getIcon(mContext, level, numLevels, showCutOut));
}
/**
@@ -236,8 +365,8 @@
* If a subscription isn't the default for anything, we just say it is available.
*/
protected String getSummary(int subId, boolean isDefaultForData) {
- final int callsDefaultSubId = SubscriptionManager.getDefaultVoiceSubscriptionId();
- final int smsDefaultSubId = SubscriptionManager.getDefaultSmsSubscriptionId();
+ final int callsDefaultSubId = mSubsPrefCtrlInjector.getDefaultVoiceSubscriptionId();
+ final int smsDefaultSubId = mSubsPrefCtrlInjector.getDefaultSmsSubscriptionId();
String line1 = null;
if (subId == callsDefaultSubId && subId == smsDefaultSubId) {
@@ -253,7 +382,7 @@
final TelephonyManager telMgrForSub = mContext.getSystemService(
TelephonyManager.class).createForSubscriptionId(subId);
final boolean dataEnabled = telMgrForSub.isDataEnabled();
- if (dataEnabled && MobileNetworkUtils.activeNetworkIsCellular(mContext)) {
+ if (dataEnabled && mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext)) {
line2 = mContext.getString(R.string.mobile_data_active);
} else if (!dataEnabled) {
line2 = mContext.getString(R.string.mobile_data_off);
@@ -274,14 +403,16 @@
}
/**
- * @return true if there are at least 2 available subscriptions.
+ * @return true if there are at least 2 available subscriptions,
+ * or if there is at least 1 available subscription for provider model.
*/
@Override
public boolean isAvailable() {
if (mSubscriptionsListener.isAirplaneModeOn()) {
return false;
}
- List<SubscriptionInfo> subInfoList = SubscriptionUtil.getActiveSubscriptions(mManager);
+ List<SubscriptionInfo> subInfoList =
+ SubscriptionUtil.getActiveSubscriptions(mSubscriptionManager);
if (subInfoList == null) {
return false;
}
@@ -290,8 +421,9 @@
// For example, only one subscription will be shown when there're multiple
// subscriptions with same group UUID.
.filter(subInfo ->
- isSubscriptionCanBeDisplayed(mContext, subInfo.getSubscriptionId()))
- .count() >= (Utils.isProviderModelEnabled(mContext) ? 1 : 2);
+ mSubsPrefCtrlInjector.canSubscriptionBeDisplayed(mContext,
+ subInfo.getSubscriptionId()))
+ .count() >= (mSubsPrefCtrlInjector.isProviderModelEnabled(mContext) ? 1 : 2);
}
@Override
@@ -307,7 +439,7 @@
@Override
public void onSubscriptionsChanged() {
// See if we need to change which sub id we're using to listen for enabled/disabled changes.
- int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ int defaultDataSubId = mSubsPrefCtrlInjector.getDefaultDataSubscriptionId();
if (defaultDataSubId != mDataEnabledListener.getSubId()) {
mDataEnabledListener.stop();
mDataEnabledListener.start(defaultDataSubId);
@@ -331,8 +463,83 @@
}
@VisibleForTesting
- boolean isSubscriptionCanBeDisplayed(Context context, int subId) {
+ boolean canSubscriptionBeDisplayed(Context context, int subId) {
return (SubscriptionUtil.getAvailableSubscription(context,
ProxySubscriptionManager.getInstance(context), subId) != null);
}
-}
+
+ public void setWifiPickerTrackerHelper(WifiPickerTrackerHelper helper) {
+ mWifiPickerTrackerHelper = helper;
+ }
+
+ @VisibleForTesting
+ public void connectCarrierNetwork() {
+ if (mTelephonyManager == null || !mTelephonyManager.isDataEnabled()) {
+ return;
+ }
+ if (mWifiPickerTrackerHelper != null) {
+ mWifiPickerTrackerHelper.connectCarrierNetwork(null /* ConnectCallback */);
+ }
+ }
+
+ SubsPrefCtrlInjector createSubsPrefCtrlInjector() {
+ return new SubsPrefCtrlInjector();
+ }
+
+ /**
+ * To inject necessary data from each static api.
+ */
+ @VisibleForTesting
+ public static class SubsPrefCtrlInjector {
+ /**
+ * Use to inject function and value for class and test class.
+ */
+ public boolean canSubscriptionBeDisplayed(Context context, int subId) {
+ return (SubscriptionUtil.getAvailableSubscription(context,
+ ProxySubscriptionManager.getInstance(context), subId) != null);
+ }
+
+ /**
+ * Check SIM be able to display on UI.
+ */
+ public int getDefaultSmsSubscriptionId() {
+ return SubscriptionManager.getDefaultSmsSubscriptionId();
+ }
+
+ /**
+ * Get default voice subscription ID.
+ */
+ public int getDefaultVoiceSubscriptionId() {
+ return SubscriptionManager.getDefaultVoiceSubscriptionId();
+ }
+
+ /**
+ * Get default data subscription ID.
+ */
+ public int getDefaultDataSubscriptionId() {
+ return SubscriptionManager.getDefaultDataSubscriptionId();
+ }
+
+ /**
+ * Confirm the current network is cellular and active.
+ */
+ public boolean isActiveCellularNetwork(Context context) {
+ return MobileNetworkUtils.activeNetworkIsCellular(context);
+ }
+
+ /**
+ * Confirm the flag of Provider Model switch is turned on or not.
+ */
+ public boolean isProviderModelEnabled(Context context) {
+ return Utils.isProviderModelEnabled(context);
+ }
+
+ /**
+ * Get signal icon with different signal level.
+ */
+ public Drawable getIcon(Context context, int level, int numLevels, boolean cutOut) {
+ return MobileNetworkUtils.getSignalStrengthIcon(context, level, numLevels,
+ NO_CELL_DATA_TYPE_ICON, cutOut);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceController.java b/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceController.java
index 6eebe6b..eead41f 100644
--- a/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceController.java
+++ b/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceController.java
@@ -98,8 +98,11 @@
@Override
public int getAvailabilityStatus(int subId) {
PersistableBundle bundle = mCarrierConfigManager.getConfigForSubId(subId);
- boolean shouldShowPresence = bundle != null && bundle.getBoolean(
- CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false /*default*/);
+ boolean shouldShowPresence = bundle != null
+ && (bundle.getBoolean(
+ CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false /*default*/)
+ || bundle.getBoolean(
+ CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, false /*default*/));
return shouldShowPresence ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
diff --git a/src/com/android/settings/network/telephony/DeleteEuiccSubscriptionDialogActivity.java b/src/com/android/settings/network/telephony/DeleteEuiccSubscriptionDialogActivity.java
index 6186de3..8257bf3 100644
--- a/src/com/android/settings/network/telephony/DeleteEuiccSubscriptionDialogActivity.java
+++ b/src/com/android/settings/network/telephony/DeleteEuiccSubscriptionDialogActivity.java
@@ -54,7 +54,6 @@
private DeleteEuiccSubscriptionSidecar mDeleteEuiccSubscriptionSidecar;
private List<SubscriptionInfo> mSubscriptionsToBeDeleted;
private SubscriptionInfo mSubscriptionToBeDeleted;
- private AlertDialog mDeleteSimConfirmDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -65,14 +64,14 @@
mSubscriptionToBeDeleted = SubscriptionUtil.getSubById(mSubscriptionManager, subId);
mSubscriptionsToBeDeleted =
SubscriptionUtil.findAllSubscriptionsInGroup(mSubscriptionManager, subId);
- mDeleteEuiccSubscriptionSidecar = DeleteEuiccSubscriptionSidecar.get(getFragmentManager());
- if (mSubscriptionToBeDeleted == null || mDeleteEuiccSubscriptionSidecar == null) {
+ if (mSubscriptionToBeDeleted == null || mSubscriptionsToBeDeleted.isEmpty()) {
Log.e(TAG, "Cannot find subscription with sub ID: " + subId);
finish();
return;
}
+ mDeleteEuiccSubscriptionSidecar = DeleteEuiccSubscriptionSidecar.get(getFragmentManager());
if (savedInstanceState == null) {
showDeleteSimConfirmDialog();
}
diff --git a/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java b/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java
index d2eab3e..158becc 100644
--- a/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java
+++ b/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java
@@ -270,7 +270,7 @@
final Intent intent = new Intent(action);
intent.setClass(mContext, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
/**
@@ -287,7 +287,8 @@
final Intent intent = new Intent(action);
intent.setPackage(SETTINGS_PACKAGE_NAME);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
}
@VisibleForTesting
diff --git a/src/com/android/settings/network/telephony/EuiccOperationSidecar.java b/src/com/android/settings/network/telephony/EuiccOperationSidecar.java
index 3bda9c5..c82220e 100644
--- a/src/com/android/settings/network/telephony/EuiccOperationSidecar.java
+++ b/src/com/android/settings/network/telephony/EuiccOperationSidecar.java
@@ -105,7 +105,7 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mEuiccManager = (EuiccManager) getContext().getSystemService(Context.EUICC_SERVICE);
+ mEuiccManager = getContext().getSystemService(EuiccManager.class);
getContext()
.getApplicationContext()
diff --git a/src/com/android/settings/network/telephony/MobileDataDialogFragment.java b/src/com/android/settings/network/telephony/MobileDataDialogFragment.java
index c8a1e98..180d503 100644
--- a/src/com/android/settings/network/telephony/MobileDataDialogFragment.java
+++ b/src/com/android/settings/network/telephony/MobileDataDialogFragment.java
@@ -28,6 +28,7 @@
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
/**
@@ -50,6 +51,8 @@
private int mType;
private int mSubId;
+ private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+
public static MobileDataDialogFragment newInstance(int type, int subId) {
final MobileDataDialogFragment dialogFragment = new MobileDataDialogFragment();
@@ -65,6 +68,8 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSubscriptionManager = getContext().getSystemService(SubscriptionManager.class);
+ mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(getSettingsLifecycle(), getContext(),
+ null /* WifiPickerTrackerCallback */);
}
@Override
@@ -124,11 +129,17 @@
case TYPE_DISABLE_DIALOG:
MobileNetworkUtils.setMobileDataEnabled(getContext(), mSubId, false /* enabled */,
false /* disableOtherSubscriptions */);
+ if (mWifiPickerTrackerHelper != null) {
+ mWifiPickerTrackerHelper.setCarrierNetworkEnabled(false);
+ }
break;
case TYPE_MULTI_SIM_DIALOG:
mSubscriptionManager.setDefaultDataSubId(mSubId);
MobileNetworkUtils.setMobileDataEnabled(getContext(), mSubId, true /* enabled */,
true /* disableOtherSubscriptions */);
+ if (mWifiPickerTrackerHelper != null) {
+ mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true);
+ }
break;
default:
throw new IllegalArgumentException("unknown type " + mType);
diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
index 91c46df..78bc0a0 100644
--- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
+++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
@@ -32,6 +32,7 @@
import com.android.settings.R;
import com.android.settings.network.MobileDataContentObserver;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -54,6 +55,8 @@
@VisibleForTesting
boolean mNeedDialog;
+ private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+
public MobileDataPreferenceController(Context context, String key) {
super(context, key);
mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
@@ -107,6 +110,9 @@
if (!mNeedDialog) {
// Update data directly if we don't need dialog
MobileNetworkUtils.setMobileDataEnabled(mContext, mSubId, isChecked, false);
+ if (mWifiPickerTrackerHelper != null) {
+ mWifiPickerTrackerHelper.setCarrierNetworkEnabled(isChecked);
+ }
return true;
}
@@ -149,6 +155,10 @@
.createForSubscriptionId(mSubId);
}
+ public void setWifiPickerTrackerHelper(WifiPickerTrackerHelper helper) {
+ mWifiPickerTrackerHelper = helper;
+ }
+
@VisibleForTesting
boolean isDialogNeeded() {
final boolean enableData = !isChecked();
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 2a11521..7c45949 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -43,6 +43,7 @@
import com.android.settings.network.telephony.gsm.AutoSelectPreferenceController;
import com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.utils.ThreadUtils;
@@ -147,6 +148,9 @@
use(DisableSimFooterPreferenceController.class).init(mSubId);
use(NrDisabledInDsdsFooterPreferenceController.class).init(mSubId);
use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId);
+ use(MobileDataPreferenceController.class).setWifiPickerTrackerHelper(
+ new WifiPickerTrackerHelper(getSettingsLifecycle(), context,
+ null /* WifiPickerTrackerCallback */));
use(RoamingPreferenceController.class).init(getFragmentManager(), mSubId);
use(ApnPreferenceController.class).init(mSubId);
use(CarrierPreferenceController.class).init(mSubId);
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index b300c66..87b4ef5 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -204,7 +204,10 @@
return false;
}
PersistableBundle bundle = carrierConfigManager.getConfigForSubId(subId);
- return bundle.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false /*default*/);
+ return bundle.getBoolean(
+ CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false /*default*/)
+ || bundle.getBoolean(CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL,
+ false /*default*/);
}
public static Intent buildPhoneAccountConfigureIntent(
diff --git a/src/com/android/settings/network/telephony/NetworkProviderWorker.java b/src/com/android/settings/network/telephony/NetworkProviderWorker.java
new file mode 100644
index 0000000..bc82901
--- /dev/null
+++ b/src/com/android/settings/network/telephony/NetworkProviderWorker.java
@@ -0,0 +1,234 @@
+/*
+ * 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 android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyDisplayInfo;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.network.MobileDataContentObserver;
+import com.android.settings.network.MobileDataEnabledListener;
+import com.android.settings.network.SubscriptionsChangeListener;
+import com.android.settings.wifi.slice.WifiScanWorker;
+
+import java.util.Collections;
+import java.util.concurrent.Executor;
+
+
+/**
+ * BackgroundWorker for Provider Model slice.
+ */
+public class NetworkProviderWorker extends WifiScanWorker implements
+ SignalStrengthListener.Callback, MobileDataEnabledListener.Client,
+ DataConnectivityListener.Client,
+ SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
+ private static final String TAG = "NetworkProviderWorker";
+ private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 4;
+ private DataContentObserver mMobileDataObserver;
+ private SignalStrengthListener mSignalStrengthListener;
+ private SubscriptionsChangeListener mSubscriptionsListener;
+ private MobileDataEnabledListener mDataEnabledListener;
+ private DataConnectivityListener mConnectivityListener;
+
+ private final Context mContext;
+ @VisibleForTesting
+ final PhoneStateListener mPhoneStateListener;
+ private final SubscriptionManager mSubscriptionManager;
+ private final TelephonyManager mTelephonyManager;
+
+ public NetworkProviderWorker(Context context, Uri uri) {
+ super(context, uri);
+ // Mobile data worker
+ final Handler handler = new Handler(Looper.getMainLooper());
+ mMobileDataObserver = new DataContentObserver(handler, this);
+
+ mContext = context;
+ mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
+ mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+
+ mPhoneStateListener = new NetworkProviderPhoneStateListener(handler::post);
+ mSubscriptionsListener = new SubscriptionsChangeListener(context, this);
+ mDataEnabledListener = new MobileDataEnabledListener(context, this);
+ mConnectivityListener = new DataConnectivityListener(context, this);
+ mSignalStrengthListener = new SignalStrengthListener(context, this);
+ }
+
+ @Override
+ protected void onSlicePinned() {
+ mMobileDataObserver.register(mContext,
+ getDefaultSubscriptionId(mSubscriptionManager));
+
+ mSubscriptionsListener.start();
+ mDataEnabledListener.start(SubscriptionManager.getDefaultDataSubscriptionId());
+ mConnectivityListener.start();
+ mSignalStrengthListener.resume();
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE
+ | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE
+ | PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED);
+
+ super.onSlicePinned();
+ }
+
+ @Override
+ protected void onSliceUnpinned() {
+ mMobileDataObserver.unregister(mContext);
+ mSubscriptionsListener.stop();
+ mDataEnabledListener.stop();
+ mConnectivityListener.stop();
+ mSignalStrengthListener.pause();
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ super.onSliceUnpinned();
+ }
+
+ @Override
+ public void close() {
+ mMobileDataObserver = null;
+ super.close();
+ }
+
+ @Override
+ public int getApRowCount() {
+ return PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT;
+ }
+
+ /**
+ * To update the Slice.
+ */
+ public void updateSlice() {
+ notifySliceChange();
+ }
+
+ @Override
+ public void onSubscriptionsChanged() {
+ int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ Log.d(TAG, "onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId);
+
+ mSignalStrengthListener.updateSubscriptionIds(
+ SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)
+ ? Collections.singleton(defaultDataSubId) : Collections.emptySet());
+ if (defaultDataSubId != mDataEnabledListener.getSubId()) {
+ mDataEnabledListener.stop();
+ mDataEnabledListener.start(defaultDataSubId);
+ }
+ updateSlice();
+ }
+
+ @Override
+ public void onSignalStrengthChanged() {
+ Log.d(TAG, "onSignalStrengthChanged");
+ updateSlice();
+ }
+
+ @Override
+ public void onAirplaneModeChanged(boolean airplaneModeEnabled) {
+ Log.d(TAG, "onAirplaneModeChanged");
+ updateSlice();
+ }
+
+ @Override
+ public void onMobileDataEnabledChange() {
+ Log.d(TAG, "onMobileDataEnabledChange");
+ updateSlice();
+ }
+
+ @Override
+ public void onDataConnectivityChange() {
+ Log.d(TAG, "onDataConnectivityChange");
+ updateSlice();
+ }
+
+ /**
+ * Listen to update of mobile data change.
+ */
+ public class DataContentObserver extends ContentObserver {
+ private final NetworkProviderWorker mNetworkProviderWorker;
+
+ public DataContentObserver(Handler handler, NetworkProviderWorker backgroundWorker) {
+ super(handler);
+ mNetworkProviderWorker = backgroundWorker;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mNetworkProviderWorker.updateSlice();
+ }
+
+ /**
+ * To register the observer for mobile data changed.
+ * @param context the Context object.
+ * @param subId the default data subscription id.
+ */
+ public void register(Context context, int subId) {
+ final Uri uri = MobileDataContentObserver.getObservableUri(context, subId);
+ context.getContentResolver().registerContentObserver(uri, false, this);
+ }
+
+ /**
+ * To unregister the observer for mobile data changed.
+ * @param context the Context object.
+ */
+ public void unregister(Context context) {
+ context.getContentResolver().unregisterContentObserver(this);
+ }
+ }
+
+ class NetworkProviderPhoneStateListener extends PhoneStateListener {
+ NetworkProviderPhoneStateListener(Executor executor) {
+ super(executor);
+ }
+
+ @Override
+ public void onServiceStateChanged(ServiceState state) {
+ Log.d(TAG, "onServiceStateChanged voiceState=" + state.getState()
+ + " dataState=" + state.getDataRegistrationState());
+ updateSlice();
+ }
+
+ @Override
+ public void onActiveDataSubscriptionIdChanged(int subId) {
+ Log.d(TAG, "onActiveDataSubscriptionIdChanged: subId=" + subId);
+ updateSlice();
+ }
+
+ @Override
+ public void onDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) {
+ Log.d(TAG, "onDisplayInfoChanged: telephonyDisplayInfo=" + telephonyDisplayInfo);
+ updateSlice();
+ }
+ }
+
+ protected static int getDefaultSubscriptionId(SubscriptionManager subscriptionManager) {
+ final SubscriptionInfo defaultSubscription = subscriptionManager.getActiveSubscriptionInfo(
+ subscriptionManager.getDefaultDataSubscriptionId());
+
+ if (defaultSubscription == null) {
+ return SubscriptionManager.INVALID_SUBSCRIPTION_ID; // No default subscription
+ }
+ return defaultSubscription.getSubscriptionId();
+ }
+}
diff --git a/src/com/android/settings/notification/AssistantFeedbackPreferenceController.java b/src/com/android/settings/notification/AssistantFeedbackPreferenceController.java
index 1566ae9..491fd8b 100644
--- a/src/com/android/settings/notification/AssistantFeedbackPreferenceController.java
+++ b/src/com/android/settings/notification/AssistantFeedbackPreferenceController.java
@@ -23,11 +23,13 @@
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
+import android.provider.DeviceConfig;
import android.provider.Settings;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -77,13 +79,15 @@
@Override
public int getAvailabilityStatus() {
- return AVAILABLE;
+ return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.ENABLE_NAS_FEEDBACK, false)
+ ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public boolean isChecked() {
return Settings.Global.getInt(mContext.getContentResolver(),
- NOTIFICATION_FEEDBACK_ENABLED, OFF) == ON;
+ NOTIFICATION_FEEDBACK_ENABLED, ON) == ON;
}
@Override
diff --git a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java
index 5a6ff7e..06c74bc 100644
--- a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java
+++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java
@@ -1,9 +1,14 @@
package com.android.settings.notification.history;
+import static android.view.HapticFeedbackConstants.CLOCK_TICK;
+
import android.annotation.Nullable;
import android.content.Context;
+import android.graphics.Canvas;
import android.util.AttributeSet;
+import android.view.View;
+import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
@@ -15,6 +20,9 @@
private OnItemSwipeDeleteListener listener;
+ /** The amount of horizontal displacement caused by user's action, used to track the swiping. */
+ private float dXLast;
+
public NotificationHistoryRecyclerView(Context context) {
this(context, null);
}
@@ -57,6 +65,27 @@
listener.onItemSwipeDeleted(viewHolder.getAdapterPosition());
}
}
+
+ /** Performs haptic effect once the swiping goes past a certain location. */
+ @Override
+ public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
+ @NonNull ViewHolder viewHolder, float dX, float dY, int actionState,
+ boolean isCurrentlyActive) {
+ super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+ if (isCurrentlyActive) {
+ View view = viewHolder.itemView;
+ float swipeThreshold = getSwipeThreshold(viewHolder);
+ float snapOffset = swipeThreshold * view.getWidth();
+ boolean snapIntoNewLocation = dX < -snapOffset || dX > snapOffset;
+ boolean snapIntoNewLocationLast = dXLast < -snapOffset || dXLast > snapOffset;
+ if (snapIntoNewLocation != snapIntoNewLocationLast) {
+ view.performHapticFeedback(CLOCK_TICK);
+ }
+ dXLast = dX;
+ } else {
+ dXLast = 0;
+ }
+ }
}
public interface OnItemSwipeDeleteListener {
diff --git a/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java b/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java
index 6fa446b..02e4015 100644
--- a/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java
+++ b/src/com/android/settings/notification/zen/AbstractZenModePreferenceController.java
@@ -84,7 +84,10 @@
mScreen = screen;
Preference pref = screen.findPreference(KEY);
if (pref != null) {
- mSettingObserver = new SettingObserver(pref);
+ if (mSettingObserver == null) {
+ mSettingObserver = new SettingObserver();
+ }
+ mSettingObserver.setPreference(pref);
}
}
@@ -128,10 +131,13 @@
private final Uri ZEN_MODE_DURATION_URI = Settings.Secure.getUriFor(
Settings.Secure.ZEN_DURATION);
- private final Preference mPreference;
+ private Preference mPreference;
- public SettingObserver(Preference preference) {
+ public SettingObserver() {
super(new Handler());
+ }
+
+ public void setPreference(Preference preference) {
mPreference = preference;
}
diff --git a/src/com/android/settings/notification/zen/ZenCustomRadioButtonPreference.java b/src/com/android/settings/notification/zen/ZenCustomRadioButtonPreference.java
deleted file mode 100644
index 57f4891..0000000
--- a/src/com/android/settings/notification/zen/ZenCustomRadioButtonPreference.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.notification.zen;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.RadioButton;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settingslib.TwoTargetPreference;
-
-/**
- * A radio button preference with a divider and a settings icon that links to another screen.
- */
-public class ZenCustomRadioButtonPreference extends TwoTargetPreference
- implements View.OnClickListener {
-
- private RadioButton mButton;
- private boolean mChecked;
-
- private OnGearClickListener mOnGearClickListener;
- private OnRadioButtonClickListener mOnRadioButtonClickListener;
-
- public ZenCustomRadioButtonPreference(Context context, AttributeSet attrs,
- int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- setLayoutResource(R.layout.preference_two_target_radio);
- }
-
- public ZenCustomRadioButtonPreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- setLayoutResource(R.layout.preference_two_target_radio);
- }
-
- public ZenCustomRadioButtonPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- setLayoutResource(R.layout.preference_two_target_radio);
- }
-
- public ZenCustomRadioButtonPreference(Context context) {
- super(context);
- setLayoutResource(R.layout.preference_two_target_radio);
- }
-
- @Override
- protected int getSecondTargetResId() {
- return R.layout.preference_widget_gear;
- }
-
- public void setOnGearClickListener(OnGearClickListener l) {
- mOnGearClickListener = l;
- notifyChanged();
- }
-
- public void setOnRadioButtonClickListener(OnRadioButtonClickListener l) {
- mOnRadioButtonClickListener = l;
- notifyChanged();
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- View buttonFrame = holder.findViewById(R.id.checkbox_frame);
- if (buttonFrame != null) {
- buttonFrame.setOnClickListener(this);
- }
- mButton = (RadioButton) holder.findViewById(android.R.id.checkbox);
- if (mButton != null) {
- mButton.setChecked(mChecked);
- }
-
- final View gear = holder.findViewById(android.R.id.widget_frame);
- final View divider = holder.findViewById(R.id.two_target_divider);
- if (mOnGearClickListener != null) {
- divider.setVisibility(View.VISIBLE);
- gear.setVisibility(View.VISIBLE);
- gear.setOnClickListener(this);
- } else {
- divider.setVisibility(View.GONE);
- gear.setVisibility(View.GONE);
- gear.setOnClickListener(null);
- }
- }
-
- public boolean isChecked() {
- return mButton != null && mChecked;
- }
-
- public void setChecked(boolean checked) {
- mChecked = checked;
- if (mButton != null) {
- mButton.setChecked(checked);
- }
- }
-
- public RadioButton getRadioButton() {
- return mButton;
- }
-
- @Override
- public void onClick() {
- if (mOnRadioButtonClickListener != null) {
- mOnRadioButtonClickListener.onRadioButtonClick(this);
- }
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == android.R.id.widget_frame) {
- if (mOnGearClickListener != null) {
- mOnGearClickListener.onGearClick(this);
- }
- } else if (v.getId() == R.id.checkbox_frame) {
- if (mOnRadioButtonClickListener != null) {
- mOnRadioButtonClickListener.onRadioButtonClick(this);
- }
- }
- }
-
- public interface OnGearClickListener {
- void onGearClick(ZenCustomRadioButtonPreference p);
- }
-
- public interface OnRadioButtonClickListener {
- void onRadioButtonClick(ZenCustomRadioButtonPreference p);
- }
-}
diff --git a/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java b/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java
index e77f4ea..5afe0b6 100644
--- a/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java
@@ -16,9 +16,6 @@
package com.android.settings.notification.zen;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_GONE;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_SETTING;
-
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -37,7 +34,6 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.notification.NotificationBackend;
import com.android.settings.notification.app.ConversationListSettings;
-import com.android.settings.widget.RadioButtonPreferenceWithExtraWidget;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.RadioButtonPreference;
@@ -186,13 +182,10 @@
}
private RadioButtonPreference makeRadioPreference(String key, int titleId) {
- RadioButtonPreferenceWithExtraWidget pref =
- new RadioButtonPreferenceWithExtraWidget(mPreferenceCategory.getContext());
+ final RadioButtonPreference pref =
+ new RadioButtonPreference(mPreferenceCategory.getContext());
if (KEY_ALL.equals(key) || KEY_IMPORTANT.equals(key)) {
pref.setExtraWidgetOnClickListener(mConversationSettingsWidgetClickListener);
- pref.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_SETTING);
- } else {
- pref.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_GONE);
}
pref.setKey(key);
pref.setTitle(titleId);
diff --git a/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java b/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java
index abf2ced..482865c 100644
--- a/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java
@@ -19,9 +19,6 @@
import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_CALLS;
import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_GONE;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_SETTING;
-
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
@@ -35,7 +32,6 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.widget.RadioButtonPreferenceWithExtraWidget;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.RadioButtonPreference;
@@ -67,7 +63,7 @@
private final boolean mIsMessages; // if this is false, then this preference is for calls
private PreferenceCategory mPreferenceCategory;
- private List<RadioButtonPreferenceWithExtraWidget> mRadioButtonPreferences = new ArrayList<>();
+ private List<RadioButtonPreference> mRadioButtonPreferences = new ArrayList<>();
public ZenModePrioritySendersPreferenceController(Context context, String key,
Lifecycle lifecycle, boolean isMessages) {
@@ -114,7 +110,7 @@
public void updateState(Preference preference) {
final int currSetting = getPrioritySenders();
- for (RadioButtonPreferenceWithExtraWidget pref : mRadioButtonPreferences) {
+ for (RadioButtonPreference pref : mRadioButtonPreferences) {
pref.setChecked(keyToSetting(pref.getKey()) == currSetting);
}
}
@@ -126,7 +122,7 @@
}
private void updateSummaries() {
- for (RadioButtonPreferenceWithExtraWidget pref : mRadioButtonPreferences) {
+ for (RadioButtonPreference pref : mRadioButtonPreferences) {
pref.setSummary(getSummary(pref.getKey()));
}
}
@@ -169,9 +165,9 @@
}
}
- private RadioButtonPreferenceWithExtraWidget makeRadioPreference(String key, int titleId) {
- RadioButtonPreferenceWithExtraWidget pref =
- new RadioButtonPreferenceWithExtraWidget(mPreferenceCategory.getContext());
+ private RadioButtonPreference makeRadioPreference(String key, int titleId) {
+ final RadioButtonPreference pref =
+ new RadioButtonPreference(mPreferenceCategory.getContext());
pref.setKey(key);
pref.setTitle(titleId);
pref.setOnClickListener(mRadioButtonClickListener);
@@ -179,9 +175,6 @@
View.OnClickListener widgetClickListener = getWidgetClickListener(key);
if (widgetClickListener != null) {
pref.setExtraWidgetOnClickListener(widgetClickListener);
- pref.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_SETTING);
- } else {
- pref.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_GONE);
}
mPreferenceCategory.addPreference(pref);
diff --git a/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceController.java
index f729be8..735ce79 100644
--- a/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceController.java
@@ -24,12 +24,13 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenModeVisEffectsAllPreferenceController
extends AbstractZenModePreferenceController
- implements ZenCustomRadioButtonPreference.OnRadioButtonClickListener {
+ implements RadioButtonPreference.OnClickListener {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
protected static final int EFFECTS = Policy.SUPPRESSED_EFFECT_SCREEN_OFF
| Policy.SUPPRESSED_EFFECT_SCREEN_ON
@@ -50,7 +51,7 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnRadioButtonClickListener(this);
+ mPreference.setOnClickListener(this);
}
@Override
@@ -68,7 +69,7 @@
}
@Override
- public void onRadioButtonClick(ZenCustomRadioButtonPreference p) {
+ public void onRadioButtonClicked(RadioButtonPreference p) {
mMetricsFeatureProvider.action(mContext,
SettingsEnums.ACTION_ZEN_SOUND_AND_VIS_EFFECTS, true);
mBackend.saveVisualEffectsPolicy(EFFECTS, true);
diff --git a/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceController.java
index a772eb5..535dca3 100644
--- a/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceController.java
@@ -26,11 +26,12 @@
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenModeVisEffectsCustomPreferenceController
extends AbstractZenModePreferenceController {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
protected static final int INTERRUPTIVE_EFFECTS =
NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT
@@ -53,12 +54,11 @@
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnGearClickListener(p -> {
+ mPreference.setExtraWidgetOnClickListener(p -> {
launchCustomSettings();
-
});
- mPreference.setOnRadioButtonClickListener(p -> {
+ mPreference.setOnClickListener(p -> {
launchCustomSettings();
});
}
diff --git a/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceController.java b/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceController.java
index 84037b9..8723ea8 100644
--- a/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceController.java
@@ -24,12 +24,13 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenModeVisEffectsNonePreferenceController
extends AbstractZenModePreferenceController
- implements ZenCustomRadioButtonPreference.OnRadioButtonClickListener {
+ implements RadioButtonPreference.OnClickListener {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
protected static final int EFFECTS = Policy.SUPPRESSED_EFFECT_SCREEN_OFF
| Policy.SUPPRESSED_EFFECT_SCREEN_ON
@@ -50,7 +51,7 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnRadioButtonClickListener(this);
+ mPreference.setOnClickListener(this);
}
@Override
@@ -67,7 +68,7 @@
}
@Override
- public void onRadioButtonClick(ZenCustomRadioButtonPreference preference) {
+ public void onRadioButtonClicked(RadioButtonPreference preference) {
mMetricsFeatureProvider.action(mContext,
SettingsEnums.ACTION_ZEN_SOUND_ONLY, true);
mBackend.saveVisualEffectsPolicy(EFFECTS, false);
diff --git a/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceController.java b/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceController.java
index 56b98ff..2cf8679 100644
--- a/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceController.java
@@ -25,11 +25,12 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenRuleCustomPolicyPreferenceController extends
AbstractZenCustomRulePreferenceController {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
public ZenRuleCustomPolicyPreferenceController(Context context, Lifecycle lifecycle,
String key) {
@@ -41,13 +42,12 @@
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnGearClickListener(p -> {
+ mPreference.setExtraWidgetOnClickListener(p -> {
setCustomPolicy();
launchCustomSettings();
-
});
- mPreference.setOnRadioButtonClickListener(p -> {
+ mPreference.setOnClickListener(p -> {
setCustomPolicy();
launchCustomSettings();
});
diff --git a/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceController.java b/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceController.java
index 268156b..372f152 100644
--- a/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceController.java
@@ -26,11 +26,12 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenRuleDefaultPolicyPreferenceController extends
AbstractZenCustomRulePreferenceController implements PreferenceControllerMixin {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
public ZenRuleDefaultPolicyPreferenceController(Context context, Lifecycle lifecycle,
String key) {
@@ -42,7 +43,7 @@
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnRadioButtonClickListener(p -> {
+ mPreference.setOnClickListener(p -> {
mRule.setZenPolicy(null);
mBackend.updateZenRule(mId, mRule);
});
diff --git a/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceController.java b/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceController.java
index fb46209..6e9152f 100644
--- a/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceController.java
@@ -27,11 +27,12 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenRuleVisEffectsAllPreferenceController extends
AbstractZenCustomRulePreferenceController implements PreferenceControllerMixin {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
public ZenRuleVisEffectsAllPreferenceController(Context context, Lifecycle lifecycle,
String key) {
@@ -43,7 +44,7 @@
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnRadioButtonClickListener(p -> {
+ mPreference.setOnClickListener(p -> {
mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ZEN_SOUND_ONLY,
Pair.create(MetricsProto.MetricsEvent.FIELD_ZEN_RULE_ID, mId));
mRule.setZenPolicy(new ZenPolicy.Builder(mRule.getZenPolicy())
diff --git a/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceController.java b/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceController.java
index 68ab818..d7c5f86 100644
--- a/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceController.java
@@ -27,11 +27,12 @@
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenRuleVisEffectsCustomPreferenceController extends
AbstractZenCustomRulePreferenceController implements PreferenceControllerMixin {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
public ZenRuleVisEffectsCustomPreferenceController(Context context, Lifecycle lifecycle,
String key) {
@@ -43,12 +44,12 @@
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnGearClickListener(p -> {
+ mPreference.setOnClickListener(p -> {
launchCustomSettings();
});
- mPreference.setOnRadioButtonClickListener(p -> {
+ mPreference.setExtraWidgetOnClickListener(p -> {
launchCustomSettings();
});
}
diff --git a/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceController.java b/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceController.java
index cb3e690..5484ed5 100644
--- a/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceController.java
@@ -27,11 +27,12 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
public class ZenRuleVisEffectsNonePreferenceController extends
AbstractZenCustomRulePreferenceController implements PreferenceControllerMixin {
- private ZenCustomRadioButtonPreference mPreference;
+ private RadioButtonPreference mPreference;
public ZenRuleVisEffectsNonePreferenceController(Context context, Lifecycle lifecycle,
String key) {
@@ -43,7 +44,7 @@
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
- mPreference.setOnRadioButtonClickListener(p -> {
+ mPreference.setOnClickListener(p -> {
mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ZEN_SOUND_AND_VIS_EFFECTS,
Pair.create(MetricsProto.MetricsEvent.FIELD_ZEN_RULE_ID, mId));
mRule.setZenPolicy(new ZenPolicy.Builder(mRule.getZenPolicy())
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index b9aa68a..a15075e 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -41,6 +41,7 @@
import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.slices.SlicesFeatureProvider;
import com.android.settings.users.UserFeatureProvider;
+import com.android.settings.wifi.WifiTrackerLibProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
@@ -143,6 +144,11 @@
public abstract FaceFeatureProvider getFaceFeatureProvider();
+ /**
+ * Gets implementation for the WifiTrackerLib.
+ */
+ public abstract WifiTrackerLibProvider getWifiTrackerLibProvider();
+
public static final class FactoryNotFoundException extends RuntimeException {
public FactoryNotFoundException(Throwable throwable) {
super("Unable to create factory. Did you misconfigure Proguard?", throwable);
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index d4d396f..ebbe87c 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -62,6 +62,8 @@
import com.android.settings.slices.SlicesFeatureProviderImpl;
import com.android.settings.users.UserFeatureProvider;
import com.android.settings.users.UserFeatureProviderImpl;
+import com.android.settings.wifi.WifiTrackerLibProvider;
+import com.android.settings.wifi.WifiTrackerLibProviderImpl;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
@@ -90,6 +92,7 @@
private BluetoothFeatureProvider mBluetoothFeatureProvider;
private AwareFeatureProvider mAwareFeatureProvider;
private FaceFeatureProvider mFaceFeatureProvider;
+ private WifiTrackerLibProvider mWifiTrackerLibProvider;
@Override
public SupportFeatureProvider getSupportFeatureProvider(Context context) {
@@ -278,4 +281,12 @@
}
return mFaceFeatureProvider;
}
+
+ @Override
+ public WifiTrackerLibProvider getWifiTrackerLibProvider() {
+ if (mWifiTrackerLibProvider == null) {
+ mWifiTrackerLibProvider = new WifiTrackerLibProviderImpl();
+ }
+ return mWifiTrackerLibProvider;
+ }
}
diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java
index 6ae7089..312bf75 100644
--- a/src/com/android/settings/panel/InternetConnectivityPanel.java
+++ b/src/com/android/settings/panel/InternetConnectivityPanel.java
@@ -16,6 +16,8 @@
package com.android.settings.panel;
+import static com.android.settings.network.NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS;
+
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
@@ -51,17 +53,19 @@
@Override
public CharSequence getTitle() {
- return mContext.getText(R.string.internet_connectivity_panel_title);
+ return mContext.getText(Utils.isProviderModelEnabled(mContext)
+ ? R.string.provider_internet_settings : R.string.internet_connectivity_panel_title);
}
@Override
public List<Uri> getSlices() {
final List<Uri> uris = new ArrayList<>();
- uris.add(CustomSliceRegistry.WIFI_SLICE_URI);
- uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI);
if (Utils.isProviderModelEnabled(mContext)) {
+ uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI);
uris.add(CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI);
} else {
+ uris.add(CustomSliceRegistry.WIFI_SLICE_URI);
+ uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI);
uris.add(AirplaneModePreferenceController.SLICE_URI);
}
return uris;
@@ -69,7 +73,8 @@
@Override
public Intent getSeeMoreIntent() {
- return new Intent(Settings.ACTION_WIRELESS_SETTINGS)
+ return new Intent(Utils.isProviderModelEnabled(mContext)
+ ? ACTION_NETWORK_PROVIDER_SETTINGS : Settings.ACTION_WIRELESS_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
diff --git a/src/com/android/settings/panel/MediaOutputGroupPanel.java b/src/com/android/settings/panel/MediaOutputGroupPanel.java
deleted file mode 100644
index 36f779b..0000000
--- a/src/com/android/settings/panel/MediaOutputGroupPanel.java
+++ /dev/null
@@ -1,164 +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.panel;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_START;
-import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
-
-import static com.android.settings.media.MediaOutputSlice.MEDIA_PACKAGE_NAME;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.net.Uri;
-
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-
-import com.android.settings.R;
-import com.android.settingslib.media.LocalMediaManager;
-import com.android.settingslib.media.MediaDevice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents the Media output group Panel.
- *
- * <p>
- * Displays Media output group item
- * </p>
- */
-public class MediaOutputGroupPanel implements PanelContent, LocalMediaManager.DeviceCallback,
- LifecycleObserver {
-
- private final Context mContext;
- private final String mPackageName;
-
- private PanelContentCallback mCallback;
- private LocalMediaManager mLocalMediaManager;
-
- /**
- * To generate a Media output group Panel instance.
- *
- * @param context the context of the caller.
- * @param packageName media application package name.
- * @return MediaOutputGroupPanel instance.
- */
- public static MediaOutputGroupPanel create(Context context, String packageName) {
- return new MediaOutputGroupPanel(context, packageName);
- }
-
- private MediaOutputGroupPanel(Context context, String packageName) {
- mContext = context.getApplicationContext();
- mPackageName = packageName;
- }
-
- @Override
- public CharSequence getTitle() {
- return mContext.getText(R.string.media_output_group_panel_title);
- }
-
- @Override
- public CharSequence getSubTitle() {
- final int size = mLocalMediaManager.getSelectedMediaDevice().size();
- if (size == 1) {
- return mContext.getText(R.string.media_output_group_panel_single_device_summary);
- }
- return mContext.getString(R.string.media_output_group_panel_multiple_devices_summary, size);
- }
-
- @Override
- public IconCompat getIcon() {
- return IconCompat.createWithResource(mContext, R.drawable.ic_arrow_back).setTint(
- Color.BLACK);
- }
-
- @Override
- public List<Uri> getSlices() {
- final List<Uri> uris = new ArrayList<>();
- MEDIA_OUTPUT_GROUP_SLICE_URI =
- MEDIA_OUTPUT_GROUP_SLICE_URI
- .buildUpon()
- .clearQuery()
- .appendQueryParameter(MEDIA_PACKAGE_NAME, mPackageName)
- .build();
- uris.add(MEDIA_OUTPUT_GROUP_SLICE_URI);
- return uris;
- }
-
- @Override
- public Intent getSeeMoreIntent() {
- return null;
- }
-
- @Override
- public Intent getHeaderIconIntent() {
- final Intent intent = new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME, mPackageName);
- return intent;
- }
-
- @Override
- public void registerCallback(PanelContentCallback callback) {
- mCallback = callback;
- }
-
- /**
- * Lifecycle callback to initial {@link LocalMediaManager}
- */
- @OnLifecycleEvent(ON_START)
- public void onStart() {
- if (mLocalMediaManager == null) {
- mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
- }
- mLocalMediaManager.registerCallback(this);
- mLocalMediaManager.startScan();
- }
-
- /**
- * Lifecycle callback to de-initial {@link LocalMediaManager}
- */
- @OnLifecycleEvent(ON_STOP)
- public void onStop() {
- mLocalMediaManager.unregisterCallback(this);
- mLocalMediaManager.stopScan();
- }
-
- @Override
- public void onDeviceListUpdate(List<MediaDevice> devices) {
- if (mCallback != null) {
- mCallback.onHeaderChanged();
- }
- }
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.PANEL_MEDIA_OUTPUT_GROUP;
- }
-
- @Override
- public int getViewType() {
- return PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
- }
-}
diff --git a/src/com/android/settings/panel/MediaOutputPanel.java b/src/com/android/settings/panel/MediaOutputPanel.java
deleted file mode 100644
index c3846c2..0000000
--- a/src/com/android/settings/panel/MediaOutputPanel.java
+++ /dev/null
@@ -1,256 +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.panel;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_START;
-import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
-
-import static com.android.settings.media.MediaOutputSlice.MEDIA_PACKAGE_NAME;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.media.MediaMetadata;
-import android.media.session.MediaController;
-import android.media.session.MediaSessionManager;
-import android.media.session.PlaybackState;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settingslib.media.InfoMediaDevice;
-import com.android.settingslib.media.LocalMediaManager;
-import com.android.settingslib.media.MediaDevice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents the Media output Panel.
- *
- * <p>
- * Displays Media output item
- * </p>
- */
-public class MediaOutputPanel implements PanelContent, LocalMediaManager.DeviceCallback,
- LifecycleObserver {
-
- private static final String TAG = "MediaOutputPanel";
-
- private final Context mContext;
- private final String mPackageName;
-
- @VisibleForTesting
- LocalMediaManager mLocalMediaManager;
-
- private PanelContentCallback mCallback;
- private boolean mIsCustomizedButtonUsed = true;
- private MediaSessionManager mMediaSessionManager;
- private MediaController mMediaController;
-
- public static MediaOutputPanel create(Context context, String packageName) {
- // Redirect to new media output dialog
- context.sendBroadcast(new Intent()
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
- .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
- .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME, packageName));
- return null;
- }
-
- private MediaOutputPanel(Context context, String packageName) {
- mContext = context.getApplicationContext();
- mPackageName = TextUtils.isEmpty(packageName) ? "" : packageName;
- }
-
- @Override
- public CharSequence getTitle() {
- if (mMediaController != null) {
- final MediaMetadata metadata = mMediaController.getMetadata();
- if (metadata != null) {
- return metadata.getDescription().getTitle();
- }
- }
- return mContext.getText(R.string.media_volume_title);
- }
-
- @Override
- public CharSequence getSubTitle() {
- if (mMediaController != null) {
- final MediaMetadata metadata = mMediaController.getMetadata();
- if (metadata != null) {
- return metadata.getDescription().getSubtitle();
- }
- }
- return mContext.getText(R.string.media_output_panel_title);
- }
-
- @Override
- public IconCompat getIcon() {
- if (mMediaController == null) {
- return null;
- }
- final MediaMetadata metadata = mMediaController.getMetadata();
- if (metadata != null) {
- final Bitmap bitmap = metadata.getDescription().getIconBitmap();
- if (bitmap != null) {
- final Bitmap roundBitmap = Utils.convertCornerRadiusBitmap(mContext, bitmap,
- (float) mContext.getResources().getDimensionPixelSize(
- R.dimen.output_switcher_panel_icon_corner_radius));
-
- return IconCompat.createWithBitmap(roundBitmap);
- }
- }
- Log.d(TAG, "Media meta data does not contain icon information");
- return null;
- }
-
- @Override
- public List<Uri> getSlices() {
- final List<Uri> uris = new ArrayList<>();
- MEDIA_OUTPUT_SLICE_URI =
- MEDIA_OUTPUT_SLICE_URI
- .buildUpon()
- .clearQuery()
- .appendQueryParameter(MEDIA_PACKAGE_NAME, mPackageName)
- .build();
- uris.add(MEDIA_OUTPUT_SLICE_URI);
- return uris;
- }
-
- @Override
- public Intent getSeeMoreIntent() {
- return null;
- }
-
- @Override
- public boolean isCustomizedButtonUsed() {
- return mIsCustomizedButtonUsed;
- }
-
- @Override
- public CharSequence getCustomizedButtonTitle() {
- return mContext.getText(R.string.service_stop);
- }
-
- @Override
- public void onClickCustomizedButton() {
- mLocalMediaManager.releaseSession();
- }
-
- @Override
- public void registerCallback(PanelContentCallback callback) {
- mCallback = callback;
- }
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.PANEL_MEDIA_OUTPUT;
- }
-
- @Override
- public void onSelectedDeviceStateChanged(MediaDevice device, int state) {
- dispatchCustomButtonStateChanged();
- }
-
- @Override
- public void onDeviceListUpdate(List<MediaDevice> devices) {
- dispatchCustomButtonStateChanged();
- }
-
- @Override
- public void onDeviceAttributesChanged() {
- dispatchCustomButtonStateChanged();
- }
-
- private void dispatchCustomButtonStateChanged() {
- hideCustomButtonIfNecessary();
- if (mCallback != null) {
- mCallback.onCustomizedButtonStateChanged();
- }
- }
-
- private void hideCustomButtonIfNecessary() {
- final MediaDevice device = mLocalMediaManager.getCurrentConnectedDevice();
- mIsCustomizedButtonUsed = device instanceof InfoMediaDevice;
- }
-
- @OnLifecycleEvent(ON_START)
- public void onStart() {
- if (!TextUtils.isEmpty(mPackageName)) {
- mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
- for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
- if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
- mMediaController = controller;
- mMediaController.registerCallback(mCb);
- mCallback.onHeaderChanged();
- break;
- }
- }
- }
- if (mMediaController == null) {
- Log.d(TAG, "No media controller for " + mPackageName);
- }
- if (mLocalMediaManager == null) {
- mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
- }
- mLocalMediaManager.registerCallback(this);
- mLocalMediaManager.startScan();
- }
-
- @OnLifecycleEvent(ON_STOP)
- public void onStop() {
- if (mMediaController != null) {
- mMediaController.unregisterCallback(mCb);
- }
- mLocalMediaManager.unregisterCallback(this);
- mLocalMediaManager.stopScan();
- }
-
- @Override
- public int getViewType() {
- return PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
- }
-
- private final MediaController.Callback mCb = new MediaController.Callback() {
- @Override
- public void onMetadataChanged(MediaMetadata metadata) {
- if (mCallback != null) {
- mCallback.onHeaderChanged();
- }
- }
-
- @Override
- public void onPlaybackStateChanged(PlaybackState state) {
- final int playState = state.getState();
- if (mCallback != null && (playState == PlaybackState.STATE_STOPPED
- || playState == PlaybackState.STATE_PAUSED)) {
- mCallback.forceClose();
- }
- }
- };
-}
diff --git a/src/com/android/settings/panel/PanelContent.java b/src/com/android/settings/panel/PanelContent.java
index 9fa4316..6c271fd 100644
--- a/src/com/android/settings/panel/PanelContent.java
+++ b/src/com/android/settings/panel/PanelContent.java
@@ -31,7 +31,6 @@
public interface PanelContent extends Instrumentable {
int VIEW_TYPE_SLIDER = 1;
- int VIEW_TYPE_SLIDER_LARGE_ICON = 2;
/**
* @return a icon for the title of the Panel.
diff --git a/src/com/android/settings/panel/PanelFeatureProviderImpl.java b/src/com/android/settings/panel/PanelFeatureProviderImpl.java
index 93c6025..ca30952 100644
--- a/src/com/android/settings/panel/PanelFeatureProviderImpl.java
+++ b/src/com/android/settings/panel/PanelFeatureProviderImpl.java
@@ -16,9 +16,6 @@
package com.android.settings.panel;
-import static com.android.settingslib.media.MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT;
-import static com.android.settingslib.media.MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT_GROUP;
-
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
@@ -39,16 +36,12 @@
switch (panelType) {
case Settings.Panel.ACTION_INTERNET_CONNECTIVITY:
return InternetConnectivityPanel.create(context);
- case ACTION_MEDIA_OUTPUT:
- return MediaOutputPanel.create(context, mediaPackageName);
case Settings.Panel.ACTION_NFC:
return NfcPanel.create(context);
case Settings.Panel.ACTION_WIFI:
return WifiPanel.create(context);
case Settings.Panel.ACTION_VOLUME:
return VolumePanel.create(context);
- case ACTION_MEDIA_OUTPUT_GROUP:
- return MediaOutputGroupPanel.create(context, mediaPackageName);
}
throw new IllegalStateException("No matching panel for: " + panelType);
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 133e0fc..cc27683 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -240,7 +240,7 @@
final IconCompat icon = mPanel.getIcon();
final CharSequence title = mPanel.getTitle();
- if (icon != null || mPanel.getViewType() == PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON) {
+ if (icon != null) {
enablePanelHeader(icon, title);
} else {
mTitleView.setVisibility(View.VISIBLE);
@@ -248,11 +248,7 @@
mTitleView.setText(title);
}
- if (mPanel.getViewType() == PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON) {
- mFooterDivider.setVisibility(View.VISIBLE);
- } else {
- mFooterDivider.setVisibility(View.GONE);
- }
+ mFooterDivider.setVisibility(View.GONE);
mSeeMoreButton.setOnClickListener(getSeeMoreListener());
mDoneButton.setOnClickListener(getCloseListener());
diff --git a/src/com/android/settings/panel/PanelSlicesAdapter.java b/src/com/android/settings/panel/PanelSlicesAdapter.java
index a055dbb..4c8698a 100644
--- a/src/com/android/settings/panel/PanelSlicesAdapter.java
+++ b/src/com/android/settings/panel/PanelSlicesAdapter.java
@@ -16,9 +16,7 @@
package com.android.settings.panel;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -75,8 +73,6 @@
View view;
if (viewType == PanelContent.VIEW_TYPE_SLIDER) {
view = inflater.inflate(R.layout.panel_slice_slider_row, viewGroup, false);
- } else if (viewType == PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON) {
- view = inflater.inflate(R.layout.panel_slice_slider_row_large_icon, viewGroup, false);
} else {
view = inflater.inflate(R.layout.panel_slice_row, viewGroup, false);
}
@@ -142,15 +138,6 @@
final Slice slice = sliceLiveData.getValue();
if (slice == null || slice.getUri().equals(MEDIA_OUTPUT_INDICATOR_SLICE_URI)) {
mDividerAllowedAbove = false;
- } else if (position == 0 && (slice.getUri().equals(MEDIA_OUTPUT_SLICE_URI)
- || slice.getUri().equals(MEDIA_OUTPUT_GROUP_SLICE_URI))) {
- sliceView.setClickable(false);
- // Customize output switcher slice padding
- final int padding = mPanelFragment.getResources().getDimensionPixelSize(
- R.dimen.output_switcher_slice_padding_top);
- mSliceSliderLayout.setPadding(mSliceSliderLayout.getPaddingLeft(), padding,
- mSliceSliderLayout.getPaddingRight(),
- padding);
}
// Log Panel interaction
@@ -175,7 +162,7 @@
@Override
public boolean isDividerAllowedBelow() {
- return mPanelFragment.getPanelViewType() != PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
+ return true;
}
}
}
diff --git a/src/com/android/settings/security/RequestManageCredentials.java b/src/com/android/settings/security/RequestManageCredentials.java
index b30f5b6..56fa83d 100644
--- a/src/com/android/settings/security/RequestManageCredentials.java
+++ b/src/com/android/settings/security/RequestManageCredentials.java
@@ -19,17 +19,25 @@
import android.annotation.Nullable;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.pm.UserInfo;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.UserManager;
import android.security.AppUriAuthenticationPolicy;
import android.security.Credentials;
import android.security.KeyChain;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
-import android.widget.Toast;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -66,29 +74,98 @@
private LinearLayout mButtonPanel;
private ExtendedFloatingActionButton mExtendedFab;
+ private HandlerThread mKeyChainTread;
+ private KeyChain.KeyChainConnection mKeyChainConnection;
+
private boolean mDisplayingButtonPanel = false;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (Credentials.ACTION_MANAGE_CREDENTIALS.equals(getIntent().getAction())) {
- setContentView(R.layout.request_manage_credentials);
- // This is not authenticated, as any app can ask to be the credential management app.
- mCredentialManagerPackage = getReferrer().getHost();
- mAuthenticationPolicy =
- getIntent().getParcelableExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY);
- enforceValidAuthenticationPolicy(mAuthenticationPolicy);
-
- loadRecyclerView();
- loadButtons();
- loadExtendedFloatingActionButton();
- addOnScrollListener();
- } else {
+ if (!Credentials.ACTION_MANAGE_CREDENTIALS.equals(getIntent().getAction())) {
Log.e(TAG, "Unable to start activity because intent action is not "
+ Credentials.ACTION_MANAGE_CREDENTIALS);
- finish();
+ finishWithResultCancelled();
+ return;
}
+ if (isManagedDevice()) {
+ Log.e(TAG, "Credential management on managed devices should be done by the Device "
+ + "Policy Controller, not a credential management app");
+ finishWithResultCancelled();
+ return;
+ }
+ mCredentialManagerPackage = getLaunchedFromPackage();
+ if (TextUtils.isEmpty(mCredentialManagerPackage)) {
+ Log.e(TAG, "Unknown credential manager app");
+ finishWithResultCancelled();
+ return;
+ }
+ setContentView(R.layout.request_manage_credentials);
+
+ mKeyChainTread = new HandlerThread("KeyChainConnection");
+ mKeyChainTread.start();
+ mKeyChainConnection = getKeyChainConnection(this, mKeyChainTread);
+
+ AppUriAuthenticationPolicy policy =
+ getIntent().getParcelableExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY);
+ if (!isValidAuthenticationPolicy(policy)) {
+ Log.e(TAG, "Invalid authentication policy");
+ finishWithResultCancelled();
+ return;
+ }
+ mAuthenticationPolicy = policy;
+
+ loadRecyclerView();
+ loadButtons();
+ loadExtendedFloatingActionButton();
+ addOnScrollListener();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mKeyChainConnection != null) {
+ mKeyChainConnection.close();
+ mKeyChainConnection = null;
+ mKeyChainTread.quitSafely();
+ }
+ }
+
+ private boolean isValidAuthenticationPolicy(AppUriAuthenticationPolicy policy) {
+ if (policy == null || policy.getAppAndUriMappings().isEmpty()) {
+ return false;
+ }
+ try {
+ // Check whether any of the aliases in the policy already exist
+ for (String alias : policy.getAliases()) {
+ if (mKeyChainConnection.getService().requestPrivateKey(alias) != null) {
+ return false;
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Invalid authentication policy", e);
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isManagedDevice() {
+ DevicePolicyManager dpm = getSystemService(DevicePolicyManager.class);
+
+ return dpm.getDeviceOwnerUser() != null
+ || dpm.getProfileOwner() != null
+ || hasManagedProfile();
+ }
+
+ private boolean hasManagedProfile() {
+ UserManager um = getSystemService(UserManager.class);
+ for (final UserInfo userInfo : um.getProfiles(getUserId())) {
+ if (userInfo.isManagedProfile()) {
+ return true;
+ }
+ }
+ return false;
}
private void loadRecyclerView() {
@@ -107,8 +184,10 @@
Button dontAllowButton = findViewById(R.id.dont_allow_button);
Button allowButton = findViewById(R.id.allow_button);
- dontAllowButton.setOnClickListener(finishRequestManageCredentials());
- allowButton.setOnClickListener(setCredentialManagementApp());
+ dontAllowButton.setOnClickListener(b -> {
+ finishWithResultCancelled();
+ });
+ allowButton.setOnClickListener(b -> setOrUpdateCredentialManagementApp());
}
private void loadExtendedFloatingActionButton() {
@@ -120,22 +199,26 @@
});
}
- private View.OnClickListener finishRequestManageCredentials() {
- return v -> {
- Toast.makeText(this, R.string.request_manage_credentials_dont_allow,
- Toast.LENGTH_SHORT).show();
- setResult(RESULT_CANCELED);
- finish();
- };
+ private void setOrUpdateCredentialManagementApp() {
+ try {
+ mKeyChainConnection.getService().setCredentialManagementApp(
+ mCredentialManagerPackage, mAuthenticationPolicy);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to set credential manager app", e);
+ }
+ finish();
}
- private View.OnClickListener setCredentialManagementApp() {
- return v -> {
- // TODO: Implement allow logic
- Toast.makeText(this, R.string.request_manage_credentials_allow,
- Toast.LENGTH_SHORT).show();
- finish();
- };
+ @VisibleForTesting
+ KeyChain.KeyChainConnection getKeyChainConnection(Context context, HandlerThread thread) {
+ final Handler handler = new Handler(thread.getLooper());
+ try {
+ KeyChain.KeyChainConnection connection = KeyChain.bindAsUser(
+ context, handler, Process.myUserHandle());
+ return connection;
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Faile to bind to KeyChain", e);
+ }
}
private void addOnScrollListener() {
@@ -182,12 +265,8 @@
< mRecyclerView.getAdapter().getItemCount() - 1;
}
- private void enforceValidAuthenticationPolicy(AppUriAuthenticationPolicy policy) {
- // TODO: Check whether any of the aliases in the policy already exist
- if (policy == null || policy.getAppAndUriMappings().isEmpty()) {
- Log.e(TAG, "Invalid authentication policy");
- setResult(RESULT_CANCELED);
- finish();
- }
+ private void finishWithResultCancelled() {
+ setResult(RESULT_CANCELED);
+ finish();
}
}
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java
index 0ae294e..252b6c0 100644
--- a/src/com/android/settings/sim/SimDialogActivity.java
+++ b/src/com/android/settings/sim/SimDialogActivity.java
@@ -19,7 +19,6 @@
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
-import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.SubscriptionManager;
@@ -54,6 +53,8 @@
public static final int PREFERRED_PICK = 3;
// Show the "select SMS subscription" dialog, but don't save as default, just return a result
public static final int SMS_PICK_FOR_MESSAGE = 4;
+ // Dismiss the current dialog and finish the activity.
+ public static final int PICK_DISMISS = 5;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -70,6 +71,12 @@
private void showOrUpdateDialog() {
final int dialogType = getIntent().getIntExtra(DIALOG_TYPE_KEY, INVALID_PICK);
+
+ if (dialogType == PICK_DISMISS) {
+ finishAndRemoveTask();
+ return;
+ }
+
final String tag = Integer.toString(dialogType);
final FragmentManager fragmentManager = getSupportFragmentManager();
SimDialogFragment fragment = (SimDialogFragment) fragmentManager.findFragmentByTag(tag);
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
index 6bd4c24..8d5a3e0 100644
--- a/src/com/android/settings/sim/SimSelectNotification.java
+++ b/src/com/android/settings/sim/SimSelectNotification.java
@@ -20,10 +20,10 @@
import static android.provider.Settings.ENABLE_MMS_DATA_REQUEST_REASON_OUTGOING_MMS;
import static android.provider.Settings.EXTRA_ENABLE_MMS_DATA_REQUEST_REASON;
import static android.provider.Settings.EXTRA_SUB_ID;
-import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DISMISS;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE;
import static android.telephony.TelephonyManager.EXTRA_SIM_COMBINATION_NAMES;
import static android.telephony.TelephonyManager.EXTRA_SIM_COMBINATION_WARNING_TYPE;
@@ -32,6 +32,9 @@
import static android.telephony.TelephonyManager.EXTRA_SUBSCRIPTION_ID;
import static android.telephony.data.ApnSetting.TYPE_MMS;
+import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
+import static com.android.settings.sim.SimDialogActivity.PICK_DISMISS;
+
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -51,7 +54,6 @@
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.telephony.MobileNetworkActivity;
-import com.android.settingslib.HelpUtils;
public class SimSelectNotification extends BroadcastReceiver {
private static final String TAG = "SimSelectNotification";
@@ -159,6 +161,16 @@
// Cancel any previous notifications
cancelSimSelectNotification(context);
+
+ // If the dialog type is to dismiss.
+ if (dialogType == EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DISMISS) {
+ Intent newIntent = new Intent(context, SimDialogActivity.class);
+ newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ newIntent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, PICK_DISMISS);
+ context.startActivity(newIntent);
+ return;
+ }
+
// Create a notification to tell the user that some defaults are missing
createSimSelectNotification(context);
@@ -186,10 +198,11 @@
final int warningType = intent.getIntExtra(EXTRA_SIM_COMBINATION_WARNING_TYPE,
EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE);
+ // Cancel any previous notifications
+ cancelSimCombinationWarningNotification(context);
+
if (warningType == EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA) {
- // Cancel any previous notifications
- cancelSimCombinationWarningNotification(context);
- // Create a notification to tell the user that some defaults are missing
+ // Create a notification to tell the user that there's a sim combination warning.
createSimCombinationWarningNotification(context, intent);
}
}
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index ce98d27..be71b30 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -37,11 +37,10 @@
import com.android.settings.homepage.contextualcards.slices.FaceSetupSlice;
import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
import com.android.settings.location.LocationSlice;
-import com.android.settings.media.MediaOutputGroupSlice;
import com.android.settings.media.MediaOutputIndicatorSlice;
-import com.android.settings.media.MediaOutputSlice;
import com.android.settings.media.RemoteMediaSlice;
import com.android.settings.network.AirplaneSafeNetworksSlice;
+import com.android.settings.network.ProviderModelSlice;
import com.android.settings.network.telephony.MobileDataSlice;
import com.android.settings.notification.zen.ZenModeButtonPreferenceController;
import com.android.settings.wifi.calling.WifiCallingSliceHelper;
@@ -169,6 +168,17 @@
.appendEncodedPath(SettingsSlicesContract.PATH_SETTING_ACTION)
.appendPath("mobile_data")
.build();
+
+ /**
+ * Full {@link Uri} for the Provider Model Slice.
+ */
+ public static final Uri PROVIDER_MODEL_SLICE_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(SettingsSliceProvider.SLICE_AUTHORITY)
+ .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_ACTION)
+ .appendPath("provider_model")
+ .build();
+
/**
* Full {@link Uri} for the Alarm volume Slice.
*/
@@ -178,6 +188,7 @@
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
.appendPath("alarm_volume")
.build();
+
/**
* Full {@link Uri} for the Call Volume Slice.
*/
@@ -256,26 +267,6 @@
.build();
/**
- * Backing Uri for the Media output Slice.
- */
- public static Uri MEDIA_OUTPUT_SLICE_URI = new Uri.Builder()
- .scheme(ContentResolver.SCHEME_CONTENT)
- .authority(SettingsSliceProvider.SLICE_AUTHORITY)
- .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
- .appendPath(MediaOutputSliceConstants.KEY_MEDIA_OUTPUT)
- .build();
-
- /**
- * Backing Uri for the Media output group Slice.
- */
- public static Uri MEDIA_OUTPUT_GROUP_SLICE_URI = new Uri.Builder()
- .scheme(ContentResolver.SCHEME_CONTENT)
- .authority(SettingsSliceProvider.SLICE_AUTHORITY)
- .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
- .appendPath(MediaOutputSliceConstants.KEY_MEDIA_OUTPUT_GROUP)
- .build();
-
- /**
* Backing Uri for the Media output indicator Slice.
*/
public static Uri MEDIA_OUTPUT_INDICATOR_SLICE_URI = new Uri.Builder()
@@ -340,12 +331,11 @@
sUriToSlice.put(LOCATION_SLICE_URI, LocationSlice.class);
sUriToSlice.put(LOW_STORAGE_SLICE_URI, LowStorageSlice.class);
sUriToSlice.put(MEDIA_OUTPUT_INDICATOR_SLICE_URI, MediaOutputIndicatorSlice.class);
- sUriToSlice.put(MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class);
sUriToSlice.put(MOBILE_DATA_SLICE_URI, MobileDataSlice.class);
+ sUriToSlice.put(PROVIDER_MODEL_SLICE_URI, ProviderModelSlice.class);
sUriToSlice.put(WIFI_SLICE_URI, WifiSlice.class);
sUriToSlice.put(DARK_THEME_SLICE_URI, DarkThemeSlice.class);
sUriToSlice.put(REMOTE_MEDIA_SLICE_URI, RemoteMediaSlice.class);
- sUriToSlice.put(MEDIA_OUTPUT_GROUP_SLICE_URI, MediaOutputGroupSlice.class);
sUriToSlice.put(ALWAYS_ON_SLICE_URI, AlwaysOnDisplaySlice.class);
sUriToSlice.put(AIRPLANE_SAFE_NETWORKS_SLICE_URI, AirplaneSafeNetworksSlice.class);
}
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 0c6205f..7c487ba 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -343,7 +343,7 @@
final Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS)
.setPackage(Utils.SETTINGS_PACKAGE_NAME);
final PendingIntent noOpIntent = PendingIntent.getActivity(getContext(),
- 0 /* requestCode */, settingsIntent, 0 /* flags */);
+ 0 /* requestCode */, settingsIntent, PendingIntent.FLAG_IMMUTABLE);
return noOpIntent;
}
diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java
index 40a4d56..b5562a3 100644
--- a/src/com/android/settings/sound/MediaOutputPreferenceController.java
+++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java
@@ -37,7 +37,7 @@
import java.util.List;
/**
- * This class allows launching MediaOutputSlice to switch output device.
+ * This class allows launching MediaOutputDialog to switch output device.
* Preference would hide only when
* - Bluetooth = OFF
* - Bluetooth = ON and Connected Devices = 0 and Previously Connected = 0
diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java
index 024db14..e5fc8f1 100644
--- a/src/com/android/settings/system/ResetDashboardFragment.java
+++ b/src/com/android/settings/system/ResetDashboardFragment.java
@@ -22,6 +22,7 @@
import com.android.settings.R;
import com.android.settings.applications.manageapplications.ResetAppPrefPreferenceController;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.network.EraseEuiccDataController;
import com.android.settings.network.NetworkResetPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -57,6 +58,12 @@
return buildPreferenceControllers(context, getSettingsLifecycle());
}
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ use(EraseEuiccDataController.class).setFragment(this);
+ }
+
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index 53d9849..5005399 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -243,7 +243,7 @@
mDefaultGuestRestrictions = mUserManager.getDefaultGuestRestrictions();
mPhonePref.setChecked(
!mDefaultGuestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS));
- mRemoveUserPref.setTitle(R.string.user_exit_guest_title);
+ mRemoveUserPref.setTitle(R.string.user_exit_guest_menu);
} else {
mPhonePref.setChecked(!mUserManager.hasUserRestriction(
UserManager.DISALLOW_OUTGOING_CALLS, new UserHandle(userId)));
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 63ccb6b..8ba5432 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -31,6 +31,7 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
@@ -164,6 +165,7 @@
private final Object mUserLock = new Object();
private UserManager mUserManager;
private static SparseArray<Bitmap> sDarkDefaultUserBitmapCache = new SparseArray<>();
+ private static Bitmap sRemoveGuestBitmap = null;
private MultiUserSwitchBarController mSwitchBarController;
private EditUserInfoController mEditUserInfoController =
@@ -177,6 +179,7 @@
// A place to cache the generated default avatar
private Drawable mDefaultIconDrawable;
+ private Drawable mRemoveGuestIconDrawable;
// TODO: Replace current Handler solution to something that doesn't leak memory and works
// TODO: during a configuration change
@@ -383,8 +386,8 @@
private void loadProfile() {
if (isCurrentUserGuest()) {
// No need to load profile information
- mMePreference.setIcon(getEncircledDefaultIcon());
- mMePreference.setTitle(R.string.user_exit_guest_title);
+ mMePreference.setIcon(getEncircledRemoveGuestIcon());
+ mMePreference.setTitle(R.string.user_clear_guest_menu);
mMePreference.setSelectable(true);
// removing a guest will result in switching back to the admin user
mMePreference.setEnabled(canSwitchUserNow());
@@ -899,7 +902,7 @@
} else {
setPhotoId(pref, user);
}
- } else {
+ } else if (!user.isGuest()) {
// Icon not available yet, print a placeholder
pref.setIcon(getEncircledDefaultIcon());
}
@@ -1044,6 +1047,14 @@
return mDefaultIconDrawable;
}
+ private Drawable getEncircledRemoveGuestIcon() {
+ if (mRemoveGuestIconDrawable == null) {
+ mRemoveGuestIconDrawable = encircle(
+ getRemoveGuestIconAsBitmap(getContext().getResources()));
+ }
+ return mRemoveGuestIconDrawable;
+ }
+
private void setPhotoId(Preference pref, UserInfo user) {
Bitmap bitmap = mUserIcons.get(user.id);
if (bitmap != null) {
@@ -1123,6 +1134,23 @@
}
/**
+ * Returns a remove guest icon (as a {@link Bitmap})
+ *
+ * @param resources resources object to fetch the remove guest icon.
+ */
+ private static Bitmap getRemoveGuestIconAsBitmap(Resources resources) {
+ if (sRemoveGuestBitmap == null) {
+ Drawable icon = resources.getDrawable(R.drawable.ic_delete, null).mutate();
+ icon.setColorFilter(
+ resources.getColor(com.android.internal.R.color.user_icon_default_gray, null),
+ PorterDuff.Mode.SRC_IN);
+ icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
+ sRemoveGuestBitmap = UserIcons.convertToBitmap(icon);
+ }
+ return sRemoveGuestBitmap;
+ }
+
+ /**
* Assign the default photo to user with {@paramref userId}
*
* @param context used to get the {@link UserManager}
diff --git a/src/com/android/settings/widget/RadioButtonPreferenceWithExtraWidget.java b/src/com/android/settings/widget/RadioButtonPreferenceWithExtraWidget.java
deleted file mode 100644
index 2b28ec1..0000000
--- a/src/com/android/settings/widget/RadioButtonPreferenceWithExtraWidget.java
+++ /dev/null
@@ -1,90 +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.widget;
-
-import android.content.Context;
-import android.view.View;
-import android.widget.ImageView;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settingslib.widget.RadioButtonPreference;
-
-public class RadioButtonPreferenceWithExtraWidget extends RadioButtonPreference {
- public static final int EXTRA_WIDGET_VISIBILITY_GONE = 0;
- public static final int EXTRA_WIDGET_VISIBILITY_INFO = 1;
- public static final int EXTRA_WIDGET_VISIBILITY_SETTING = 2;
-
- private View mExtraWidgetDivider;
- private ImageView mExtraWidget;
-
- private int mExtraWidgetVisibility = EXTRA_WIDGET_VISIBILITY_GONE;
- private View.OnClickListener mExtraWidgetOnClickListener;
-
- public RadioButtonPreferenceWithExtraWidget(Context context) {
- super(context, null);
- setLayoutResource(R.layout.preference_radio_with_extra_widget);
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder view) {
- super.onBindViewHolder(view);
-
- mExtraWidget = (ImageView) view.findViewById(R.id.radio_extra_widget);
- mExtraWidgetDivider = view.findViewById(R.id.radio_extra_widget_divider);
- setExtraWidgetVisibility(mExtraWidgetVisibility);
-
- if (mExtraWidgetOnClickListener != null) {
- setExtraWidgetOnClickListener(mExtraWidgetOnClickListener);
- }
- }
-
- public void setExtraWidgetVisibility(int visibility) {
- mExtraWidgetVisibility = visibility;
- if (mExtraWidget == null || mExtraWidgetDivider == null) {
- return;
- }
-
- if (visibility == EXTRA_WIDGET_VISIBILITY_GONE) {
- mExtraWidget.setClickable(false);
- mExtraWidget.setVisibility(View.GONE);
- mExtraWidgetDivider.setVisibility(View.GONE);
- } else {
- mExtraWidget.setClickable(true);
- mExtraWidget.setVisibility(View.VISIBLE);
- mExtraWidgetDivider.setVisibility(View.VISIBLE);
- if (mExtraWidgetVisibility == EXTRA_WIDGET_VISIBILITY_INFO) {
- mExtraWidget.setImageResource(R.drawable.ic_settings_about);
- mExtraWidget.setContentDescription(
- getContext().getResources().getText(R.string.information_label));
- } else if (mExtraWidgetVisibility == EXTRA_WIDGET_VISIBILITY_SETTING) {
- mExtraWidget.setImageResource(R.drawable.ic_settings_accent);
- mExtraWidget.setContentDescription(
- getContext().getResources().getText(R.string.settings_label));
- }
- }
- }
-
- public void setExtraWidgetOnClickListener(View.OnClickListener listener) {
- mExtraWidgetOnClickListener = listener;
- if (mExtraWidget != null) {
- mExtraWidget.setEnabled(true);
- mExtraWidget.setOnClickListener(listener);
- }
- }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/wifi/ConfigureWifiEntryFragment.java b/src/com/android/settings/wifi/ConfigureWifiEntryFragment.java
index 881aaea..c36a298 100644
--- a/src/com/android/settings/wifi/ConfigureWifiEntryFragment.java
+++ b/src/com/android/settings/wifi/ConfigureWifiEntryFragment.java
@@ -21,9 +21,6 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
-import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -40,6 +37,7 @@
import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
import com.android.wifitrackerlib.NetworkDetailsTracker;
import com.android.wifitrackerlib.WifiEntry;
@@ -222,17 +220,17 @@
}
};
- mNetworkDetailsTracker = NetworkDetailsTracker.createNetworkDetailsTracker(
- getSettingsLifecycle(),
- context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- getArguments().getString(WifiNetworkDetailsFragment2.KEY_CHOSEN_WIFIENTRY_KEY));
+ mNetworkDetailsTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createNetworkDetailsTracker(
+ getSettingsLifecycle(),
+ context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ getArguments().getString(
+ WifiNetworkDetailsFragment2.KEY_CHOSEN_WIFIENTRY_KEY));
}
}
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index 81ca183..ff313c7 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -63,18 +63,6 @@
}
@Override
- public int getInitialExpandedChildCount() {
- int tileLimit = 1;
- if (mWifiWakeupPreferenceController.isAvailable()) {
- tileLimit++;
- }
- if (mUseOpenWifiPreferenceController.isAvailable()) {
- tileLimit++;
- }
- return tileLimit;
- }
-
- @Override
protected int getPreferenceScreenResId() {
return R.xml.wifi_configure_settings;
}
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index 887f09f..11f3612 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -24,11 +24,8 @@
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.NetworkRequestMatchCallback;
import android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
import android.os.Bundle;
@@ -54,6 +51,7 @@
import androidx.preference.internal.PreferenceImageView;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.Utils;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -113,16 +111,15 @@
}
};
final Context context = getContext();
- mWifiPickerTracker = new WifiPickerTracker(getSettingsLifecycle(), context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- this);
+ mWifiPickerTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(getSettingsLifecycle(), context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ this);
}
@Override
diff --git a/src/com/android/settings/wifi/WifiConnectionPreferenceController.java b/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
index 13d5082..3b2669c 100644
--- a/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
@@ -17,9 +17,6 @@
package com.android.settings.wifi;
import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
-import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -36,6 +33,7 @@
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -115,16 +113,15 @@
return SystemClock.elapsedRealtime();
}
};
- mWifiPickerTracker = new WifiPickerTracker(lifecycle, context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- this);
+ mWifiPickerTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(lifecycle, context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ this);
}
/**
diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java
index 000ed3e..1c5a8ed 100644
--- a/src/com/android/settings/wifi/WifiDialogActivity.java
+++ b/src/com/android/settings/wifi/WifiDialogActivity.java
@@ -18,9 +18,7 @@
import android.content.DialogInterface;
import android.content.Intent;
-import android.net.ConnectivityManager;
import android.net.NetworkInfo;
-import android.net.NetworkScoreManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.ActionListener;
@@ -38,6 +36,7 @@
import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.core.lifecycle.ObservableActivity;
import com.android.settingslib.wifi.AccessPoint;
@@ -124,18 +123,17 @@
return SystemClock.elapsedRealtime();
}
};
- mNetworkDetailsTracker = NetworkDetailsTracker.createNetworkDetailsTracker(
- getLifecycle(),
- this,
- getSystemService(WifiManager.class),
- getSystemService(ConnectivityManager.class),
- getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- mIntent.getStringExtra(KEY_CHOSEN_WIFIENTRY_KEY));
+ mNetworkDetailsTracker = FeatureFactory.getFactory(this)
+ .getWifiTrackerLibProvider()
+ .createNetworkDetailsTracker(
+ getLifecycle(),
+ this,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ mIntent.getStringExtra(KEY_CHOSEN_WIFIENTRY_KEY));
} else {
final Bundle accessPointState = mIntent.getBundleExtra(KEY_ACCESS_POINT_STATE);
if (accessPointState != null) {
diff --git a/src/com/android/settings/wifi/WifiPickerTrackerHelper.java b/src/com/android/settings/wifi/WifiPickerTrackerHelper.java
new file mode 100644
index 0000000..c20f355
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiPickerTrackerHelper.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Process;
+import android.os.SimpleClock;
+import android.os.SystemClock;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.wifitrackerlib.MergedCarrierEntry;
+import com.android.wifitrackerlib.WifiEntry;
+import com.android.wifitrackerlib.WifiPickerTracker;
+
+import java.time.Clock;
+import java.time.ZoneOffset;
+
+public class WifiPickerTrackerHelper implements LifecycleObserver {
+
+ private static final String TAG = "WifiPickerTrackerHelper";
+
+ // Max age of tracked WifiEntries
+ private static final long MAX_SCAN_AGE_MILLIS = 15_000;
+ // Interval between initiating WifiPickerTracker scans
+ private static final long SCAN_INTERVAL_MILLIS = 10_000;
+ // Clock used for evaluating the age of scans
+ private static final Clock ELAPSED_REALTIME_CLOCK = new SimpleClock(ZoneOffset.UTC) {
+ @Override
+ public long millis() {
+ return SystemClock.elapsedRealtime();
+ }
+ };
+
+ private WifiPickerTracker mWifiPickerTracker;
+ // Worker thread used for WifiPickerTracker work
+ private HandlerThread mWorkerThread;
+
+ public WifiPickerTrackerHelper(@NonNull Lifecycle lifecycle, @NonNull Context context,
+ @Nullable WifiPickerTracker.WifiPickerTrackerCallback listener) {
+ if (lifecycle == null) {
+ throw new IllegalArgumentException("lifecycle must be non-null.");
+ }
+ lifecycle.addObserver(this);
+ mWorkerThread = new HandlerThread(TAG
+ + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ mWorkerThread.start();
+
+ mWifiPickerTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(lifecycle, context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ ELAPSED_REALTIME_CLOCK,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ listener);
+
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ public void onDestroy() {
+ mWorkerThread.quit();
+ }
+
+ public @NonNull WifiPickerTracker getWifiPickerTracker() {
+ return mWifiPickerTracker;
+ }
+
+ public boolean setCarrierNetworkEnabled(boolean enable) {
+ final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry();
+ if (mergedCarrierEntry == null) {
+ return false;
+ }
+ mergedCarrierEntry.setEnabled(enable);
+ return true;
+ }
+
+ public boolean connectCarrierNetwork(@Nullable WifiEntry.ConnectCallback callback) {
+ final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry();
+ if (mergedCarrierEntry == null || !mergedCarrierEntry.canConnect()) {
+ return false;
+ }
+ mergedCarrierEntry.connect(callback);
+ return true;
+ }
+
+ @VisibleForTesting
+ void setWifiPickerTracker(@NonNull WifiPickerTracker wifiPickerTracker) {
+ mWifiPickerTracker = wifiPickerTracker;
+ }
+
+ @VisibleForTesting
+ void setWorkerThread(@NonNull HandlerThread workerThread) {
+ mWorkerThread = workerThread;
+ }
+}
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 2804393..cf8242b 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -27,8 +27,6 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
@@ -66,6 +64,7 @@
import com.android.settings.datausage.DataUsagePreference;
import com.android.settings.datausage.DataUsageUtils;
import com.android.settings.location.ScanningSettings;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.SwitchBarController;
import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
@@ -283,16 +282,15 @@
return SystemClock.elapsedRealtime();
}
};
- mWifiPickerTracker = new WifiPickerTracker(getSettingsLifecycle(), context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- this);
+ mWifiPickerTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(getSettingsLifecycle(), context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ this);
final Activity activity = getActivity();
diff --git a/src/com/android/settings/wifi/WifiTrackerLibProvider.java b/src/com/android/settings/wifi/WifiTrackerLibProvider.java
new file mode 100644
index 0000000..10b3373
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiTrackerLibProvider.java
@@ -0,0 +1,48 @@
+/*
+ * 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.wifi;
+
+import android.content.Context;
+import android.os.Handler;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.wifitrackerlib.NetworkDetailsTracker;
+import com.android.wifitrackerlib.WifiPickerTracker;
+
+import java.time.Clock;
+
+/**
+ * Provides the objects instances from the AOSP WifiTrackerLib.
+ */
+public interface WifiTrackerLibProvider {
+
+ /** Create a new instance of WifiPickerTracker */
+ WifiPickerTracker createWifiPickerTracker(
+ Lifecycle lifecycle, Context context,
+ Handler mainHandler, Handler workerHandler, Clock clock,
+ long maxScanAgeMillis, long scanIntervalMillis,
+ WifiPickerTracker.WifiPickerTrackerCallback listener);
+
+ /** Create a new instance of NetworkDetailsTracker */
+ NetworkDetailsTracker createNetworkDetailsTracker(
+ Lifecycle lifecycle, Context context,
+ Handler mainHandler, Handler workerHandler, Clock clock,
+ long maxScanAgeMillis, long scanIntervalMillis,
+ String key);
+
+}
diff --git a/src/com/android/settings/wifi/WifiTrackerLibProviderImpl.java b/src/com/android/settings/wifi/WifiTrackerLibProviderImpl.java
new file mode 100644
index 0000000..f835409
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiTrackerLibProviderImpl.java
@@ -0,0 +1,74 @@
+/*
+ * 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.wifi;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkScoreManager;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.wifitrackerlib.NetworkDetailsTracker;
+import com.android.wifitrackerlib.WifiPickerTracker;
+
+import java.time.Clock;
+
+/**
+ * Implementation of AOSP WifiTrackerLibProvider.
+ */
+public class WifiTrackerLibProviderImpl implements WifiTrackerLibProvider {
+
+ /**
+ * Create an instance of WifiPickerTracker.
+ */
+ @Override
+ public WifiPickerTracker createWifiPickerTracker(
+ Lifecycle lifecycle, Context context,
+ Handler mainHandler, Handler workerHandler, Clock clock,
+ long maxScanAgeMillis, long scanIntervalMillis,
+ WifiPickerTracker.WifiPickerTrackerCallback listener) {
+ return new WifiPickerTracker(
+ lifecycle, context,
+ context.getSystemService(WifiManager.class),
+ context.getSystemService(ConnectivityManager.class),
+ context.getSystemService(NetworkScoreManager.class),
+ mainHandler, workerHandler, clock,
+ maxScanAgeMillis, scanIntervalMillis,
+ listener);
+ }
+
+ /**
+ * Create an instance of NetworkDetailsTracker.
+ */
+ @Override
+ public NetworkDetailsTracker createNetworkDetailsTracker(
+ Lifecycle lifecycle, Context context,
+ Handler mainHandler, Handler workerHandler, Clock clock,
+ long maxScanAgeMillis, long scanIntervalMillis,
+ String key) {
+ return NetworkDetailsTracker.createNetworkDetailsTracker(
+ lifecycle, context,
+ context.getSystemService(WifiManager.class),
+ context.getSystemService(ConnectivityManager.class),
+ context.getSystemService(NetworkScoreManager.class),
+ mainHandler, workerHandler, clock,
+ maxScanAgeMillis, scanIntervalMillis,
+ key);
+ }
+}
diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java
index 3921488..46f4414 100644
--- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java
+++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java
@@ -24,8 +24,6 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager;
@@ -60,6 +58,7 @@
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.overlay.FeatureFactory;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -191,16 +190,15 @@
return SystemClock.elapsedRealtime();
}
};
- mWifiPickerTracker = new WifiPickerTracker(getSettingsLifecycle(), mActivity,
- mActivity.getSystemService(WifiManager.class),
- mActivity.getSystemService(ConnectivityManager.class),
- mActivity.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- this);
+ mWifiPickerTracker = FeatureFactory.getFactory(mActivity.getApplicationContext())
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(getSettingsLifecycle(), mActivity,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ this);
return inflater.inflate(R.layout.wifi_add_app_networks, container, false);
}
diff --git a/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java b/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
index d0708ea..b154a9b 100644
--- a/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
+++ b/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java
@@ -22,7 +22,6 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.HandlerThread;
@@ -42,6 +41,7 @@
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.WifiConfigUiBase2;
import com.android.settings.wifi.WifiDialog2;
import com.android.settingslib.RestrictedLockUtils;
@@ -239,18 +239,17 @@
}
};
- mNetworkDetailsTracker = NetworkDetailsTracker.createNetworkDetailsTracker(
- getSettingsLifecycle(),
- context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- getArguments().getString(KEY_CHOSEN_WIFIENTRY_KEY));
+ mNetworkDetailsTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createNetworkDetailsTracker(
+ getSettingsLifecycle(),
+ context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ getArguments().getString(KEY_CHOSEN_WIFIENTRY_KEY));
}
/**
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index cee3ccd..5c80024 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -25,8 +25,6 @@
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.wifi.EasyConnectStatusCallback;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
@@ -57,6 +55,7 @@
import androidx.lifecycle.ViewModelProviders;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.qrcode.QrCamera;
import com.android.settings.wifi.qrcode.QrDecorateView;
import com.android.wifitrackerlib.WifiEntry;
@@ -363,16 +362,15 @@
}
};
final Context context = getContext();
- mWifiPickerTracker = new WifiPickerTracker(getSettingsLifecycle(), context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- new Handler(Looper.getMainLooper()),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- null /* listener */);
+ mWifiPickerTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(getSettingsLifecycle(), context,
+ new Handler(Looper.getMainLooper()),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ null /* listener */);
// setTitle for TalkBack
if (mIsConfiguratorMode) {
diff --git a/src/com/android/settings/wifi/slice/WifiScanWorker.java b/src/com/android/settings/wifi/slice/WifiScanWorker.java
index 16c4ebc..78b0d33 100644
--- a/src/com/android/settings/wifi/slice/WifiScanWorker.java
+++ b/src/com/android/settings/wifi/slice/WifiScanWorker.java
@@ -19,8 +19,6 @@
import static com.android.settings.wifi.slice.WifiSlice.DEFAULT_EXPANDED_ROW_COUNT;
import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.HandlerThread;
@@ -34,8 +32,10 @@
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settingslib.utils.ThreadUtils;
+import com.android.wifitrackerlib.MergedCarrierEntry;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -61,7 +61,7 @@
@VisibleForTesting
final LifecycleRegistry mLifecycleRegistry;
@VisibleForTesting
- WifiPickerTracker mWifiPickerTracker;
+ protected WifiPickerTracker mWifiPickerTracker;
// Worker thread used for WifiPickerTracker work
private final HandlerThread mWorkerThread;
@@ -78,16 +78,15 @@
return SystemClock.elapsedRealtime();
}
};
- mWifiPickerTracker = new WifiPickerTracker(getLifecycle(), context,
- context.getSystemService(WifiManager.class),
- context.getSystemService(ConnectivityManager.class),
- context.getSystemService(NetworkScoreManager.class),
- ThreadUtils.getUiThreadHandler(),
- mWorkerThread.getThreadHandler(),
- elapsedRealtimeClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- this);
+ mWifiPickerTracker = FeatureFactory.getFactory(context)
+ .getWifiTrackerLibProvider()
+ .createWifiPickerTracker(getLifecycle(), context,
+ ThreadUtils.getUiThreadHandler(),
+ mWorkerThread.getThreadHandler(),
+ elapsedRealtimeClock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ this);
mLifecycleRegistry.markState(Lifecycle.State.INITIALIZED);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
@@ -199,4 +198,18 @@
}
super.updateResults(resultList);
}
+
+ public void setCarrierNetworkEnabled(boolean enable) {
+ final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry();
+ if (mergedCarrierEntry != null) {
+ mergedCarrierEntry.setEnabled(enable);
+ }
+ }
+
+ public void connectCarrierNetwork() {
+ final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry();
+ if (mergedCarrierEntry != null && mergedCarrierEntry.canConnect()) {
+ mergedCarrierEntry.connect(null /* ConnectCallback */);
+ }
+ }
}
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index 7d009f4..898de56 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -147,7 +147,7 @@
return builder;
}
- private ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) {
+ protected ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) {
final CharSequence title = wifiSliceItem.getTitle();
final IconCompat levelIcon = getWifiSliceItemLevelIcon(wifiSliceItem);
final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
@@ -183,7 +183,7 @@
private IconCompat getEndIcon(WifiSliceItem wifiSliceItem) {
if (wifiSliceItem.getConnectedState() != WifiEntry.CONNECTED_STATE_DISCONNECTED) {
- return null;
+ return IconCompat.createWithResource(mContext, R.drawable.ic_settings_24dp);
}
if (wifiSliceItem.getSecurity() != WifiEntry.SECURITY_NONE) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationCapabilitiesTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationCapabilitiesTest.java
new file mode 100644
index 0000000..ac7f073
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationCapabilitiesTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link MagnificationCapabilities} */
+@RunWith(RobolectricTestRunner.class)
+public final class MagnificationCapabilitiesTest {
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void getCapabilities_windowMode_expectedCapabilities() {
+ MagnificationCapabilities.setCapabilities(mContext,
+ MagnificationCapabilities.MagnificationMode.WINDOW);
+
+ final int windowCapabilities = MagnificationCapabilities.getCapabilities(mContext);
+ assertThat(windowCapabilities).isEqualTo(
+ MagnificationCapabilities.MagnificationMode.WINDOW);
+
+ }
+
+ @Test
+ public void getSummary_fullScreenMode_expectedSummary() {
+ final int fullScreenCapabilities = MagnificationCapabilities.MagnificationMode.FULLSCREEN;
+
+ final String actualString = MagnificationCapabilities.getSummary(mContext,
+ fullScreenCapabilities);
+
+ final String expectedString = mContext.getString(
+ R.string.accessibility_magnification_area_settings_full_screen_summary);
+ assertThat(actualString).isEqualTo(expectedString);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
deleted file mode 100644
index 4cc17dc..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
+++ /dev/null
@@ -1,49 +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.accessibility;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-/** TODO(b/170970675): Update and add tests after ColorDisplayService work is integrated */
-public class ReduceBrightColorsIntensityPreferenceControllerTest {
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private final ReduceBrightColorsIntensityPreferenceController mPreferenceController =
- new ReduceBrightColorsIntensityPreferenceController(mContext,
- "rbc_intensity");
-
- @Test
- public void isAvailable_configuredRbcAvailable_enabledRbc_shouldReturnTrue() {
- assertThat(mPreferenceController.isAvailable()).isTrue();
- }
- @Test
- public void isAvailable_configuredRbcAvailable_disabledRbc_shouldReturnFalse() {
- assertThat(mPreferenceController.isAvailable()).isTrue();
- }
- @Test
- public void isAvailable_configuredRbcUnavailable_enabledRbc_shouldReturnFalse() {
- assertThat(mPreferenceController.isAvailable()).isTrue();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
new file mode 100644
index 0000000..0eaf008
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+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.Vibrator;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link RingVibrationIntensityPreferenceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class RingVibrationIntensityPreferenceControllerTest {
+ @Mock
+ private Vibrator mVibrator;
+
+ private RingVibrationIntensityPreferenceController mController;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ doReturn(mVibrator).when(mContext).getSystemService(Vibrator.class);
+ mController = new RingVibrationIntensityPreferenceController(mContext);
+ }
+
+ @Test
+ public void getAvailabilityStatus_available() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getDefaultIntensity_success() {
+ doReturn(/* toBeReturned= */ 5).when(mVibrator).getDefaultRingVibrationIntensity();
+
+ assertThat(mController.getDefaultIntensity()).isEqualTo(/* expected= */ 5);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextAndDisplayFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TextAndDisplayFragmentTest.java
new file mode 100644
index 0000000..96756ecd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TextAndDisplayFragmentTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.testutils.XmlTestUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class TextAndDisplayFragmentTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks = TextAndDisplayFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_text_and_display);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickPreferenceControllerTest.java
new file mode 100644
index 0000000..edc2992
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickPreferenceControllerTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.accessibility;
+
+import static android.content.Context.MODE_PRIVATE;
+
+import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.AUTOCLICK_CUSTOM_MODE;
+import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.AUTOCLICK_OFF_MODE;
+import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.KEY_AUTOCLICK_CUSTOM_SEEKBAR;
+import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.KEY_DELAY_MODE;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.provider.Settings.Secure;
+
+import androidx.lifecycle.LifecycleObserver;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.accessibility.ToggleAutoclickPreferenceController.OnChangeListener;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.RadioButtonPreference;
+import com.android.settingslib.widget.RadioButtonPreference.OnClickListener;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.Map;
+
+/** Tests for {@link ToggleAutoclickPreferenceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class ToggleAutoclickPreferenceControllerTest {
+
+ @Mock
+ private PreferenceScreen mScreen;
+
+ @Mock
+ private RadioButtonPreference mDelayModePref;
+
+ @Mock
+ private OnChangeListener mOnChangeListener;
+
+ @Mock
+ private LayoutPreference mSeekBarPref;
+
+ @Mock
+ private Map<String, Integer> mAccessibilityAutoclickKeyToValueMap;
+
+ private ToggleAutoclickPreferenceController mController;
+ private SharedPreferences mSharedPreferences;
+ private final String mPrefKey = "prefKey";
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mController = new ToggleAutoclickPreferenceController(mContext, mPrefKey);
+ mController.mAccessibilityAutoclickKeyToValueMap = mAccessibilityAutoclickKeyToValueMap;
+ mSharedPreferences =
+ mContext.getSharedPreferences(mContext.getPackageName(), MODE_PRIVATE);
+
+ when(mScreen.findPreference(mPrefKey)).thenReturn(mDelayModePref);
+ when(mScreen.findPreference(KEY_AUTOCLICK_CUSTOM_SEEKBAR)).thenReturn(mSeekBarPref);
+ when(mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey())).thenReturn(
+ AUTOCLICK_OFF_MODE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_available() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void setClickListenerOnDelayModePref_whenDisplay_success() {
+ mController.displayPreference(mScreen);
+
+ verify(mDelayModePref).setOnClickListener(any(OnClickListener.class));
+ }
+
+ @Test
+ public void constructor_hasLifecycle_addObserver() {
+ final Lifecycle lifecycle = mock(Lifecycle.class);
+ mController = new ToggleAutoclickPreferenceController(mContext, lifecycle, mPrefKey);
+
+ verify(lifecycle).addObserver(any(LifecycleObserver.class));
+ }
+
+ @Test
+ public void onRadioButtonClicked_offMode_disableAutoClick() {
+ when(mAccessibilityAutoclickKeyToValueMap.get(mPrefKey)).thenReturn(AUTOCLICK_OFF_MODE);
+
+ mController.displayPreference(mScreen);
+ mController.onRadioButtonClicked(any(RadioButtonPreference.class));
+ final boolean isEnabled = Secure.getInt(mContext.getContentResolver(),
+ Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, /* def= */ 0) == 1;
+ final int delayMs = Secure.getInt(mContext.getContentResolver(),
+ Secure.ACCESSIBILITY_AUTOCLICK_DELAY, /* def= */ 0);
+ final int keyDelayMode = mSharedPreferences.getInt(KEY_DELAY_MODE, AUTOCLICK_CUSTOM_MODE);
+
+ assertThat(keyDelayMode).isEqualTo(AUTOCLICK_OFF_MODE);
+ assertThat(delayMs).isEqualTo(/* expected= */ 0);
+ assertThat(isEnabled).isFalse();
+ }
+
+ @Test
+ public void onRadioButtonClicked_customMode_enableAutoClick() {
+ when(mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey())).thenReturn(
+ AUTOCLICK_CUSTOM_MODE);
+ when(mAccessibilityAutoclickKeyToValueMap.get(mPrefKey)).thenReturn(AUTOCLICK_CUSTOM_MODE);
+
+ mController.displayPreference(mScreen);
+ mController.onRadioButtonClicked(any(RadioButtonPreference.class));
+ final boolean isEnabled = Secure.getInt(mContext.getContentResolver(),
+ Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, /* def= */ 0) == 1;
+ final int keyDelayMode = mSharedPreferences.getInt(KEY_DELAY_MODE, AUTOCLICK_CUSTOM_MODE);
+
+ assertThat(keyDelayMode).isEqualTo(AUTOCLICK_CUSTOM_MODE);
+ assertThat(isEnabled).isTrue();
+ }
+
+ @Test
+ public void onRadioButtonClicked_hasListener_runOnCheckedChanged() {
+ when(mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey())).thenReturn(
+ AUTOCLICK_CUSTOM_MODE);
+ when(mAccessibilityAutoclickKeyToValueMap.get(mPrefKey)).thenReturn(AUTOCLICK_CUSTOM_MODE);
+
+ mController.setOnChangeListener(mOnChangeListener);
+ mController.displayPreference(mScreen);
+ mController.onRadioButtonClicked(any(RadioButtonPreference.class));
+
+ verify(mOnChangeListener).onCheckedChanged(mDelayModePref);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/VideoPlayerTest.java b/tests/robotests/src/com/android/settings/accessibility/VideoPlayerTest.java
new file mode 100644
index 0000000..57df456
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/VideoPlayerTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.media.MediaPlayer;
+import android.view.Surface;
+import android.view.TextureView;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.accessibility.VideoPlayer.State;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link VideoPlayer}. */
+@RunWith(RobolectricTestRunner.class)
+public class VideoPlayerTest {
+
+ @Mock
+ private MediaPlayer mMediaPlayer;
+
+ @Mock
+ private TextureView mTextureView;
+
+ @Mock
+ private Surface mSurface;
+
+ private VideoPlayer mVideoPlayer;
+
+ @Before
+ public void initVideoPlayer() {
+ MockitoAnnotations.initMocks(this);
+
+ final int videoRes = 0;
+ final Context context = ApplicationProvider.getApplicationContext();
+
+ mVideoPlayer = spy(VideoPlayer.create(context, videoRes, mTextureView));
+ mVideoPlayer.mMediaPlayer = mMediaPlayer;
+ mVideoPlayer.mAnimationSurface = mSurface;
+ }
+
+ @Test
+ public void setSurfaceTextureListener_success() {
+ verify(mTextureView).setSurfaceTextureListener(any());
+ }
+
+ @Test
+ public void onPlayerPaused_startedState_pause() {
+ mVideoPlayer.mMediaPlayerState = State.STARTED;
+
+ mVideoPlayer.pause();
+
+ assertThat(mVideoPlayer.mMediaPlayerState).isEqualTo(State.PAUSED);
+ verify(mMediaPlayer).pause();
+ }
+
+ @Test
+ public void onPlayerResumed_pausedState_start() {
+ mVideoPlayer.mMediaPlayerState = State.PAUSED;
+
+ mVideoPlayer.resume();
+
+ assertThat(mVideoPlayer.mMediaPlayerState).isEqualTo(State.STARTED);
+ verify(mMediaPlayer).start();
+ }
+
+ @Test
+ public void onPlayerReleased_stoppedState_release() {
+ mVideoPlayer.mMediaPlayerState = State.STOPPED;
+
+ mVideoPlayer.release();
+
+ assertThat(mVideoPlayer.mMediaPlayerState).isEqualTo(State.END);
+ verify(mMediaPlayer).release();
+ verify(mSurface).release();
+ }
+
+ @Test
+ public void onSurfaceTextureDestroyed_preparedState_release() {
+ mVideoPlayer.mMediaPlayerState = State.PREPARED;
+
+ mVideoPlayer.onSurfaceTextureDestroyed(any());
+
+ assertThat(mVideoPlayer.mMediaPlayerState).isEqualTo(State.END);
+ verify(mMediaPlayer).release();
+ verify(mSurface).release();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetailsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetailsTest.java
deleted file mode 100644
index 26a78d0..0000000
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetailsTest.java
+++ /dev/null
@@ -1,66 +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.applications.specialaccess.notificationaccess;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.testutils.FakeFeatureFactory;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class NotificationAccessDetailsTest {
-
- private Context mContext;
- private FakeFeatureFactory mFeatureFactory;
- private NotificationAccessDetails mFragment;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFeatureFactory = FakeFeatureFactory.setupForTest();
- mFragment = spy(new NotificationAccessDetails());
- mContext = RuntimeEnvironment.application;
- doReturn(mContext).when(mFragment).getContext();
-
- }
-
- @Test
- public void logSpecialPermissionChange() {
- mFragment.logSpecialPermissionChange(true, "app");
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext,
- MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW,
- "app");
-
- mFragment.logSpecialPermissionChange(false, "app");
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext,
- MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_NOTIVIEW_DENY,
- "app");
- }
-}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSuggestionActivityTest.java
index ea5511d..d3a1fc1 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSuggestionActivityTest.java
@@ -24,12 +24,18 @@
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.biometrics.SensorProperties;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.view.View;
import android.widget.Button;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowFingerprintManager;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
+import com.android.settings.testutils.shadow.ShadowStorageManager;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.google.android.setupcompat.PartnerCustomizationLayout;
@@ -46,18 +52,39 @@
import org.robolectric.shadows.ShadowActivity;
import org.robolectric.shadows.ShadowKeyguardManager;
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowLockPatternUtils.class, ShadowUserManager.class})
-public class FingerprintSuggestionActivityTest {
+import java.util.ArrayList;
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {
+ ShadowFingerprintManager.class,
+ ShadowLockPatternUtils.class,
+ ShadowStorageManager.class,
+ ShadowUserManager.class
+})
+public class FingerprintSuggestionActivityTest {
+ private FingerprintSuggestionActivity mActivity;
private ActivityController<FingerprintSuggestionActivity> mController;
@Before
public void setUp() {
+ Shadows.shadowOf(application.getPackageManager())
+ .setSystemFeature(PackageManager.FEATURE_FINGERPRINT, true);
+
+ final FingerprintSensorPropertiesInternal prop = new FingerprintSensorPropertiesInternal(
+ 0 /* sensorId */,
+ SensorProperties.STRENGTH_STRONG,
+ 5 /* maxEnrollmentsPerUser */,
+ FingerprintSensorProperties.TYPE_REAR,
+ true /* resetLockoutRequiresHardwareAuthToken */);
+ final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
+ props.add(prop);
+ ShadowFingerprintManager.setSensorProperties(props);
+
FakeFeatureFactory.setupForTest();
final Intent intent = new Intent();
mController = Robolectric.buildActivity(FingerprintSuggestionActivity.class, intent);
+ mActivity = mController.get();
}
@Test
@@ -66,8 +93,7 @@
mController.create().resume();
- PartnerCustomizationLayout layout =
- mController.get().findViewById(R.id.setup_wizard_layout);
+ PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
final Button cancelButton =
layout.getMixin(FooterBarMixin.class).getSecondaryButtonView();
assertThat(cancelButton.getText().toString()).isEqualTo("Cancel");
@@ -75,8 +101,8 @@
.isEqualTo(View.VISIBLE);
cancelButton.performClick();
- ShadowActivity shadowActivity = Shadows.shadowOf(mController.get());
- assertWithMessage("Is finishing").that(mController.get().isFinishing()).isTrue();
+ ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
+ assertWithMessage("Is finishing").that(mActivity.isFinishing()).isTrue();
assertWithMessage("Result code").that(shadowActivity.getResultCode())
.isEqualTo(Activity.RESULT_CANCELED);
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
index 6103b2b..24d4d33 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
@@ -24,7 +24,6 @@
import com.android.settings.core.PreferenceControllerListHelper;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.DatabaseIndexingUtils;
-import com.android.settingslib.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
import org.robolectric.RuntimeEnvironment;
diff --git a/tests/robotests/src/com/android/settings/datausage/AppPrefLoaderTest.java b/tests/robotests/src/com/android/settings/datausage/AppPrefLoaderTest.java
deleted file mode 100644
index 5efeaf2..0000000
--- a/tests/robotests/src/com/android/settings/datausage/AppPrefLoaderTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.drawable.Drawable;
-import android.util.ArraySet;
-
-import androidx.preference.Preference;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class AppPrefLoaderTest {
-
- @Mock
- private PackageManager mPackageManager;
-
- private AppPrefLoader mLoader;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- final ArraySet<String> pkgs = new ArraySet<>(2);
- pkgs.add("pkg0");
- pkgs.add("pkg1");
- mLoader = new AppPrefLoader(RuntimeEnvironment.application, pkgs, mPackageManager);
- }
-
- @Test
- public void loadInBackground_packageNotFound_shouldReturnEmptySet()
- throws NameNotFoundException {
- when(mPackageManager.getApplicationInfo(anyString(), anyInt()))
- .thenThrow(new NameNotFoundException());
-
- assertThat(mLoader.loadInBackground()).isEmpty();
- }
-
- @Test
- public void loadInBackground_shouldReturnPreference() throws NameNotFoundException {
- ApplicationInfo info = mock(ApplicationInfo.class);
- when(mPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(info);
- final Drawable drawable = mock(Drawable.class);
- final String label = "Label1";
- when(info.loadIcon(mPackageManager)).thenReturn(drawable);
- when(info.loadLabel(mPackageManager)).thenReturn(label);
-
- Preference preference = mLoader.loadInBackground().valueAt(0);
- assertThat(preference.getTitle()).isEqualTo(label);
- assertThat(preference.getIcon()).isEqualTo(drawable);
- assertThat(preference.isSelectable()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/datausage/CellDataPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/CellDataPreferenceTest.java
deleted file mode 100644
index c0b12dc..0000000
--- a/tests/robotests/src/com/android/settings/datausage/CellDataPreferenceTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.network.ProxySubscriptionManager;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class CellDataPreferenceTest {
-
- @Mock
- private ProxySubscriptionManager mProxySubscriptionMgr;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private SubscriptionInfo mSubInfo;
-
- private Context mContext;
- private PreferenceViewHolder mHolder;
- private CellDataPreference mPreference;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mPreference = new CellDataPreference(mContext, null) {
- @Override
- ProxySubscriptionManager getProxySubscriptionManager() {
- return mProxySubscriptionMgr;
- }
- @Override
- SubscriptionInfo getActiveSubscriptionInfo(int subId) {
- return mSubInfo;
- }
- };
- doNothing().when(mSubscriptionManager).setDefaultDataSubId(anyInt());
- doReturn(mSubscriptionManager).when(mProxySubscriptionMgr).get();
- doNothing().when(mProxySubscriptionMgr).addActiveSubscriptionsListener(any());
- doNothing().when(mProxySubscriptionMgr).removeActiveSubscriptionsListener(any());
-
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- final View view = inflater.inflate(mPreference.getLayoutResource(),
- new LinearLayout(mContext), false);
-
- mHolder = PreferenceViewHolder.createInstanceForTests(view);
- }
-
- @Test
- public void noActiveSub_shouldDisable() {
- mSubInfo = null;
- mPreference.mOnSubscriptionsChangeListener.onChanged();
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void hasActiveSub_shouldEnable() {
- mPreference.mOnSubscriptionsChangeListener.onChanged();
- assertThat(mPreference.isEnabled()).isTrue();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
deleted file mode 100644
index 6c89201..0000000
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.net.NetworkPolicy;
-import android.net.NetworkTemplate;
-
-import com.android.settingslib.net.DataUsageController.DataUsageInfo;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataUsageInfoControllerTest {
-
- private static final int NEGATIVE = -1;
- private static final int ZERO = 0;
- private static final int POSITIVE_SMALL = 1;
- private static final int POSITIVE_LARGE = 5;
-
- private DataUsageInfoController mInfoController;
- private DataUsageInfo info;
-
- @Before
- public void setUp() {
- mInfoController = new DataUsageInfoController();
- info = new DataUsageInfo();
- }
-
- @Test
- public void testLowUsageLowWarning_LimitUsed() {
- info.warningLevel = POSITIVE_SMALL;
- info.limitLevel = POSITIVE_LARGE;
- info.usageLevel = POSITIVE_SMALL;
- assertThat(mInfoController.getSummaryLimit(info)).isEqualTo(info.limitLevel);
- }
-
- @Test
- public void testLowUsageEqualWarning_LimitUsed() {
- info.warningLevel = POSITIVE_LARGE;
- info.limitLevel = POSITIVE_LARGE;
- info.usageLevel = POSITIVE_SMALL;
- assertThat(mInfoController.getSummaryLimit(info)).isEqualTo(info.limitLevel);
- }
-
- @Test
- public void testNoLimitNoUsage_WarningUsed() {
- info.warningLevel = POSITIVE_LARGE;
- info.limitLevel = ZERO;
- info.usageLevel = ZERO;
- assertThat(mInfoController.getSummaryLimit(info)).isEqualTo(info.warningLevel);
- }
-
- @Test
- public void testNoLimitLowUsage_WarningUsed() {
- info.warningLevel = POSITIVE_LARGE;
- info.limitLevel = ZERO;
- info.usageLevel = POSITIVE_SMALL;
- assertThat(mInfoController.getSummaryLimit(info)).isEqualTo(info.warningLevel);
- }
-
- @Test
- public void testLowWarningNoLimit_UsageUsed() {
- info.warningLevel = POSITIVE_SMALL;
- info.limitLevel = ZERO;
- info.usageLevel = POSITIVE_LARGE;
- assertThat(mInfoController.getSummaryLimit(info)).isEqualTo(info.usageLevel);
- }
-
- @Test
- public void testLowWarningLowLimit_UsageUsed() {
- info.warningLevel = POSITIVE_SMALL;
- info.limitLevel = POSITIVE_SMALL;
- info.usageLevel = POSITIVE_LARGE;
- assertThat(mInfoController.getSummaryLimit(info)).isEqualTo(info.usageLevel);
- }
-
- private NetworkPolicy getDefaultNetworkPolicy() {
- NetworkTemplate template =
- new NetworkTemplate(NetworkTemplate.MATCH_WIFI_WILDCARD, null, null);
- int cycleDay = -1;
- String cycleTimezone = "UTC";
- long warningBytes = -1;
- long limitBytes = -1;
- return new NetworkPolicy(template, cycleDay, cycleTimezone, warningBytes, limitBytes, true);
- }
-
- @Test
- public void testNullArguments_NoError() {
- mInfoController.updateDataLimit(null, null);
- mInfoController.updateDataLimit(info, null);
- mInfoController.updateDataLimit(null, getDefaultNetworkPolicy());
- }
-
- @Test
- public void testNegativeWarning_UpdatedToZero() {
- NetworkPolicy policy = getDefaultNetworkPolicy();
- policy.warningBytes = NEGATIVE;
- mInfoController.updateDataLimit(info, policy);
- assertThat(info.warningLevel).isEqualTo(ZERO);
- }
-
- @Test
- public void testWarningZero_UpdatedToZero() {
- NetworkPolicy policy = getDefaultNetworkPolicy();
- policy.warningBytes = ZERO;
- mInfoController.updateDataLimit(info, policy);
- assertThat(info.warningLevel).isEqualTo(ZERO);
- }
-
- @Test
- public void testWarningPositive_UpdatedToWarning() {
- NetworkPolicy policy = getDefaultNetworkPolicy();
- policy.warningBytes = POSITIVE_SMALL;
- mInfoController.updateDataLimit(info, policy);
- assertThat(info.warningLevel).isEqualTo(policy.warningBytes);
- }
-
- @Test
- public void testLimitNegative_UpdatedToZero() {
- NetworkPolicy policy = getDefaultNetworkPolicy();
- policy.limitBytes = NEGATIVE;
- mInfoController.updateDataLimit(info, policy);
- assertThat(info.limitLevel).isEqualTo(ZERO);
- }
-
- @Test
- public void testLimitZero_UpdatedToZero() {
- NetworkPolicy policy = getDefaultNetworkPolicy();
- policy.limitBytes = ZERO;
- mInfoController.updateDataLimit(info, policy);
- assertThat(info.limitLevel).isEqualTo(ZERO);
- }
-
- @Test
- public void testLimitPositive_UpdatedToLimit() {
- NetworkPolicy policy = getDefaultNetworkPolicy();
- policy.limitBytes = POSITIVE_SMALL;
- mInfoController.updateDataLimit(info, policy);
- assertThat(info.limitLevel).isEqualTo(policy.limitBytes);
- }
-}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
deleted file mode 100644
index 5f40925..0000000
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.graphics.Typeface;
-import android.net.ConnectivityManager;
-import android.net.NetworkTemplate;
-import android.os.Bundle;
-import android.telephony.SubscriptionManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.fragment.app.FragmentActivity;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.SubSettings;
-import com.android.settingslib.Utils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowActivity;
-
-import java.util.concurrent.TimeUnit;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataUsageSummaryPreferenceTest {
-
- private static final long CYCLE_DURATION_MILLIS = 1000000000L;
- private static final long UPDATE_LAG_MILLIS = 10000000L;
- private static final String FAKE_CARRIER = "z-mobile";
-
- private Activity mActivity;
- private PreferenceViewHolder mHolder;
- private DataUsageSummaryPreference mSummaryPreference;
- private TextView mUsageTitle;
- private TextView mCycleTime;
- private TextView mCarrierInfo;
- private TextView mDataLimits;
- private TextView mDataUsed;
- private TextView mDataRemaining;
- private Button mLaunchButton;
- private LinearLayout mLabelBar;
- private TextView mLabel1;
- private TextView mLabel2;
- private ProgressBar mProgressBar;
-
- private long mCycleEnd;
- private long mUpdateTime;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mActivity = spy(Robolectric.setupActivity(Activity.class));
- mSummaryPreference = new DataUsageSummaryPreference(mActivity, null /* attrs */);
- LayoutInflater inflater = LayoutInflater.from(mActivity);
- View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */,
- false /* attachToRoot */);
-
- mHolder = spy(PreferenceViewHolder.createInstanceForTests(view));
-
- final long now = System.currentTimeMillis();
- mCycleEnd = now + CYCLE_DURATION_MILLIS;
- mUpdateTime = now - UPDATE_LAG_MILLIS;
- }
-
- @Test
- public void testSetUsageInfo_withLaunchIntent_launchButtonShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- null /* launchIntent */);
-
- bindViewHolder();
- assertThat(mLaunchButton.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testSetUsageInfo_withDataPlans_carrierInfoShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void testSetUsageInfo_withNoDataPlans_carrierInfoNotShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testCarrierUpdateTime_shouldFormatDaysCorrectly() {
- int baseUnit = 2;
- int smudge = 6;
- final long updateTime = System.currentTimeMillis()
- - TimeUnit.DAYS.toMillis(baseUnit) - TimeUnit.HOURS.toMillis(smudge);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getText().toString())
- .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " days ago");
- }
-
- @Test
- public void testCarrierUpdateTime_shouldFormatHoursCorrectly() {
- int baseUnit = 2;
- int smudge = 6;
- final long updateTime = System.currentTimeMillis()
- - TimeUnit.HOURS.toMillis(baseUnit) - TimeUnit.MINUTES.toMillis(smudge);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getText().toString())
- .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " hr ago");
- }
-
- @Test
- public void testCarrierUpdateTime_shouldFormatMinutesCorrectly() {
- int baseUnit = 2;
- int smudge = 6;
- final long updateTime = System.currentTimeMillis()
- - TimeUnit.MINUTES.toMillis(baseUnit) - TimeUnit.SECONDS.toMillis(smudge);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getText().toString())
- .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " min ago");
- }
-
- @Test
- public void testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly() {
- final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getText().toString())
- .isEqualTo("Updated by " + FAKE_CARRIER + " just now");
- }
-
- @Test
- public void testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow() {
- final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
- 1 /* numPlans */, new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getText().toString())
- .isEqualTo("Updated just now");
- }
-
- @Test
- public void testCarrierUpdateTimeWithNoCarrier_shouldFormatTime() {
- final long updateTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
- 1 /* numPlans */, new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getText().toString())
- .isEqualTo("Updated 2 min ago");
- }
-
- @Test
- public void setUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont() {
- final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
- Utils.getColorAttrDefaultColor(mActivity, android.R.attr.textColorSecondary));
- assertThat(mCarrierInfo.getTypeface()).isEqualTo(Typeface.SANS_SERIF);
- }
-
- @Test
- public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont() {
- final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7);
- mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo(
- Utils.getColorAttrDefaultColor(mActivity, android.R.attr.colorError));
- assertThat(mCarrierInfo.getTypeface()).isEqualTo(
- DataUsageSummaryPreference.SANS_SERIF_MEDIUM);
- }
-
- @Test
- public void testSetUsageInfo_withNoDataPlans_usageTitleNotShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mUsageTitle.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testSetUsageInfo_withMultipleDataPlans_usageTitleShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 2 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mUsageTitle.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void testSetUsageInfo_cycleRemainingTimeIsLessOneDay() {
- // just under one day
- final long cycleEnd = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(23);
- mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCycleTime.getText()).isEqualTo(
- mActivity.getString(R.string.billing_cycle_less_than_one_day_left));
- }
-
- @Test
- public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft() {
- final long cycleEnd = System.currentTimeMillis() - 1L;
- mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCycleTime.getText()).isEqualTo(
- mActivity.getString(R.string.billing_cycle_none_left));
- }
-
- @Test
- public void testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals() {
- final int daysLeft = 3;
- final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
- + TimeUnit.HOURS.toMillis(1);
- mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
-
- bindViewHolder();
- assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCycleTime.getText()).isEqualTo(daysLeft + " days left");
- }
-
- @Test
- public void testSetLimitInfo_withLimitInfo_dataLimitsShown() {
- final String limitText = "test limit text";
- mSummaryPreference.setLimitInfo(limitText);
-
- bindViewHolder();
- assertThat(mDataLimits.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mDataLimits.getText()).isEqualTo(limitText);
- }
-
- @Test
- public void testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown() {
- mSummaryPreference.setLimitInfo(null);
-
- bindViewHolder();
- assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testSetLimitInfo_withEmptyLimitInfo_dataLimitsNotShown() {
- final String emptyLimitText = "";
- mSummaryPreference.setLimitInfo(emptyLimitText);
-
- bindViewHolder();
- assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testSetChartEnabledFalse_hidesLabelBar() {
- setValidLabels();
- mSummaryPreference.setChartEnabled(false);
-
- bindViewHolder();
- assertThat(mLabelBar.getVisibility()).isEqualTo(View.GONE);
- assertThat(mProgressBar.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testSetEmptyLabels_hidesLabelBar() {
- mSummaryPreference.setLabels("", "");
-
- bindViewHolder();
- assertThat(mLabelBar.getVisibility()).isEqualTo(View.GONE);
- assertThat(mProgressBar.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testLabelBar_isVisible_whenLabelsSet() {
- setValidLabels();
- //mChartEnabled defaults to true
-
- bindViewHolder();
- assertThat(mLabelBar.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mProgressBar.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void testSetProgress_updatesProgressBar() {
- setValidLabels();
- mSummaryPreference.setProgress(.5f);
-
- bindViewHolder();
- assertThat(mProgressBar.getProgress()).isEqualTo(50);
- }
-
- private void setValidLabels() {
- mSummaryPreference.setLabels("0.0 GB", "5.0 GB");
- }
-
- @Test
- public void testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
- mSummaryPreference.setUsageNumbers(
- BillingCycleSettings.MIB_IN_BYTES,
- 10 * BillingCycleSettings.MIB_IN_BYTES,
- true /* hasMobileData */);
-
- bindViewHolder();
- assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used");
- assertThat(mDataRemaining.getText().toString()).isEqualTo("9.00 MB left");
- assertThat(mDataRemaining.getVisibility()).isEqualTo(View.VISIBLE);
- final int colorId = Utils.getColorAttrDefaultColor(mActivity, android.R.attr.colorAccent);
- assertThat(mDataRemaining.getCurrentTextColor()).isEqualTo(colorId);
- }
-
- @Test
- public void testSetUsageInfo_withDataOverusage() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
- mSummaryPreference.setUsageNumbers(
- 11 * BillingCycleSettings.MIB_IN_BYTES,
- 10 * BillingCycleSettings.MIB_IN_BYTES,
- true /* hasMobileData */);
-
- bindViewHolder();
- assertThat(mDataUsed.getText().toString()).isEqualTo("11.00 MB used");
- assertThat(mDataRemaining.getText().toString()).isEqualTo("1.00 MB over");
- final int colorId = Utils.getColorAttrDefaultColor(mActivity, android.R.attr.colorError);
- assertThat(mDataRemaining.getCurrentTextColor()).isEqualTo(colorId);
- }
-
- @Test
- public void testSetUsageInfo_withUsageInfo_dataUsageShown() {
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
- mSummaryPreference.setUsageNumbers(
- BillingCycleSettings.MIB_IN_BYTES, -1L, true /* hasMobileData */);
-
- bindViewHolder();
- assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used");
- assertThat(mDataRemaining.getText()).isEqualTo("");
- }
-
- @Test
- public void testSetAppIntent_toMdpApp_intentCorrect() {
- final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class);
- final Intent intent = new Intent(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
- intent.setPackage("test-owner.example.com");
- intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, 42);
-
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- intent);
-
- bindViewHolder();
- assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mLaunchButton.getText())
- .isEqualTo(mActivity.getString(R.string.launch_mdp_app_text));
-
- mLaunchButton.callOnClick();
- ShadowActivity shadowActivity = Shadows.shadowOf(activity);
- Intent startedIntent = shadowActivity.getNextStartedActivity();
- assertThat(startedIntent.getAction())
- .isEqualTo(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
- assertThat(startedIntent.getPackage()).isEqualTo("test-owner.example.com");
- assertThat(startedIntent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, -1))
- .isEqualTo(42);
- }
-
- @Test
- public void testSetUsageInfo_withOverflowStrings_dataRemainingNotShown() {
- LayoutInflater inflater = LayoutInflater.from(mActivity);
- View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */,
- false /* attachToRoot */);
-
- TextView dataUsed = spy(new TextView(mActivity));
- TextView dataRemaining = spy(new TextView(mActivity));
- doReturn(dataUsed).when(mHolder).findViewById(R.id.data_usage_view);
- doReturn(dataRemaining).when(mHolder).findViewById(R.id.data_remaining_view);
-
- mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
- new Intent());
- mSummaryPreference.setUsageNumbers(
- BillingCycleSettings.MIB_IN_BYTES,
- 10 * BillingCycleSettings.MIB_IN_BYTES,
- true /* hasMobileData */);
-
- when(mActivity.getResources()).thenCallRealMethod();
- when(mActivity.getText(R.string.data_used_formatted))
- .thenReturn("^1 ^2 used with long trailing text");
- when(mActivity.getText(R.string.data_remaining)).thenReturn("^1 left");
-
- bindViewHolder();
-
- doReturn(500).when(dataUsed).getMeasuredWidth();
- doReturn(500).when(dataRemaining).getMeasuredWidth();
-
- assertThat(dataRemaining.getVisibility()).isEqualTo(View.VISIBLE);
-
- MeasurableLinearLayout layout =
- (MeasurableLinearLayout) mHolder.findViewById(R.id.usage_layout);
- layout.measure(
- View.MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.EXACTLY),
- View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
-
- assertThat(dataUsed.getText().toString()).isEqualTo("1.00 MB used with long trailing text");
- assertThat(dataRemaining.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void testSetWifiMode_withUsageInfo_dataUsageShown() {
- final int daysLeft = 3;
- final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
- + TimeUnit.HOURS.toMillis(1);
- final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class);
- mSummaryPreference = spy(mSummaryPreference);
- mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
- new Intent());
- mSummaryPreference.setUsageNumbers(1000000L, -1L, true);
- final String cycleText = "The quick fox";
- mSummaryPreference.setWifiMode(true /* isWifiMode */, cycleText, false /* isSingleWifi */);
- doReturn(200L).when(mSummaryPreference).getHistoricalUsageLevel();
-
- bindViewHolder();
- assertThat(mUsageTitle.getText().toString())
- .isEqualTo(mActivity.getString(R.string.data_usage_wifi_title));
- assertThat(mUsageTitle.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mCycleTime.getText()).isEqualTo(cycleText);
- assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.GONE);
- assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE);
- assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mLaunchButton.getText())
- .isEqualTo(mActivity.getString(R.string.launch_wifi_text));
-
- mLaunchButton.callOnClick();
- ShadowActivity shadowActivity = Shadows.shadowOf(activity);
- Intent startedIntent = shadowActivity.getNextStartedActivity();
- assertThat(startedIntent.getComponent()).isEqualTo(new ComponentName("com.android.settings",
- SubSettings.class.getName()));
-
- final Bundle expect = new Bundle(1);
- expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
- NetworkTemplate.buildTemplateWifiWildcard());
- final Bundle actual = startedIntent
- .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
- assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE))
- .isEqualTo(NetworkTemplate.buildTemplateWifiWildcard());
-
- assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
- .isEqualTo(R.string.wifi_data_usage);
- }
-
- @Test
- public void testSetWifiMode_noUsageInfo_shouldDisableLaunchButton() {
- mSummaryPreference = spy(mSummaryPreference);
- mSummaryPreference.setWifiMode(true /* isWifiMode */, "Test cycle text",
- false /* isSingleWifi */);
- doReturn(0L).when(mSummaryPreference).getHistoricalUsageLevel();
-
- bindViewHolder();
-
- assertThat(mLaunchButton.isEnabled()).isFalse();
- }
-
- @Test
- public void launchWifiDataUsage_shouldSetWifiNetworkTypeInIntentExtra() {
- mSummaryPreference.launchWifiDataUsage(mActivity);
-
- final Intent launchIntent = Shadows.shadowOf(mActivity).getNextStartedActivity();
- final Bundle args =
- launchIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
-
- assertThat(args.getInt(DataUsageList.EXTRA_NETWORK_TYPE))
- .isEqualTo(ConnectivityManager.TYPE_WIFI);
- }
-
- private void bindViewHolder() {
- mSummaryPreference.onBindViewHolder(mHolder);
- mUsageTitle = (TextView) mHolder.findViewById(R.id.usage_title);
- mCycleTime = (TextView) mHolder.findViewById(R.id.cycle_left_time);
- mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
- mDataLimits = (TextView) mHolder.findViewById(R.id.data_limits);
- mDataUsed = spy((TextView) mHolder.findViewById(R.id.data_usage_view));
- mDataRemaining = spy((TextView) mHolder.findViewById(R.id.data_remaining_view));
- mLaunchButton = (Button) mHolder.findViewById(R.id.launch_mdp_app_button);
- mLabelBar = (LinearLayout) mHolder.findViewById(R.id.label_bar);
- mLabel1 = (TextView) mHolder.findViewById(R.id.text1);
- mLabel2 = (TextView) mHolder.findViewById(R.id.text2);
- mProgressBar = (ProgressBar) mHolder.findViewById(R.id.determinateBar);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java
index b4dab0d..88e2886 100644
--- a/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java
+++ b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java
@@ -37,6 +37,7 @@
import android.view.IWindowManager;
import android.widget.Toast;
+import com.android.internal.inputmethod.IBooleanResultCallback;
import com.android.internal.view.IInputMethodManager;
import com.android.settings.testutils.shadow.ShadowParcel;
@@ -68,6 +69,9 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mWinscopeTrace = spy(new DevelopmentTiles.WinscopeTrace());
+ // default ImeTraceEnabled value, prevent tests from actually calling into IMM and
+ // await the result forever.
+ doReturn(false).when(mWinscopeTrace).isImeTraceEnabled();
ReflectionHelpers.setField(mWinscopeTrace, "mWindowManager", mWindowManager);
ReflectionHelpers.setField(mWinscopeTrace, "mInputMethodManager", mInputMethodManager);
ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", mSurfaceFlinger);
@@ -93,7 +97,6 @@
public void sfReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
// Assume Window Trace and Input Method Manager are disabled.
doReturn(false).when(mWindowManager).isWindowTraceEnabled();
- doReturn(false).when(mInputMethodManager).isImeTraceEnabled();
ShadowParcel.sReadBoolResult = true;
assertThat(mWinscopeTrace.isEnabled()).isTrue();
verify(mSurfaceFlinger)
@@ -114,7 +117,6 @@
public void wmAndSfAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException {
ShadowParcel.sReadBoolResult = false;
doReturn(false).when(mWindowManager).isWindowTraceEnabled();
- doReturn(false).when(mInputMethodManager).isImeTraceEnabled();
assertThat(mWinscopeTrace.isEnabled()).isFalse();
verify(mSurfaceFlinger)
.transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
@@ -127,7 +129,7 @@
throws RemoteException {
ShadowParcel.sReadBoolResult = false;
doReturn(false).when(mWindowManager).isWindowTraceEnabled();
- doReturn(true).when(mInputMethodManager).isImeTraceEnabled();
+ doReturn(true).when(mWinscopeTrace).isImeTraceEnabled();
assertThat(mWinscopeTrace.isEnabled()).isTrue();
verify(mSurfaceFlinger)
.transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
@@ -140,7 +142,7 @@
public void immReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
// Assume Window Manager and Surface Trace are disabled.
ShadowParcel.sReadBoolResult = false;
- doReturn(true).when(mInputMethodManager).isImeTraceEnabled();
+ doReturn(true).when(mWinscopeTrace).isImeTraceEnabled();
assertThat(mWinscopeTrace.isEnabled()).isTrue();
}
@@ -149,7 +151,6 @@
public void immReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException {
// Assume Window Manager and Surface Trace are disabled.
ShadowParcel.sReadBoolResult = false;
- doReturn(false).when(mInputMethodManager).isImeTraceEnabled();
assertThat(mWinscopeTrace.isEnabled()).isFalse();
}
@@ -167,7 +168,6 @@
public void sfUnavailableAndWmAndImmReturnTraceDisabled_shouldReturnDisabled()
throws RemoteException {
doReturn(false).when(mWindowManager).isWindowTraceEnabled();
- doReturn(false).when(mInputMethodManager).isImeTraceEnabled();
ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null);
assertThat(mWinscopeTrace.isEnabled()).isFalse();
}
@@ -251,7 +251,8 @@
@Test
public void setIsEnableAndImmThrowsRemoteException_shouldFailGracefully()
throws RemoteException {
- doThrow(new RemoteException("Unknown")).when(mInputMethodManager).isImeTraceEnabled();
+ doThrow(new RemoteException("Unknown")).when(mInputMethodManager)
+ .isImeTraceEnabled(any(IBooleanResultCallback.Stub.class));
mWinscopeTrace.setIsEnabled(true);
}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
deleted file mode 100644
index 9434daa..0000000
--- a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.os.storage.VolumeRecord;
-import android.widget.Button;
-
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.FragmentActivity;
-
-import com.android.settings.R;
-import com.android.settings.deviceinfo.PrivateVolumeForget.ForgetConfirmFragment;
-import com.android.settings.testutils.shadow.ShadowStorageManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.androidx.fragment.FragmentController;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowStorageManager.class)
-public class PrivateVolumeForgetTest {
-
- private PrivateVolumeForget mFragment;
- private FragmentActivity mActivity;
-
- @Before
- public void setUp() {
- final Bundle bundle = new Bundle();
- bundle.putString(VolumeRecord.EXTRA_FS_UUID, "id");
- mFragment = FragmentController.of(new PrivateVolumeForget(), bundle)
- .create()
- .start()
- .resume()
- .visible()
- .get();
- mActivity = mFragment.getActivity();
- }
-
- @After
- public void tearDown() {
- ShadowStorageManager.reset();
- }
-
- @Test
- public void OnClickListener_shouldCallForget() {
- assertThat(ShadowStorageManager.isForgetCalled()).isFalse();
-
- final Button confirm = mFragment.getView().findViewById(R.id.confirm);
-
- confirm.performClick();
- final ForgetConfirmFragment confirmFragment =
- (ForgetConfirmFragment) mActivity.getSupportFragmentManager().findFragmentByTag(
- PrivateVolumeForget.TAG_FORGET_CONFIRM);
-
- assertThat(confirmFragment).isNotNull();
-
- final AlertDialog dialog = (AlertDialog) confirmFragment.getDialog();
- final Button forget = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
-
- forget.performClick();
-
- assertThat(ShadowStorageManager.isForgetCalled()).isTrue();
- }
-}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java
index eeaae67f..ea1896e 100644
--- a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java
@@ -2,11 +2,15 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.Application;
+import android.content.Context;
import android.hardware.display.ColorDisplayManager;
+
import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+
import org.junit.After;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -17,41 +21,81 @@
@Config(shadows = {SettingsShadowResources.class})
public class NightDisplayPreferenceControllerTest {
- @After
- public void tearDown() {
- SettingsShadowResources.reset();
- }
+ private Context mContext;
+ private ColorDisplayManager mColorDisplayManager;
+ private NightDisplayPreferenceController mPreferenceController;
- @Test
- public void nightDisplaySuggestion_isNotCompleted_ifAutoModeDisabled() {
- final Application context = RuntimeEnvironment.application;
- context.getSystemService(ColorDisplayManager.class)
- .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED);
- assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isFalse();
- }
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mColorDisplayManager = mContext.getSystemService(ColorDisplayManager.class);
+ mPreferenceController = new NightDisplayPreferenceController(mContext, "test");
+ }
- @Test
- public void nightDisplaySuggestion_isCompleted_ifAutoModeCustom() {
- final Application context = RuntimeEnvironment.application;
- context.getSystemService(ColorDisplayManager.class)
- .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_CUSTOM_TIME);
- assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
- }
+ @After
+ public void tearDown() {
+ SettingsShadowResources.reset();
+ }
- @Test
- public void nightDisplaySuggestion_isCompleted_ifAutoModeTwilight() {
- final Application context = RuntimeEnvironment.application;
- context.getSystemService(ColorDisplayManager.class)
- .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_TWILIGHT);
- assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
- }
+ @Test
+ public void nightDisplaySuggestion_isNotCompleted_ifAutoModeDisabled() {
+ mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED);
- @Test
- public void nightDisplaySuggestion_isCompleted_ifSuggestionDisabled() {
- final Application context = RuntimeEnvironment.application;
- context.getSystemService(ColorDisplayManager.class)
- .setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED);
- SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, false);
- assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
- }
-}
+ assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isFalse();
+ }
+
+ @Test
+ public void nightDisplaySuggestion_isCompleted_ifAutoModeCustom() {
+ mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_CUSTOM_TIME);
+
+ assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isTrue();
+ }
+
+ @Test
+ public void nightDisplaySuggestion_isCompleted_ifAutoModeTwilight() {
+ mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_TWILIGHT);
+
+ assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isTrue();
+ }
+
+ @Test
+ public void nightDisplaySuggestion_isCompleted_ifSuggestionDisabled() {
+ mColorDisplayManager.setNightDisplayAutoMode(ColorDisplayManager.AUTO_MODE_DISABLED);
+ SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled,
+ false);
+
+ assertThat(NightDisplayPreferenceController.isSuggestionComplete(mContext)).isTrue();
+ }
+
+ @Test
+ public void getAvailabilityStatus_nightDisplayIsSupported_returnAvailable() {
+ SettingsShadowResources.overrideResource(
+ com.android.internal.R.bool.config_nightDisplayAvailable, true);
+
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_nightDisplayIsNotSupported_returnUnsupportedOnDevice() {
+ SettingsShadowResources.overrideResource(
+ com.android.internal.R.bool.config_nightDisplayAvailable, false);
+
+ assertThat(mPreferenceController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void isChecked_nightDisplayIsActivated_returnTrue() {
+ mColorDisplayManager.setNightDisplayActivated(true);
+
+ assertThat(mPreferenceController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_nightDisplayIsNotActivated_returnFalse() {
+ mColorDisplayManager.setNightDisplayActivated(false);
+
+ assertThat(mPreferenceController.isChecked()).isFalse();
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
index 7f59ef3..621ddfa 100644
--- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
@@ -22,6 +22,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -34,9 +35,11 @@
import android.provider.SearchIndexableResource;
import android.provider.Settings;
+import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settingslib.RestrictedLockUtils;
import org.junit.Before;
import org.junit.Test;
@@ -68,6 +71,9 @@
@Mock
AdaptiveSleepPreferenceController mAdaptiveSleepPreferenceController;
+ @Mock
+ Preference mDisableOptionsPreference;
+
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
@@ -128,6 +134,16 @@
}
@Test
+ public void updateCandidates_enforcedAdmin_showDisabledByAdminPreference() {
+ mSettings.mAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mSettings.mDisableOptionsPreference = mDisableOptionsPreference;
+
+ mSettings.updateCandidates();
+
+ verify(mPreferenceScreen, atLeast(1)).addPreference(mDisableOptionsPreference);
+ }
+
+ @Test
public void setDefaultKey_controlCurrentScreenTimeout() {
mSettings.setDefaultKey(TIMEOUT_VALUES[0]);
diff --git a/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java
deleted file mode 100644
index cf0e660..0000000
--- a/tests/robotests/src/com/android/settings/display/TimeoutPreferenceControllerTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.display;
-
-import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-
-import com.android.settings.R;
-import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
-import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
-import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowDevicePolicyManager.class)
-public class TimeoutPreferenceControllerTest {
-
- private static final int TIMEOUT = 30;
- private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
- private static final String DEFAULT_TIMEOUT = "300000"; // 5 minutes
-
- private Context mContext;
- @Mock
- private TimeoutListPreference mPreference;
- @Mock
- private UserManager mUserManager;
-
- private TimeoutPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
- when(mPreference.getValue()).thenReturn(DEFAULT_TIMEOUT);
- mController = new TimeoutPreferenceController(mContext, KEY_SCREEN_TIMEOUT);
- }
-
- @After
- public void tearDown() {
- ShadowRestrictedLockUtilsInternal.reset();
- }
-
- @Test
- public void testOnPreferenceChange_SetTimeout_ReturnCorrectTimeout() {
- mController.onPreferenceChange(mPreference, Integer.toString(TIMEOUT));
-
- final int mode = Settings.System.getInt(mContext.getContentResolver(),
- SCREEN_OFF_TIMEOUT, 0);
- assertThat(mode).isEqualTo(TIMEOUT);
- }
-
- @Test
- public void testUpdateStateNoAdminTimeouts() {
- when(mUserManager.getProfiles(anyInt())).thenReturn(Collections.emptyList());
- mController.updateState(mPreference);
- verify(mPreference).removeUnusableTimeouts(0, null);
- }
-
- @Test
- public void testUpdateStateWithAdminTimeouts() {
- final int profileUserId = UserHandle.myUserId();
- final long timeout = 10000;
- when(mUserManager.getProfiles(profileUserId)).thenReturn(Collections.emptyList());
- ShadowDevicePolicyManager.getShadow().setMaximumTimeToLock(profileUserId, timeout);
-
- mController.updateState(mPreference);
- verify(mPreference).removeUnusableTimeouts(timeout, null);
- }
-
- @Test
- public void testUpdateStateWithAdminTimeoutsAndRestriction() {
- final int profileUserId = UserHandle.myUserId();
- final long timeout = 100;
- when(mUserManager.getProfiles(profileUserId)).thenReturn(Collections.emptyList());
- ShadowDevicePolicyManager.getShadow().setMaximumTimeToLock(profileUserId, timeout);
-
- int userId = UserHandle.myUserId();
- List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
- // Add two enforcing users so that RestrictedLockUtils.checkIfRestrictionEnforced returns
- // non-null.
- enforcingUsers.add(new UserManager.EnforcingUser(userId,
- UserManager.RESTRICTION_SOURCE_DEVICE_OWNER));
- enforcingUsers.add(new UserManager.EnforcingUser(userId,
- UserManager.RESTRICTION_SOURCE_PROFILE_OWNER));
- when(mUserManager.getUserRestrictionSources(
- UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT, UserHandle.of(userId)))
- .thenReturn(enforcingUsers);
-
- mController.updateState(mPreference);
-
- ArgumentCaptor<Long> longCaptor = ArgumentCaptor.forClass(Long.class);
- ArgumentCaptor<EnforcedAdmin> adminCaptor = ArgumentCaptor.forClass(EnforcedAdmin.class);
-
- verify(mPreference, times(2))
- .removeUnusableTimeouts(longCaptor.capture(), adminCaptor.capture());
- assertThat(longCaptor.getValue()).isEqualTo(0);
- assertThat(adminCaptor.getValue()).isNotNull();
- }
-
- @Test
- @Config(shadows = ShadowRestrictedLockUtilsInternal.class)
- public void updateState_selectedTimeoutLargerThanAdminMax_shouldSetSummaryToUpdatedPrefValue() {
- final int profileUserId = UserHandle.myUserId();
- final long allowedTimeout = 480000L; // 8 minutes
- when(mUserManager.getProfiles(profileUserId)).thenReturn(Collections.emptyList());
- ShadowDevicePolicyManager.getShadow().setMaximumTimeToLock(profileUserId, allowedTimeout);
- ShadowRestrictedLockUtilsInternal.setMaximumTimeToLockIsSet(true);
- final CharSequence[] timeouts = {"15000", "30000", "60000", "120000", "300000", "600000"};
- final CharSequence[] summaries = {"15s", "30s", "1m", "2m", "5m", "10m"};
- // set current timeout to be 10 minutes, which is longer than the allowed 8 minutes
- Settings.System.putLong(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, 600000L);
- when(mPreference.getEntries()).thenReturn(summaries);
- when(mPreference.getEntryValues()).thenReturn(timeouts);
- when(mPreference.getValue()).thenReturn("300000");
-
- mController.updateState(mPreference);
-
- verify(mPreference).setSummary(mContext.getString(R.string.screen_timeout_summary, "5m"));
- }
-}
diff --git a/tests/robotests/src/com/android/settings/display/TopLevelWallpaperPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelWallpaperPreferenceControllerTest.java
new file mode 100644
index 0000000..7b3ae65
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/TopLevelWallpaperPreferenceControllerTest.java
@@ -0,0 +1,205 @@
+/*
+ * 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.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowPackageManager;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {SettingsShadowResources.class})
+public class TopLevelWallpaperPreferenceControllerTest {
+ private static final String TEST_KEY = "test_key";
+
+ private Intent mWallpaperIntent;
+ private Intent mStylesAndWallpaperIntent;
+ private FragmentActivity mContext;
+ private ShadowPackageManager mShadowPackageManager;
+
+ private TopLevelWallpaperPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = Robolectric.buildActivity(FragmentActivity.class).get();
+ SettingsShadowResources.overrideResource(
+ R.string.config_wallpaper_picker_package, "bogus.package.for.testing");
+ SettingsShadowResources.overrideResource(
+ R.string.config_styles_and_wallpaper_picker_class, "bogus.package.class");
+ mWallpaperIntent = new Intent().setComponent(new ComponentName(
+ mContext.getString(R.string.config_wallpaper_picker_package),
+ mContext.getString(R.string.config_wallpaper_picker_class)));
+ mStylesAndWallpaperIntent = new Intent().setComponent(new ComponentName(
+ mContext.getString(R.string.config_wallpaper_picker_package),
+ mContext.getString(R.string.config_styles_and_wallpaper_picker_class)));
+ mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+ mController = new TopLevelWallpaperPreferenceController(mContext, TEST_KEY);
+ }
+
+ @Test
+ public void isAvailable_wallpaperPickerEnabledAndStylePickerEnabled_returnsTrue() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_wallpaperPickerEnabledAndStylePickerDisabled_returnsTrue() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_wallpaperPickerDisabledAndStylePickerEnabled_returnsTrue() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList());
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_wallpaperPickerDisabledAndStylePickerDisabled_returnsFalse() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList());
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void getComponentClassString_stylesAvailable_returnsStylePickerClassString() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent,
+ Lists.newArrayList(mock(ResolveInfo.class)));
+ assertThat(mController.getComponentClassString())
+ .isEqualTo(mContext.getString(R.string.config_styles_and_wallpaper_picker_class));
+ }
+
+ @Test
+ public void getComponentClassString_stylesUnavailable_returnsWallpaperPickerClassString() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+ assertThat(mController.getComponentClassString())
+ .isEqualTo(mContext.getString(R.string.config_wallpaper_picker_class));
+ }
+
+ @Test
+ public void areStylesAvailable_noComponentSpecified() {
+ SettingsShadowResources.overrideResource(
+ R.string.config_styles_and_wallpaper_picker_class, "");
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+
+ assertThat(mController.areStylesAvailable()).isFalse();
+ }
+
+ @Test
+ public void areStylesAvailable_componentUnresolveable() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+
+ assertThat(mController.areStylesAvailable()).isFalse();
+ }
+
+ @Test
+ public void areStylesAvailable_componentResolved() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent,
+ Lists.newArrayList(mock(ResolveInfo.class)));
+
+ assertThat(mController.areStylesAvailable()).isTrue();
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_wallpaperOnly() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+ Preference preference = new Preference(mContext);
+ preference.setKey(TEST_KEY);
+
+ mController.handlePreferenceTreeClick(preference);
+
+ assertThat(Shadows.shadowOf(mContext)
+ .getNextStartedActivityForResult().intent.getComponent().getClassName())
+ .isEqualTo(mContext.getString(R.string.config_wallpaper_picker_class));
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_stylesAndWallpaper() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList());
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
+ Preference preference = new Preference(mContext);
+ preference.setKey(TEST_KEY);
+
+ mController.handlePreferenceTreeClick(preference);
+
+ assertThat(Shadows.shadowOf(mContext)
+ .getNextStartedActivityForResult().intent.getComponent().getClassName())
+ .isEqualTo(mContext.getString(R.string.config_styles_and_wallpaper_picker_class));
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_launchSourceExtra() {
+ mShadowPackageManager.setResolveInfosForIntent(
+ mWallpaperIntent, Lists.newArrayList());
+ mShadowPackageManager.setResolveInfosForIntent(
+ mStylesAndWallpaperIntent, Lists.newArrayList());
+ Preference preference = new Preference(mContext);
+ preference.setKey(TEST_KEY);
+
+ mController.handlePreferenceTreeClick(preference);
+
+ assertThat(Shadows.shadowOf(mContext).getNextStartedActivityForResult()
+ .intent.hasExtra("com.android.wallpaper.LAUNCH_SOURCE")).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 18155d8..6d2298b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -18,7 +18,6 @@
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-import static com.android.settings.fuelgauge.TopLevelBatteryPreferenceController.getDashboardLabel;
import static com.google.common.truth.Truth.assertThat;
@@ -69,14 +68,16 @@
public void getDashboardLabel_returnsCorrectLabel() {
BatteryInfo info = new BatteryInfo();
info.batteryPercentString = "3%";
- assertThat(getDashboardLabel(mContext, info)).isEqualTo(info.batteryPercentString);
+ assertThat(mController.getDashboardLabel(mContext, info, true))
+ .isEqualTo(info.batteryPercentString);
info.remainingLabel = "Phone will shut down soon";
- assertThat(getDashboardLabel(mContext, info)).isEqualTo("3% - Phone will shut down soon");
+ assertThat(mController.getDashboardLabel(mContext, info, true))
+ .isEqualTo("3% - Phone will shut down soon");
info.discharging = false;
info.chargeLabel = "5% - charging";
- assertThat(getDashboardLabel(mContext, info)).isEqualTo("5% - charging");
+ assertThat(mController.getDashboardLabel(mContext, info, true)).isEqualTo("5% - charging");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceControllerTest.java
index 498c17b..80c10d0 100644
--- a/tests/robotests/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/EmergencyGestureNumberOverridePreferenceControllerTest.java
@@ -90,7 +90,7 @@
mController.updateState(preference);
- assertThat(preference.getSummary()).isEqualTo(
+ assertThat(preference.getSummary().toString()).isEqualTo(
mContext.getString(R.string.emergency_gesture_call_for_help_summary, "123"));
}
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java
index db51dff..a1c0c8f 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java
@@ -58,7 +58,7 @@
mController.setChecked(true);
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 0)).isEqualTo(1);
+ SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1)).isEqualTo(1);
}
@Test
@@ -66,7 +66,7 @@
mController.setChecked(false);
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 0)).isEqualTo(0);
+ SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1)).isEqualTo(0);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
index db12580..4c7b4b5 100644
--- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
@@ -48,25 +48,36 @@
@RunWith(RobolectricTestRunner.class)
public class SettingsHomepageActivityTest {
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
- public void setHomepageContainerPaddingTop_shouldBeSetPaddingTop() {
+ public void setDefaultHomepageContainerPaddingTop_shouldSetSearchBoxHeight() {
final SettingsHomepageActivity activity = Robolectric.buildActivity(
SettingsHomepageActivity.class).create().get();
- final int searchBarHeight = activity.getResources().getDimensionPixelSize(
- R.dimen.search_bar_height);
- final int searchBarMargin = activity.getResources().getDimensionPixelSize(
- R.dimen.search_bar_margin);
final View view = activity.findViewById(R.id.homepage_container);
- activity.setHomepageContainerPaddingTop();
+ activity.setDefaultHomepageContainerPaddingTop();
final int actualPaddingTop = view.getPaddingTop();
- assertThat(actualPaddingTop).isEqualTo(searchBarHeight + searchBarMargin * 2);
+ assertThat(actualPaddingTop).isEqualTo(activity.getSearchBoxHeight());
+ }
+
+ @Test
+ public void setHomepageContainerTopOffset_shouldBeSetPaddingTop() {
+ final SettingsHomepageActivity activity = Robolectric.buildActivity(
+ SettingsHomepageActivity.class).create().get();
+ final View view = activity.findViewById(R.id.homepage_container);
+ final int offset = activity.getResources().getDimensionPixelSize(
+ R.dimen.suggestion_height);
+
+ activity.setHomepageContainerTopOffset(offset);
+
+ final int actualPaddingTop = view.getPaddingTop();
+ assertThat(actualPaddingTop).isEqualTo(activity.getSearchBoxHeight() + offset);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionManagerTest.java
index 2157908..06cd726 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionManagerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionManagerTest.java
@@ -67,13 +67,6 @@
}
@Test
- public void getDisplayableCards_hasDisplayable() {
- when(mController.isDisplayable()).thenReturn(true);
-
- assertThat(mManager.getDisplayableCards()).hasSize(1);
- }
-
- @Test
public void onPrimaryClick_shouldRelayToController() {
mManager.onPrimaryClick(mContext, ID);
diff --git a/tests/robotests/src/com/android/settings/location/LocationIndicatorsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationIndicatorsPreferenceControllerTest.java
new file mode 100644
index 0000000..e1182fd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/location/LocationIndicatorsPreferenceControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.location;
+
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.DeviceConfig;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.Utils;
+import com.android.settings.testutils.shadow.ShadowDeviceConfig;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+/**
+ * Unit tests for {@link LocationIndicatorsPreferenceController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDeviceConfig.class})
+public class LocationIndicatorsPreferenceControllerTest {
+ @Mock
+ PackageManager mPackageManager;
+ private Context mContext;
+ private LocationIndicatorsPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mController = new LocationIndicatorsPreferenceController(mContext, "key");
+
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ }
+
+ @After
+ public void tearDown() {
+ ShadowDeviceConfig.reset();
+ }
+
+ /**
+ * Verify the location indicator settings are visible when location feature is supported
+ * on the device.
+ */
+ @Test
+ public void getAvailabilityStatus_locationSupported_shouldReturnAVAILABLE() {
+ when(mPackageManager.hasSystemFeature(eq(PackageManager.FEATURE_LOCATION))).thenReturn(
+ true);
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ /**
+ * Verify the location indicator settings are not visible when location feature is not supported
+ * on the device.
+ */
+ @Test
+ public void getAvailabilityStatus_locationNotSupported_shouldReturnUNSUPPORTED() {
+ when(mPackageManager.hasSystemFeature(eq(PackageManager.FEATURE_LOCATION))).thenReturn(
+ false);
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ /**
+ * Verify the location indicator preference is checked when the feature is enabled.
+ */
+ @Test
+ public void isChecked_featureEnabled_shouldReturnTrue() {
+ final boolean enabled = true;
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
+ Utils.PROPERTY_LOCATION_INDICATORS_ENABLED, Boolean.toString(enabled), true);
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ /**
+ * Verify the location indicator preference is unchecked when the feature is not enabled.
+ */
+ @Test
+ public void isChecked_featureNotEnabled_shouldReturnFalse() {
+ final boolean enabled = false;
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
+ Utils.PROPERTY_LOCATION_INDICATORS_ENABLED, Boolean.toString(enabled), true);
+ assertThat(mController.isChecked()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java
deleted file mode 100644
index bb0478c..0000000
--- a/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java
+++ /dev/null
@@ -1,299 +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.media;
-
-import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
-import static android.app.slice.Slice.HINT_LIST_ITEM;
-import static android.app.slice.SliceItem.FORMAT_SLICE;
-
-import static com.android.settings.media.MediaOutputGroupSlice.ACTION_MEDIA_SESSION_OPERATION;
-import static com.android.settings.media.MediaOutputGroupSlice.ACTION_VOLUME_ADJUSTMENT;
-import static com.android.settings.media.MediaOutputGroupSlice.CUSTOMIZED_ACTION;
-import static com.android.settings.media.MediaOutputGroupSlice.GROUP_DEVICES;
-import static com.android.settings.media.MediaOutputGroupSlice.MEDIA_DEVICE_ID;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-
-import androidx.slice.Slice;
-import androidx.slice.SliceMetadata;
-import androidx.slice.SliceProvider;
-import androidx.slice.core.SliceAction;
-import androidx.slice.core.SliceQuery;
-import androidx.slice.widget.SliceLiveData;
-
-import com.android.settings.R;
-import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settingslib.media.LocalMediaManager;
-import com.android.settingslib.media.MediaDevice;
-
-import org.junit.Before;
-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;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = MediaOutputGroupSliceTest.ShadowSliceBackgroundWorker.class)
-public class MediaOutputGroupSliceTest {
-
- private static final String TEST_PACKAGE_NAME = "com.test.music";
- private static final String TEST_PACKAGE_NAME2 = "com.test.music2";
- private static final String TEST_DEVICE_1_ID = "test_device_1_id";
- private static final String TEST_DEVICE_1_NAME = "test_device_1_name";
- private static final String TEST_DEVICE_2_ID = "test_device_2_id";
- private static final String TEST_DEVICE_2_NAME = "test_device_2_name";
- private static final int TEST_VOLUME = 3;
-
- private static MediaDeviceUpdateWorker sMediaDeviceUpdateWorker;
-
- @Mock
- private LocalMediaManager mLocalMediaManager;
- @Mock
- private MediaDevice mDevice1;
- @Mock
- private MediaDevice mDevice2;
-
- private final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- private final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- private final List<MediaDevice> mDeselectableDevices = new ArrayList<>();
-
- private Context mContext;
- private MediaOutputGroupSlice mMediaOutputGroupSlice;
- private Drawable mDrawable;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
-
- // Set-up specs for SliceMetadata.
- SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
-
- mMediaOutputGroupSlice = new MediaOutputGroupSlice(mContext);
- sMediaDeviceUpdateWorker = spy(new MediaDeviceUpdateWorker(mContext,
- MEDIA_OUTPUT_GROUP_SLICE_URI));
- sMediaDeviceUpdateWorker.mLocalMediaManager = mLocalMediaManager;
- when(sMediaDeviceUpdateWorker.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
- mDrawable = mContext.getDrawable(R.drawable.ic_check_box_blue_24dp);
- when(sMediaDeviceUpdateWorker.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- doReturn(false).when(sMediaDeviceUpdateWorker).hasAdjustVolumeUserRestriction();
- when(mDevice1.getId()).thenReturn(TEST_DEVICE_1_ID);
- when(mDevice1.getIcon()).thenReturn(mDrawable);
- when(mDevice1.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(mDevice1.getMaxVolume()).thenReturn(100);
- when(mDevice1.getCurrentVolume()).thenReturn(10);
- when(mDevice1.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
- when(mDevice2.getId()).thenReturn(TEST_DEVICE_2_ID);
- when(mDevice2.getIcon()).thenReturn(mDrawable);
- when(mDevice2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(mDevice2.getMaxVolume()).thenReturn(100);
- when(mDevice2.getCurrentVolume()).thenReturn(20);
- }
-
- @Test
- public void getSlice_noMatchedDevice_doNothing() {
- mSelectableDevices.add(mDevice1);
- mSelectedDevices.add(mDevice1);
- when(mLocalMediaManager.getMediaDeviceById(mSelectableDevices, TEST_DEVICE_1_ID))
- .thenReturn(mDevice1);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectableDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- final Intent intent = new Intent();
- intent.putExtra(EXTRA_RANGE_VALUE, TEST_VOLUME);
- intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_2_ID);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_VOLUME_ADJUSTMENT);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(sMediaDeviceUpdateWorker, never()).adjustSessionVolume(anyInt());
- verify(mDevice1, never()).requestSetVolume(TEST_VOLUME);
- }
-
- @Test
- public void getSlice_withOneSelectableDevice_checkRowNumber() {
- mSelectableDevices.add(mDevice1);
- mSelectedDevices.add(mDevice2);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(sMediaDeviceUpdateWorker.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- final Slice slice = mMediaOutputGroupSlice.getSlice();
- final int rows = SliceQuery.findAll(slice, FORMAT_SLICE, HINT_LIST_ITEM, null).size();
-
- // Group item and 2 * InputRange
- assertThat(rows).isEqualTo(3);
- }
-
- @Test
- public void getSlice_nullWorker_noException() {
- sMediaDeviceUpdateWorker = null;
- mMediaOutputGroupSlice.getSlice();
- }
-
- @Test
- public void getSlice_withOneSelectableDevice_checkTitle() {
- mSelectableDevices.add(mDevice1);
- mSelectedDevices.add(mDevice1);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectableDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- final Slice slice = mMediaOutputGroupSlice.getSlice();
- final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
- final SliceAction primaryAction = metadata.getPrimaryAction();
-
- assertThat(primaryAction.getTitle().toString()).isEqualTo(GROUP_DEVICES);
- }
-
- @Test
- public void onNotifyChange_verifyAdjustDeviceVolume() {
- mSelectableDevices.add(mDevice1);
- mSelectedDevices.add(mDevice1);
- when(mLocalMediaManager.getMediaDeviceById(mSelectableDevices, TEST_DEVICE_1_ID))
- .thenReturn(mDevice1);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectableDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- final Intent intent = new Intent();
- intent.putExtra(EXTRA_RANGE_VALUE, TEST_VOLUME);
- intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_1_ID);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_VOLUME_ADJUSTMENT);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(mDevice1).requestSetVolume(TEST_VOLUME);
- }
-
- @Test
- public void onNotifyChange_verifyAdjustGroupVolume() {
- mSelectableDevices.add(mDevice1);
- mSelectedDevices.add(mDevice1);
- when(mLocalMediaManager.getMediaDeviceById(mSelectableDevices, TEST_DEVICE_1_ID))
- .thenReturn(mDevice1);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectableDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- final Intent intent = new Intent();
- intent.putExtra(EXTRA_RANGE_VALUE, TEST_VOLUME);
- intent.putExtra(MEDIA_DEVICE_ID, GROUP_DEVICES);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_VOLUME_ADJUSTMENT);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(sMediaDeviceUpdateWorker).adjustSessionVolume(TEST_VOLUME);
- }
-
- @Test
- public void onNotifyChange_sendSelectableDevice_verifyAddSession() {
- mSelectableDevices.add(mDevice2);
- mSelectedDevices.add(mDevice1);
- when(mLocalMediaManager.getMediaDeviceById(mSelectableDevices, TEST_DEVICE_2_ID))
- .thenReturn(mDevice2);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectableDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- final Intent intent = new Intent();
- intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_2_ID);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_MEDIA_SESSION_OPERATION);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(sMediaDeviceUpdateWorker).addDeviceToPlayMedia(mDevice2);
- }
-
- @Test
- public void onNotifyChange_sendDeselectableDevice_verifyRemoveSession() {
- mSelectedDevices.add(mDevice1);
- mSelectedDevices.add(mDevice2);
- mDeselectableDevices.add(mDevice1);
- mDeselectableDevices.add(mDevice2);
- when(mLocalMediaManager.getMediaDeviceById(mSelectedDevices, TEST_DEVICE_2_ID))
- .thenReturn(mDevice2);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectedDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(sMediaDeviceUpdateWorker.getDeselectableMediaDevice()).thenReturn(
- mDeselectableDevices);
- final Intent intent = new Intent();
- intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_2_ID);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_MEDIA_SESSION_OPERATION);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(sMediaDeviceUpdateWorker).removeDeviceFromPlayMedia(mDevice2);
- }
-
- @Test
- public void onNotifyChange_sendNonDeselectableDevice_notRemoveSession() {
- mSelectedDevices.add(mDevice1);
- mSelectedDevices.add(mDevice2);
- mDeselectableDevices.add(mDevice1);
- when(mLocalMediaManager.getMediaDeviceById(mSelectedDevices, TEST_DEVICE_2_ID))
- .thenReturn(mDevice2);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectedDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(sMediaDeviceUpdateWorker.getDeselectableMediaDevice()).thenReturn(
- mDeselectableDevices);
- final Intent intent = new Intent();
- intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_2_ID);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_MEDIA_SESSION_OPERATION);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(sMediaDeviceUpdateWorker, never()).removeDeviceFromPlayMedia(mDevice2);
- }
-
- @Test
- public void onNotifyChange_noId_doNothing() {
- mSelectableDevices.add(mDevice1);
- mSelectedDevices.add(mDevice1);
- when(mLocalMediaManager.getMediaDeviceById(mSelectableDevices, TEST_DEVICE_1_ID))
- .thenReturn(mDevice1);
- sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectableDevices);
- when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- final Intent intent = new Intent();
- intent.putExtra(EXTRA_RANGE_VALUE, TEST_VOLUME);
- intent.putExtra(CUSTOMIZED_ACTION, ACTION_VOLUME_ADJUSTMENT);
-
- mMediaOutputGroupSlice.onNotifyChange(intent);
-
- verify(sMediaDeviceUpdateWorker, never()).adjustSessionVolume(anyInt());
- verify(mDevice1, never()).requestSetVolume(TEST_VOLUME);
- }
-
- @Implements(SliceBackgroundWorker.class)
- public static class ShadowSliceBackgroundWorker {
-
- @Implementation
- public static SliceBackgroundWorker getInstance(Uri uri) {
- return sMediaDeviceUpdateWorker;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
deleted file mode 100644
index 0a8ffa7..0000000
--- a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
+++ /dev/null
@@ -1,607 +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.media;
-
-import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
-import static android.app.slice.Slice.HINT_LIST_ITEM;
-import static android.app.slice.SliceItem.FORMAT_SLICE;
-
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.bluetooth.BluetoothAdapter;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.text.TextUtils;
-
-import androidx.slice.Slice;
-import androidx.slice.SliceMetadata;
-import androidx.slice.SliceProvider;
-import androidx.slice.core.SliceAction;
-import androidx.slice.core.SliceQuery;
-import androidx.slice.widget.SliceLiveData;
-
-import com.android.settings.R;
-import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
-import com.android.settingslib.media.LocalMediaManager;
-import com.android.settingslib.media.MediaDevice;
-
-import org.junit.Before;
-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;
-import org.robolectric.shadow.api.Shadow;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBluetoothAdapter.class})
-public class MediaOutputSliceTest {
-
- private static final String TEST_DEVICE_1_ID = "test_device_1_id";
- private static final String TEST_DEVICE_2_ID = "test_device_2_id";
- private static final String TEST_DEVICE_1_NAME = "test_device_1_name";
- private static final String TEST_DEVICE_2_NAME = "test_device_2_name";
- private static final int TEST_DEVICE_1_ICON =
- com.android.internal.R.drawable.ic_bt_headphones_a2dp;
-
- @Mock
- private LocalMediaManager mLocalMediaManager;
- @Mock
- private Drawable mTestDrawable;
-
- private final List<MediaDevice> mDevices = new ArrayList<>();
-
- private Context mContext;
- private MediaOutputSlice mMediaOutputSlice;
- private MediaDeviceUpdateWorker mMediaDeviceUpdateWorker;
- private ShadowBluetoothAdapter mShadowBluetoothAdapter;
- private AudioManager mAudioManager;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
-
- // Set-up specs for SliceMetadata.
- SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
- // Setup BluetoothAdapter
- mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
- mShadowBluetoothAdapter.setEnabled(true);
-
- mMediaOutputSlice = new MediaOutputSlice(mContext);
- mMediaDeviceUpdateWorker = spy(new MediaDeviceUpdateWorker(mContext,
- MEDIA_OUTPUT_SLICE_URI));
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
- mMediaDeviceUpdateWorker.mLocalMediaManager = mLocalMediaManager;
- doReturn(false).when(mMediaDeviceUpdateWorker).hasAdjustVolumeUserRestriction();
- mMediaOutputSlice.init(mMediaDeviceUpdateWorker);
- }
-
- @Test
- public void getSlice_workerIsNull_shouldReturnZeroRow() {
- mMediaOutputSlice.init(null);
-
- final Slice slice = mMediaOutputSlice.getSlice();
-
- final int rows = SliceQuery.findAll(slice, FORMAT_SLICE, HINT_LIST_ITEM,
- null /* nonHints */).size();
-
- assertThat(rows).isEqualTo(0);
- }
-
- @Test
- public void getSlice_bluetoothIsDisable_shouldReturnZeroRow() {
- mShadowBluetoothAdapter.setEnabled(false);
-
- final Slice slice = mMediaOutputSlice.getSlice();
-
- final int rows = SliceQuery.findAll(slice, FORMAT_SLICE, HINT_LIST_ITEM,
- null /* nonHints */).size();
-
- assertThat(rows).isEqualTo(0);
- }
-
- @Test
- public void getSlice_audioModeIsOngoingCall_shouldReturnZeroRow() {
- mAudioManager.setMode(AudioManager.MODE_IN_CALL);
-
- final Slice slice = mMediaOutputSlice.getSlice();
-
- final int rows = SliceQuery.findAll(slice, FORMAT_SLICE, HINT_LIST_ITEM,
- null /* nonHints */).size();
-
- assertThat(rows).isEqualTo(0);
- }
-
- @Test
- public void getSlice_shouldHaveActiveDeviceName() {
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(false);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mDevices.add(device);
- mDevices.add(device2);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
-
- final SliceAction primaryAction = metadata.getPrimaryAction();
- assertThat(primaryAction.getTitle().toString()).isEqualTo(TEST_DEVICE_1_NAME);
- }
-
- @Test
- public void getSlice_disconnectedBluetooth_verifyTitle() {
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(false);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(false);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mDevices.add(device);
- mDevices.add(device2);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
-
- final SliceAction primaryAction = metadata.getPrimaryAction();
- assertThat(primaryAction.getTitle().toString()).isEqualTo(mContext.getString(
- R.string.media_output_disconnected_status, TEST_DEVICE_1_NAME));
- }
-
- @Test
- public void getSlice_inGroupState_checkSliceSize() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(true);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectedDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- when(mMediaDeviceUpdateWorker.getSessionVolumeMax()).thenReturn(100);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
-
- assertThat(SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM, null).size())
- .isEqualTo(mDevices.size() + 1);
- }
-
- @Test
- public void getSlice_notInGroupState_checkSliceSize() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(true);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
-
- assertThat(SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM, null).size())
- .isEqualTo(mDevices.size());
- }
-
- @Test
- public void getSlice_singleCastDevice_notContainGroupIconText() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(null);
- mSelectedDevices.add(device);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
-
- final String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(R.string.add))).isEqualTo(-1);
- }
-
- @Test
- public void getSlice_multipleCastDevices_containGroupIconText() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(true);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(R.string.add))).isNotEqualTo(-1);
- }
-
- @Test
- public void getSlice_onTransferring_containTransferringSubtitle() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(false);
- when(device2.getState()).thenReturn(LocalMediaManager.MediaDeviceState.STATE_CONNECTING);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- final String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(R.string.media_output_switching)))
- .isNotEqualTo(-1);
- }
-
- @Test
- public void getSlice_onTransferringFailed_containFailedSubtitle() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(false);
- when(device2.getState()).thenReturn(LocalMediaManager.MediaDeviceState
- .STATE_CONNECTING_FAILED);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- final String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(
- R.string.media_output_switch_error_text))).isNotEqualTo(-1);
- }
-
- @Test
- public void getSlice_zeroState_containPairingText() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- mSelectedDevices.add(device);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(
- R.string.bluetooth_pairing_pref_title))).isNotEqualTo(-1);
- }
-
- @Test
- public void getSlice_twoConnectedDevices_notContainPairingText() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(true);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(
- R.string.bluetooth_pairing_pref_title))).isEqualTo(-1);
- }
-
- @Test
- public void getSlice_disconnectedBtOnTransferring_containTransferringSubtitle() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(false);
- when(device2.getState()).thenReturn(LocalMediaManager.MediaDeviceState.STATE_CONNECTING);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- final String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo, mContext.getText(R.string.media_output_switching)))
- .isNotEqualTo(-1);
- }
-
- @Test
- public void getSlice_disconnectedBtOnTransferringFailed_containTransferringFailedSubtitle() {
- final List<MediaDevice> mSelectedDevices = new ArrayList<>();
- final List<MediaDevice> mSelectableDevices = new ArrayList<>();
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
- when(device.getIcon()).thenReturn(mTestDrawable);
- when(device.getMaxVolume()).thenReturn(100);
- when(device.isConnected()).thenReturn(true);
- when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- final MediaDevice device2 = mock(MediaDevice.class);
- when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME);
- when(device2.getIcon()).thenReturn(mTestDrawable);
- when(device2.getMaxVolume()).thenReturn(100);
- when(device2.isConnected()).thenReturn(false);
- when(device2.getState()).thenReturn(
- LocalMediaManager.MediaDeviceState.STATE_CONNECTING_FAILED);
- when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
- when(device2.getId()).thenReturn(TEST_DEVICE_2_ID);
- mSelectedDevices.add(device);
- mSelectableDevices.add(device2);
- when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
- mDevices.add(device);
- mDevices.add(device2);
- when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices);
- when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices);
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Slice mediaSlice = mMediaOutputSlice.getSlice();
- final String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM,
- null).toString();
-
- assertThat(TextUtils.indexOf(sliceInfo,
- mContext.getText(R.string.bluetooth_connect_failed))).isNotEqualTo(-1);
- }
-
- @Test
- public void onNotifyChange_foundMediaDevice_connect() {
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- when(mLocalMediaManager.getMediaDeviceById(mDevices, TEST_DEVICE_1_ID)).thenReturn(device);
- mDevices.add(device);
-
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Intent intent = new Intent();
- intent.putExtra("media_device_id", TEST_DEVICE_1_ID);
-
- mMediaOutputSlice.onNotifyChange(intent);
-
- verify(mLocalMediaManager).connectDevice(device);
- }
-
- @Test
- public void onNotifyChange_notFoundMediaDevice_doNothing() {
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- when(mLocalMediaManager.getMediaDeviceById(mDevices, TEST_DEVICE_1_ID)).thenReturn(device);
- mDevices.add(device);
-
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Intent intent = new Intent();
- intent.putExtra("media_device_id", "fake_123");
-
- mMediaOutputSlice.onNotifyChange(intent);
-
- verify(mLocalMediaManager, never()).connectDevice(device);
- }
-
- @Test
- public void onNotifyChange_adjustVolume() {
- mDevices.clear();
- final MediaDevice device = mock(MediaDevice.class);
- when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
- when(mLocalMediaManager.getMediaDeviceById(mDevices, TEST_DEVICE_1_ID)).thenReturn(device);
- mDevices.add(device);
-
- mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
-
- final Intent intent = new Intent();
- intent.putExtra("media_device_id", TEST_DEVICE_1_ID);
- intent.putExtra(EXTRA_RANGE_VALUE, 30);
-
- mMediaOutputSlice.onNotifyChange(intent);
-
- verify(device).requestSetVolume(30);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java
deleted file mode 100644
index cb68e2a..0000000
--- a/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.Settings;
-import android.provider.SettingsSlicesContract;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.AirplaneModeEnabler;
-import com.android.settings.core.BasePreferenceController;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settingslib.RestrictedSwitchPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-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)
-public class AirplaneModePreferenceControllerTest {
-
- private static final int ON = 1;
- private static final int OFF = 0;
-
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private AirplaneModeEnabler mAirplaneModeEnabler;
- private Context mContext;
- private ContentResolver mResolver;
- private PreferenceManager mPreferenceManager;
- private PreferenceScreen mScreen;
- private RestrictedSwitchPreference mPreference;
- private AirplaneModePreferenceController mController;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- FakeFeatureFactory.setupForTest();
- mContext = spy(RuntimeEnvironment.application);
- mResolver = RuntimeEnvironment.application.getContentResolver();
- doReturn(mPackageManager).when(mContext).getPackageManager();
- mController = new AirplaneModePreferenceController(mContext,
- SettingsSlicesContract.KEY_AIRPLANE_MODE);
-
- mPreferenceManager = new PreferenceManager(mContext);
- mScreen = mPreferenceManager.createPreferenceScreen(mContext);
- mPreference = new RestrictedSwitchPreference(mContext);
- mPreference.setKey(SettingsSlicesContract.KEY_AIRPLANE_MODE);
- mScreen.addPreference(mPreference);
- mController.setFragment(null);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- mLifecycle.addObserver(mController);
- }
-
- @Test
- public void getSliceUri_shouldUsePlatformAuthority() {
- assertThat(mController.getSliceUri().getAuthority())
- .isEqualTo(SettingsSlicesContract.AUTHORITY);
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void airplaneModePreference_shouldNotBeAvailable_ifSetToNotVisible() {
- assertThat(mController.getAvailabilityStatus())
- .isNotEqualTo(BasePreferenceController.AVAILABLE);
-
- mController.displayPreference(mScreen);
-
- // This should not crash
- mController.onStart();
- mController.onStop();
- }
-
- @Test
- public void airplaneModePreference_shouldNotBeAvailable_ifHasLeanbackFeature() {
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(true);
- assertThat(mController.getAvailabilityStatus())
- .isNotEqualTo(BasePreferenceController.AVAILABLE);
-
- mController.displayPreference(mScreen);
-
- // This should not crash
- mController.onStart();
- mController.onStop();
- }
-
- @Test
- public void airplaneModePreference_shouldBeAvailable_ifNoLeanbackFeature() {
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(false);
- assertThat(mController.getAvailabilityStatus())
- .isEqualTo(BasePreferenceController.AVAILABLE);
- }
-
- @Test
- public void airplaneModePreference_testSetValue_updatesCorrectly() {
-
- // Set airplane mode ON by setChecked
- mController.setAirplaneModeEnabler(mAirplaneModeEnabler);
- assertThat(mController.setChecked(true)).isTrue();
-
- // Check return value if set same status.
- when(mAirplaneModeEnabler.isAirplaneModeOn()).thenReturn(true);
- assertThat(mController.setChecked(true)).isFalse();
-
- // Set to OFF
- assertThat(mController.setChecked(false)).isTrue();
- }
-
- @Test
- public void airplaneModePreference_testGetValue_correctValueReturned() {
- // Set airplane mode ON
- Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON);
-
- mController.displayPreference(mScreen);
- mController.onStart();
-
- assertThat(mController.isChecked()).isTrue();
-
- Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
- assertThat(mController.isChecked()).isFalse();
- }
-
- @Test
- public void airplaneModePreference_testPreferenceUI_updatesCorrectly() {
- // Airplane mode default off
- Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
-
- mController.displayPreference(mScreen);
- mController.onStop();
-
- assertThat(mPreference.isChecked()).isFalse();
-
- mController.onAirplaneModeChanged(true);
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void isSliceable_returnsTrue() {
- assertThat(mController.isSliceable()).isTrue();
- }
-
- @Test
- public void isPublicSlice_returnsTrue() {
- assertThat(mController.isPublicSlice()).isTrue();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/DataConnectivityListenerTest.java b/tests/robotests/src/com/android/settings/network/DataConnectivityListenerTest.java
deleted file mode 100644
index b45e28c..0000000
--- a/tests/robotests/src/com/android/settings/network/DataConnectivityListenerTest.java
+++ /dev/null
@@ -1,116 +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;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.os.Handler;
-
-import com.android.settings.network.telephony.DataConnectivityListener;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataConnectivityListenerTest {
- @Mock
- private DataConnectivityListener.Client mClient;
- @Mock
- private ConnectivityManager mConnectivityManager;
- @Mock
- private Network mActiveNetwork;
-
- private Context mContext;
- private DataConnectivityListener mListener;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
- when(mConnectivityManager.getActiveNetwork()).thenReturn(mActiveNetwork);
- mListener = new DataConnectivityListener(mContext, mClient);
- }
-
- @Test
- public void noStart_doesNotRegister() {
- verify(mConnectivityManager, never()).registerNetworkCallback(any(NetworkRequest.class),
- any(ConnectivityManager.NetworkCallback.class), any(Handler.class));
- }
-
- @Test
- public void start_doesRegister() {
- mListener.start();
- verify(mConnectivityManager).registerNetworkCallback(any(NetworkRequest.class),
- eq(mListener), any(Handler.class));
- }
-
- @Test
- public void onCapabilitiesChanged_notActiveNetwork_noCallback() {
- Network changedNetwork = mock(Network.class);
- mListener.onCapabilitiesChanged(changedNetwork, mock(NetworkCapabilities.class));
- verify(mClient, never()).onDataConnectivityChange();
- }
-
- @Test
- public void onCapabilitiesChanged_activeNetwork_onDataConnectivityChangeFires() {
- mListener.onCapabilitiesChanged(mActiveNetwork, mock(NetworkCapabilities.class));
- verify(mClient).onDataConnectivityChange();
- }
-
- @Test
- public void onLosing_notActiveNetwork_onDataConnectivityChangeFires() {
- Network changedNetwork = mock(Network.class);
- mListener.onLosing(changedNetwork, 500);
- verify(mClient).onDataConnectivityChange();
- }
-
- @Test
- public void onLosing_activeNetwork_onDataConnectivityChangeFires() {
- mListener.onLosing(mActiveNetwork, 500);
- verify(mClient).onDataConnectivityChange();
- }
-
- @Test
- public void onLost_notActiveNetwork_onDataConnectivityChangeFires() {
- Network changedNetwork = mock(Network.class);
- mListener.onLost(changedNetwork);
- verify(mClient).onDataConnectivityChange();
- }
-
- @Test
- public void onLost_activeNetwork_onDataConnectivityChangeFires() {
- mListener.onLost(mActiveNetwork);
- verify(mClient).onDataConnectivityChange();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/GlobalSettingsChangeListenerTest.java b/tests/robotests/src/com/android/settings/network/GlobalSettingsChangeListenerTest.java
deleted file mode 100644
index e419071..0000000
--- a/tests/robotests/src/com/android/settings/network/GlobalSettingsChangeListenerTest.java
+++ /dev/null
@@ -1,86 +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;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.Looper;
-import android.provider.Settings;
-
-import androidx.lifecycle.Lifecycle;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class GlobalSettingsChangeListenerTest {
-
- @Mock
- private Lifecycle mLifecycle;
-
- private Context mContext;
- private GlobalSettingsChangeListener mListener;
-
- private static final String SETTINGS_FIELD = Settings.Global.AIRPLANE_MODE_ON;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mListener = spy(new GlobalSettingsChangeListener(Looper.getMainLooper(),
- mContext, SETTINGS_FIELD) {
- public void onChanged(String field) {}
- });
-
- doNothing().when(mLifecycle).addObserver(mListener);
- doNothing().when(mLifecycle).removeObserver(mListener);
- }
-
- @Test
- public void whenChanged_onChangedBeenCalled() {
- mListener.onChange(false);
- verify(mListener, times(1)).onChanged(SETTINGS_FIELD);
- }
-
- @Test
- public void whenNotifyChangeBasedOnLifecycle_onStopEvent_onChangedNotCalled() {
- mListener.notifyChangeBasedOn(mLifecycle);
- mListener.onStart();
-
- mListener.onChange(false);
- verify(mListener, times(1)).onChanged(SETTINGS_FIELD);
-
- mListener.onStop();
-
- mListener.onChange(false);
- verify(mListener, times(1)).onChanged(SETTINGS_FIELD);
-
- mListener.onStart();
-
- mListener.onChange(false);
- verify(mListener, times(2)).onChanged(SETTINGS_FIELD);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
deleted file mode 100644
index 6d46f9c..0000000
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2016 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;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_START;
-import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.robolectric.shadow.api.Shadow.extract;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.telephony.PhoneStateListener;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.testutils.shadow.ShadowConnectivityManager;
-import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-import com.android.settingslib.RestrictedPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-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 = {ShadowConnectivityManager.class, ShadowUserManager.class})
-public class MobileNetworkPreferenceControllerTest {
-
- private Context mContext;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private PreferenceScreen mScreen;
-
- private Lifecycle mLifecycle;
- private LifecycleOwner mLifecycleOwner;
- private MobileNetworkPreferenceController mController;
- private Preference mPreference;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- mPreference = new Preference(mContext);
- mPreference.setKey(MobileNetworkPreferenceController.KEY_MOBILE_NETWORK_SETTINGS);
- }
-
- @Test
- public void secondaryUser_prefIsNotAvailable() {
- ShadowUserManager userManager = extract(mContext.getSystemService(UserManager.class));
- userManager.setIsAdminUser(false);
- ShadowConnectivityManager connectivityManager =
- extract(mContext.getSystemService(ConnectivityManager.class));
- connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, true);
-
- mController = new MobileNetworkPreferenceController(mContext);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void wifiOnly_prefIsNotAvailable() {
- ShadowUserManager userManager = extract(mContext.getSystemService(UserManager.class));
- userManager.setIsAdminUser(true);
- ShadowConnectivityManager connectivityManager =
- extract(mContext.getSystemService(ConnectivityManager.class));
- connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, false);
-
- mController = new MobileNetworkPreferenceController(mContext);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void goThroughLifecycle_isAvailable_shouldListenToServiceChange() {
- mController = spy(new MobileNetworkPreferenceController(mContext));
- mLifecycle.addObserver(mController);
- doReturn(true).when(mController).isAvailable();
-
- mLifecycle.handleLifecycleEvent(ON_START);
- verify(mTelephonyManager).listen(mController.mPhoneStateListener,
- PhoneStateListener.LISTEN_SERVICE_STATE);
-
- mLifecycle.handleLifecycleEvent(ON_STOP);
- verify(mTelephonyManager).listen(mController.mPhoneStateListener,
- PhoneStateListener.LISTEN_NONE);
- }
-
- @Test
- public void serviceStateChange_shouldUpdatePrefSummary() {
- final String testCarrierName = "test";
- final Preference mPreference = mock(Preference.class);
- mController = spy(new MobileNetworkPreferenceController(mContext));
- mLifecycle.addObserver(mController);
-
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
- doReturn(true).when(mController).isAvailable();
-
- // Display pref and go through lifecycle to set up listener.
- mController.displayPreference(mScreen);
- mLifecycle.handleLifecycleEvent(ON_START);
- verify(mController).onStart();
- verify(mTelephonyManager).listen(mController.mPhoneStateListener,
- PhoneStateListener.LISTEN_SERVICE_STATE);
-
- doReturn(testCarrierName).when(mController).getSummary();
-
- mController.mPhoneStateListener.onServiceStateChanged(null);
-
- // Carrier name should be set.
- verify(mPreference).setSummary(testCarrierName);
- }
-
- @Test
- public void airplaneModeTurnedOn_shouldDisablePreference() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Global.AIRPLANE_MODE_ON, 1);
- mController = spy(new MobileNetworkPreferenceController(mContext));
- final RestrictedPreference mPreference = new RestrictedPreference(mContext);
- mController.updateState(mPreference);
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void airplaneModeTurnedOffAndNoUserRestriction_shouldEnablePreference() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Global.AIRPLANE_MODE_ON, 0);
- mController = spy(new MobileNetworkPreferenceController(mContext));
- final RestrictedPreference mPreference = new RestrictedPreference(mContext);
- mPreference.setDisabledByAdmin(null);
- mController.updateState(mPreference);
- assertThat(mPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void airplaneModeTurnedOffAndHasUserRestriction_shouldDisablePreference() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Global.AIRPLANE_MODE_ON, 0);
- mController = spy(new MobileNetworkPreferenceController(mContext));
- final RestrictedPreference mPreference = new RestrictedPreference(mContext);
- mPreference.setDisabledByAdmin(EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN);
- mController.updateState(mPreference);
- assertThat(mPreference.isEnabled()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/MobilePlanPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/MobilePlanPreferenceControllerTest.java
deleted file mode 100644
index ab34087..0000000
--- a/tests/robotests/src/com/android/settings/network/MobilePlanPreferenceControllerTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2016 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;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import com.android.settings.R;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class MobilePlanPreferenceControllerTest {
-
- @Test
- public void testNoProvisionStringFormattedCorrectly() {
- final String operator = "test_operator";
- final Context context = RuntimeEnvironment.application;
- assertThat(context.getString(R.string.mobile_no_provisioning_url, operator, operator))
- .contains(operator);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/MultiNetworkHeaderControllerTest.java b/tests/robotests/src/com/android/settings/network/MultiNetworkHeaderControllerTest.java
deleted file mode 100644
index 47935d0..0000000
--- a/tests/robotests/src/com/android/settings/network/MultiNetworkHeaderControllerTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.telephony.SubscriptionManager;
-
-import com.android.settings.wifi.WifiConnectionPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.List;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceScreen;
-
-@RunWith(RobolectricTestRunner.class)
-public class MultiNetworkHeaderControllerTest {
- private static final String KEY_HEADER = "multi_network_header";
- private static final int EXPANDED_CHILDREN_COUNT = 5;
-
- @Mock
- private PreferenceScreen mPreferenceScreen;
- @Mock
- private PreferenceCategory mPreferenceCategory;
- @Mock
- private WifiConnectionPreferenceController mWifiController;
- @Mock
- private SubscriptionsPreferenceController mSubscriptionsController;
- @Mock
- private SubscriptionManager mSubscriptionManager;
-
- private Context mContext;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
- private MultiNetworkHeaderController mHeaderController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mPreferenceScreen.findPreference(eq(KEY_HEADER))).thenReturn(mPreferenceCategory);
- when(mPreferenceCategory.getPreferenceCount()).thenReturn(3);
- when(mPreferenceScreen.getInitialExpandedChildrenCount()).thenReturn(
- EXPANDED_CHILDREN_COUNT);
-
- mHeaderController = spy(new MultiNetworkHeaderController(mContext, KEY_HEADER));
- doReturn(mWifiController).when(mHeaderController).createWifiController(mLifecycle);
- doReturn(mSubscriptionsController).when(mHeaderController).createSubscriptionsController(
- mLifecycle);
- }
-
- @Test
- public void isAvailable_beforeInitIsCalled_notAvailable() {
- assertThat(mHeaderController.isAvailable()).isFalse();
- }
-
- // When calling displayPreference, the header itself should only be visible if the
- // subscriptions controller says it is available. This is a helper for test cases of this logic.
- private void displayPreferenceTest(boolean wifiAvailable, boolean subscriptionsAvailable,
- boolean setVisibleExpectedValue) {
- when(mWifiController.isAvailable()).thenReturn(wifiAvailable);
- when(mSubscriptionsController.isAvailable()).thenReturn(subscriptionsAvailable);
-
- mHeaderController.init(mLifecycle);
- mHeaderController.displayPreference(mPreferenceScreen);
- verify(mPreferenceCategory, never()).setVisible(eq(!setVisibleExpectedValue));
- verify(mPreferenceCategory, atLeastOnce()).setVisible(eq(setVisibleExpectedValue));
- }
-
- @Test
- public void displayPreference_bothNotAvailable_categoryIsNotVisible() {
- displayPreferenceTest(false, false, false);
- }
-
- @Test
- public void displayPreference_wifiAvailableButNotSubscriptions_categoryIsNotVisible() {
- displayPreferenceTest(true, false, false);
- }
-
- @Test
- public void displayPreference_subscriptionsAvailableButNotWifi_categoryIsVisible() {
- displayPreferenceTest(false, true, true);
- }
-
- @Test
- public void displayPreference_bothAvailable_categoryIsVisible() {
- displayPreferenceTest(true, true, true);
- }
-
- @Test
- public void onChildUpdated_subscriptionsBecameAvailable_categoryIsVisible() {
- when(mSubscriptionsController.isAvailable()).thenReturn(false);
- mHeaderController.init(mLifecycle);
- mHeaderController.displayPreference(mPreferenceScreen);
-
- when(mSubscriptionsController.isAvailable()).thenReturn(true);
- mHeaderController.onChildrenUpdated();
- ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
-
- verify(mPreferenceCategory, atLeastOnce()).setVisible(captor.capture());
- List<Boolean> values = captor.getAllValues();
- assertThat(values.get(values.size()-1)).isEqualTo(Boolean.TRUE);
-
- ArgumentCaptor<Integer> expandedCountCaptor = ArgumentCaptor.forClass(Integer.class);
- verify(mPreferenceScreen).setInitialExpandedChildrenCount(expandedCountCaptor.capture());
- assertThat(expandedCountCaptor.getValue()).isEqualTo(
- EXPANDED_CHILDREN_COUNT + mPreferenceCategory.getPreferenceCount());
- }
-
- @Test
- public void onChildUpdated_subscriptionsBecameUnavailable_categoryIsNotVisible() {
- when(mSubscriptionsController.isAvailable()).thenReturn(true);
- mHeaderController.init(mLifecycle);
- mHeaderController.displayPreference(mPreferenceScreen);
-
- when(mSubscriptionsController.isAvailable()).thenReturn(false);
- mHeaderController.onChildrenUpdated();
- ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
-
- verify(mPreferenceCategory, atLeastOnce()).setVisible(captor.capture());
- List<Boolean> values = captor.getAllValues();
- assertThat(values.get(values.size()-1)).isEqualTo(Boolean.FALSE);
-
- ArgumentCaptor<Integer> expandedCountCaptor = ArgumentCaptor.forClass(Integer.class);
- verify(mPreferenceScreen).setInitialExpandedChildrenCount(expandedCountCaptor.capture());
- assertThat(expandedCountCaptor.getValue()).isEqualTo(EXPANDED_CHILDREN_COUNT);
- }
-
- @Test
- public void onChildUpdated_noExpandedChildCountAndAvailable_doesNotSetExpandedCount() {
- when(mPreferenceScreen.getInitialExpandedChildrenCount()).thenReturn(Integer.MAX_VALUE);
-
- when(mSubscriptionsController.isAvailable()).thenReturn(false);
- mHeaderController.init(mLifecycle);
- mHeaderController.displayPreference(mPreferenceScreen);
-
- when(mSubscriptionsController.isAvailable()).thenReturn(true);
- mHeaderController.onChildrenUpdated();
-
- verify(mPreferenceScreen, never()).setInitialExpandedChildrenCount(anyInt());
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
deleted file mode 100644
index e84d286..0000000
--- a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2016 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;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.settingslib.drawer.CategoryKey;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class NetworkDashboardFragmentTest {
-
- private Context mContext;
-
- private NetworkDashboardFragment mFragment;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mFragment = new NetworkDashboardFragment();
- }
-
- @Test
- public void getCategoryKey_isNetwork() {
- assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_NETWORK);
- }
-
- @Test
- public void getXmlResourcesToIndex_shouldIncludeFragmentXml() {
- final List<SearchIndexableResource> indexRes =
- NetworkDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
- mContext,
- true /* enabled */);
-
- assertThat(indexRes).hasSize(1);
- assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java
deleted file mode 100644
index 3593cf7..0000000
--- a/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.net.NetworkScoreManager;
-import android.net.NetworkScorerAppData;
-
-import androidx.preference.Preference;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-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.util.ReflectionHelpers;
-
-import java.util.Collections;
-
-@RunWith(RobolectricTestRunner.class)
-public class NetworkScorerPickerPreferenceControllerTest {
-
- private static final String TEST_SCORER_PACKAGE = "Test Package";
- private static final String TEST_SCORER_CLASS = "Test Class";
- private static final String TEST_SCORER_LABEL = "Test Label";
-
- private Context mContext;
- @Mock
- private NetworkScoreManager mNetworkScorer;
- private NetworkScorerPickerPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mController = new NetworkScorerPickerPreferenceController(mContext, "test_key");
- ReflectionHelpers.setField(mController, "mNetworkScoreManager", mNetworkScorer);
- }
-
- @Test
- public void testIsAvailable_shouldAlwaysReturnTrue() {
- assertThat(mController.isAvailable()).isTrue();
- }
-
- @Test
- public void updateState_preferenceSetSummaryAsActiveScorerLabel() {
- ComponentName scorer = new ComponentName(TEST_SCORER_PACKAGE, TEST_SCORER_CLASS);
- NetworkScorerAppData scorerAppData = new NetworkScorerAppData(
- 0, scorer, TEST_SCORER_LABEL, null /* enableUseOpenWifiActivity */,
- null /* networkAvailableNotificationChannelId */);
- when(mNetworkScorer.getAllValidScorers())
- .thenReturn(Collections.singletonList(scorerAppData));
- when(mNetworkScorer.getActiveScorer()).thenReturn(scorerAppData);
- Preference preference = mock(Preference.class);
-
- mController.updateState(preference);
-
- verify(preference).setSummary(TEST_SCORER_LABEL);
- }
-
- @Test
- public void updateState_scorersAvailable_noActiveScorer_preferenceSetSummaryToNone() {
- ComponentName scorer = new ComponentName(TEST_SCORER_PACKAGE, TEST_SCORER_CLASS);
- NetworkScorerAppData scorerAppData = new NetworkScorerAppData(
- 0, scorer, TEST_SCORER_LABEL, null /* enableUseOpenWifiActivity */,
- null /* networkAvailableNotificationChannelId */);
- when(mNetworkScorer.getAllValidScorers())
- .thenReturn(Collections.singletonList(scorerAppData));
- when(mNetworkScorer.getActiveScorer()).thenReturn(null);
- Preference preference = mock(Preference.class);
-
- mController.updateState(preference);
-
- verify(preference).setSummary(mContext.getString(
- R.string.network_scorer_picker_none_preference));
- }
-
- @Test
- public void updateState_scorersAvailable_preferenceEnabled() {
- ComponentName scorer = new ComponentName(TEST_SCORER_PACKAGE, TEST_SCORER_CLASS);
- NetworkScorerAppData scorerAppData = new NetworkScorerAppData(
- 0, scorer, TEST_SCORER_LABEL, null /* enableUseOpenWifiActivity */,
- null /* networkAvailableNotificationChannelId */);
- when(mNetworkScorer.getAllValidScorers())
- .thenReturn(Collections.singletonList(scorerAppData));
-
- Preference preference = mock(Preference.class);
-
- mController.updateState(preference);
-
- verify(preference).setEnabled(true);
- }
-
- @Test
- public void updateState_noScorersAvailable_preferenceDisabled() {
- when(mNetworkScorer.getAllValidScorers())
- .thenReturn(Collections.emptyList());
- Preference preference = mock(Preference.class);
-
- mController.updateState(preference);
-
- verify(preference).setEnabled(false);
- verify(preference).setSummary(null);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java
deleted file mode 100644
index 4ae829f..0000000
--- a/tests/robotests/src/com/android/settings/network/SubscriptionUtilTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class SubscriptionUtilTest {
- @Mock
- private Context mContext;
- @Mock
- private SubscriptionManager mSubMgr;
- @Mock
- private TelephonyManager mTelMgr;
-
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- doReturn(mSubMgr).when(mContext).getSystemService(SubscriptionManager.class);
- doReturn(mTelMgr).when(mContext).getSystemService(TelephonyManager.class);
- when(mTelMgr.getUiccSlotsInfo()).thenReturn(null);
- }
-
- @Test
- public void getAvailableSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() {
- when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(null);
- final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
- assertThat(subs).isNotNull();
- assertThat(subs).isEmpty();
- }
-
- @Test
- public void getAvailableSubscriptions_oneSubscription_oneResult() {
- final SubscriptionInfo info = mock(SubscriptionInfo.class);
- when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
- final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
- assertThat(subs).isNotNull();
- assertThat(subs).hasSize(1);
- }
-
- @Test
- public void getAvailableSubscriptions_twoSubscriptions_twoResults() {
- final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
- final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
- when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2));
- final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
- assertThat(subs).isNotNull();
- assertThat(subs).hasSize(2);
- }
-
- @Test
- public void getActiveSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() {
- when(mSubMgr.getActiveSubscriptionInfoList()).thenReturn(null);
- final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr);
- assertThat(subs).isNotNull();
- assertThat(subs).isEmpty();
- }
-
- @Test
- public void getActiveSubscriptions_oneSubscription_oneResult() {
- final SubscriptionInfo info = mock(SubscriptionInfo.class);
- when(mSubMgr.getActiveSubscriptionInfoList()).thenReturn(Arrays.asList(info));
- final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr);
- assertThat(subs).isNotNull();
- assertThat(subs).hasSize(1);
- }
-
- @Test
- public void getActiveSubscriptions_twoSubscriptions_twoResults() {
- final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
- final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
- when(mSubMgr.getActiveSubscriptionInfoList()).thenReturn(
- Arrays.asList(info1, info2));
- final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mSubMgr);
- assertThat(subs).isNotNull();
- assertThat(subs).hasSize(2);
- }
-
- @Test
- public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() {
- assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
deleted file mode 100644
index ea2212c..0000000
--- a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network;
-
-import static android.telephony.SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
-import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GOOD;
-import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GREAT;
-import static android.telephony.SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
-import static android.telephony.SignalStrength.SIGNAL_STRENGTH_POOR;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.provider.Settings;
-import android.telephony.SignalStrength;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowSubscriptionManager;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowSubscriptionManager.class)
-public class SubscriptionsPreferenceControllerTest {
- private static final String KEY = "preference_group";
-
- @Mock
- private PreferenceScreen mScreen;
- @Mock
- private PreferenceCategory mPreferenceCategory;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private ConnectivityManager mConnectivityManager;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private Network mActiveNetwork;
- @Mock
- private NetworkCapabilities mCapabilities;
- @Mock
- private Drawable mSignalStrengthIcon;
-
- private Context mContext;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
- private SubscriptionsPreferenceController mController;
- private int mOnChildUpdatedCount;
- private SubscriptionsPreferenceController.UpdateListener mUpdateListener;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
- when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- when(mConnectivityManager.getActiveNetwork()).thenReturn(mActiveNetwork);
- when(mConnectivityManager.getNetworkCapabilities(mActiveNetwork)).thenReturn(mCapabilities);
- when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
- when(mScreen.findPreference(eq(KEY))).thenReturn(mPreferenceCategory);
- when(mPreferenceCategory.getContext()).thenReturn(mContext);
- mOnChildUpdatedCount = 0;
- mUpdateListener = () -> mOnChildUpdatedCount++;
-
- mController = spy(
- new SubscriptionsPreferenceController(mContext, mLifecycle, mUpdateListener,
- KEY, 5));
- doReturn(true).when(mController).isSubscriptionCanBeDisplayed(any(), anyInt());
- doReturn(mSignalStrengthIcon).when(mController).getIcon(anyInt(), anyInt(), anyBoolean());
- }
-
- @After
- public void tearDown() {
- SubscriptionUtil.setActiveSubscriptionsForTesting(null);
- }
-
- @Test
- public void isAvailable_oneSubscription_availableFalse() {
- setupMockSubscriptions(1);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void isAvailable_twoSubscriptions_availableTrue() {
- setupMockSubscriptions(2);
- assertThat(mController.isAvailable()).isTrue();
- }
-
- @Test
- public void isAvailable_fiveSubscriptions_availableTrue() {
- setupMockSubscriptions(5);
- assertThat(mController.isAvailable()).isTrue();
- }
-
- @Test
- public void isAvailable_airplaneModeOn_availableFalse() {
- setupMockSubscriptions(2);
- assertThat(mController.isAvailable()).isTrue();
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void onAirplaneModeChanged_airplaneModeTurnedOn_eventFired() {
- setupMockSubscriptions(2);
- mController.onResume();
- mController.displayPreference(mScreen);
- assertThat(mController.isAvailable()).isTrue();
-
- final int updateCountBeforeModeChange = mOnChildUpdatedCount;
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
- mController.onAirplaneModeChanged(true);
- assertThat(mController.isAvailable()).isFalse();
- assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeModeChange + 1);
- }
-
- @Test
- public void onAirplaneModeChanged_airplaneModeTurnedOff_eventFired() {
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
- setupMockSubscriptions(2);
- mController.onResume();
- mController.displayPreference(mScreen);
- assertThat(mController.isAvailable()).isFalse();
-
- final int updateCountBeforeModeChange = mOnChildUpdatedCount;
- Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);
- mController.onAirplaneModeChanged(false);
- assertThat(mController.isAvailable()).isTrue();
- assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeModeChange + 1);
- }
-
- @Test
- public void onSubscriptionsChanged_countBecameTwo_eventFired() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2);
- SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 1));
- mController.onResume();
- mController.displayPreference(mScreen);
- assertThat(mController.isAvailable()).isFalse();
-
- final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
- SubscriptionUtil.setActiveSubscriptionsForTesting(subs);
- mController.onSubscriptionsChanged();
- assertThat(mController.isAvailable()).isTrue();
- assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
- }
-
- @Test
- public void onSubscriptionsChanged_countBecameOne_eventFiredAndPrefsRemoved() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2);
- mController.onResume();
- mController.displayPreference(mScreen);
- assertThat(mController.isAvailable()).isTrue();
- verify(mPreferenceCategory, times(2)).addPreference(any(Preference.class));
-
- final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
- SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 1));
- mController.onSubscriptionsChanged();
- assertThat(mController.isAvailable()).isFalse();
- assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
-
- verify(mPreferenceCategory, times(2)).removePreference(any(Preference.class));
- }
-
- @Test
- public void onSubscriptionsChanged_subscriptionReplaced_preferencesChanged() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(3);
-
- // Start out with only sub1 and sub2.
- SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 2));
- mController.onResume();
- mController.displayPreference(mScreen);
- final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class);
- verify(mPreferenceCategory, times(2)).addPreference(captor.capture());
- assertThat(captor.getAllValues().size()).isEqualTo(2);
- assertThat(captor.getAllValues().get(0).getTitle()).isEqualTo("sub1");
- assertThat(captor.getAllValues().get(1).getTitle()).isEqualTo("sub2");
-
- // Now replace sub2 with sub3, and make sure the old preference was removed and the new
- // preference was added.
- final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
- SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(subs.get(0), subs.get(2)));
- mController.onSubscriptionsChanged();
- assertThat(mController.isAvailable()).isTrue();
- assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
-
- verify(mPreferenceCategory).removePreference(captor.capture());
- assertThat(captor.getValue().getTitle()).isEqualTo("sub2");
- verify(mPreferenceCategory, times(3)).addPreference(captor.capture());
- assertThat(captor.getValue().getTitle()).isEqualTo("sub3");
- }
-
-
- /**
- * Helper to create a specified number of subscriptions, display them, and then click on one and
- * verify that the intent fires and has the right subscription id extra.
- *
- * @param subscriptionCount the number of subscriptions
- * @param selectedPrefIndex index of the subscription to click on
- */
- private void runPreferenceClickTest(final int subscriptionCount, final int selectedPrefIndex) {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(subscriptionCount);
- final ArgumentCaptor<Preference> prefCaptor = ArgumentCaptor.forClass(Preference.class);
- mController.displayPreference(mScreen);
- verify(mPreferenceCategory, times(subscriptionCount)).addPreference(prefCaptor.capture());
- final List<Preference> prefs = prefCaptor.getAllValues();
- final Preference pref = prefs.get(selectedPrefIndex);
- final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(intentCaptor.capture());
- pref.getOnPreferenceClickListener().onPreferenceClick(pref);
- final Intent intent = intentCaptor.getValue();
- assertThat(intent).isNotNull();
- assertThat(intent.hasExtra(Settings.EXTRA_SUB_ID)).isTrue();
- final int subIdFromIntent = intent.getIntExtra(Settings.EXTRA_SUB_ID,
- INVALID_SUBSCRIPTION_ID);
- assertThat(subIdFromIntent).isEqualTo(
- subs.get(selectedPrefIndex).getSubscriptionId());
- }
-
- @Test
- public void twoPreferences_firstPreferenceClicked_correctIntentFires() {
- runPreferenceClickTest(2, 0);
- }
-
- @Test
- public void twoPreferences_secondPreferenceClicked_correctIntentFires() {
- runPreferenceClickTest(2, 1);
- }
-
- @Test
- public void threePreferences_secondPreferenceClicked_correctIntentFires() {
- runPreferenceClickTest(3, 1);
- }
-
- @Test
- public void threePreferences_thirdPreferenceClicked_correctIntentFires() {
- runPreferenceClickTest(3, 2);
- }
-
- @Test
- public void getSummary_twoSubsOneDefaultForEverythingDataActive() {
- setupMockSubscriptions(2);
-
- ShadowSubscriptionManager.setDefaultSmsSubscriptionId(11);
- ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(11);
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
- when(mCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(true);
-
- assertThat(mController.getSummary(11, true)).isEqualTo(
- mContext.getString(R.string.default_for_calls_and_sms) + System.lineSeparator()
- + mContext.getString(R.string.mobile_data_active));
-
- assertThat(mController.getSummary(22, false)).isEqualTo(
- mContext.getString(R.string.subscription_available));
- }
-
- @Test
- public void getSummary_twoSubsOneDefaultForEverythingDataNotActive() {
- setupMockSubscriptions(2, 1, true);
-
- ShadowSubscriptionManager.setDefaultSmsSubscriptionId(1);
- ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(1);
-
- assertThat(mController.getSummary(1, true)).isEqualTo(
- mContext.getString(R.string.default_for_calls_and_sms) + System.lineSeparator()
- + mContext.getString(R.string.default_for_mobile_data));
-
- assertThat(mController.getSummary(2, false)).isEqualTo(
- mContext.getString(R.string.subscription_available));
- }
-
- @Test
- public void getSummary_twoSubsOneDefaultForEverythingDataDisabled() {
- setupMockSubscriptions(2);
-
- ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(1);
- ShadowSubscriptionManager.setDefaultSmsSubscriptionId(1);
-
- assertThat(mController.getSummary(1, true)).isEqualTo(
- mContext.getString(R.string.default_for_calls_and_sms) + System.lineSeparator()
- + mContext.getString(R.string.mobile_data_off));
-
- assertThat(mController.getSummary(2, false)).isEqualTo(
- mContext.getString(R.string.subscription_available));
- }
-
- @Test
- public void getSummary_twoSubsOneForCallsAndDataOneForSms() {
- setupMockSubscriptions(2, 1, true);
-
- ShadowSubscriptionManager.setDefaultSmsSubscriptionId(2);
- ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(1);
-
- assertThat(mController.getSummary(1, true)).isEqualTo(
- mContext.getString(R.string.default_for_calls) + System.lineSeparator()
- + mContext.getString(R.string.default_for_mobile_data));
-
- assertThat(mController.getSummary(2, false)).isEqualTo(
- mContext.getString(R.string.default_for_sms));
- }
-
- @Test
- public void setIcon_nullStrength_noCrash() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2);
- setMockSubSignalStrength(subs, 0, -1);
- final Preference pref = mock(Preference.class);
-
- mController.setIcon(pref, 1, true /* isDefaultForData */);
- verify(mController).getIcon(eq(0), eq(NUM_SIGNAL_STRENGTH_BINS), eq(true));
- }
-
- @Test
- public void setIcon_noSignal_correctLevels() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2, 1, true);
- setMockSubSignalStrength(subs, 0, SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
- setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
- setMockSubDataEnabled(subs, 0, true);
- final Preference pref = mock(Preference.class);
-
- mController.setIcon(pref, 1, true /* isDefaultForData */);
- verify(mController).getIcon(eq(0), eq(NUM_SIGNAL_STRENGTH_BINS), eq(false));
-
- mController.setIcon(pref, 2, false /* isDefaultForData */);
- verify(mController).getIcon(eq(0), eq(NUM_SIGNAL_STRENGTH_BINS), eq(true));
- }
-
- @Test
- public void setIcon_noSignal_withInflation_correctLevels() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2, 1, true);
- setMockSubSignalStrength(subs, 0, SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
- setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
- final Preference pref = mock(Preference.class);
- doReturn(true).when(mController).shouldInflateSignalStrength(anyInt());
-
- mController.setIcon(pref, 1, true /* isDefaultForData */);
- verify(mController).getIcon(eq(1), eq(NUM_SIGNAL_STRENGTH_BINS + 1), eq(false));
-
- mController.setIcon(pref, 2, false /* isDefaultForData */);
- verify(mController).getIcon(eq(1), eq(NUM_SIGNAL_STRENGTH_BINS + 1), eq(true));
- }
-
- @Test
- public void setIcon_greatSignal_correctLevels() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2, 1, true);
- setMockSubSignalStrength(subs, 0, SIGNAL_STRENGTH_GREAT);
- setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_GREAT);
- final Preference pref = mock(Preference.class);
-
- mController.setIcon(pref, 1, true /* isDefaultForData */);
- verify(mController).getIcon(eq(4), eq(NUM_SIGNAL_STRENGTH_BINS), eq(false));
-
- mController.setIcon(pref, 2, false /* isDefaultForData */);
- verify(mController).getIcon(eq(4), eq(NUM_SIGNAL_STRENGTH_BINS), eq(true));
- }
-
- @Test
- public void onSignalStrengthChanged_subTwoGoesFromGoodToGreat_correctLevels() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2);
- setMockSubSignalStrength(subs, 0, SIGNAL_STRENGTH_POOR);
- setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_GOOD);
-
- mController.onResume();
- mController.displayPreference(mScreen);
-
- // Now change the signal strength for the 2nd subscription from Good to Great
- setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_GREAT);
- mController.onSignalStrengthChanged();
-
- final ArgumentCaptor<Integer> level = ArgumentCaptor.forClass(Integer.class);
- verify(mController, times(4)).getIcon(level.capture(), eq(NUM_SIGNAL_STRENGTH_BINS),
- eq(true));
- assertThat(level.getAllValues().get(0)).isEqualTo(1);
- assertThat(level.getAllValues().get(1)).isEqualTo(3); // sub2, first time
- assertThat(level.getAllValues().get(2)).isEqualTo(1);
- assertThat(level.getAllValues().get(3)).isEqualTo(4); // sub2, after change
- }
-
- @Test
- public void displayPreference_mobileDataOff_bothSubsHaveCutOut() {
- setupMockSubscriptions(2, 1, false);
-
- mController.onResume();
- mController.displayPreference(mScreen);
-
- verify(mController, times(2)).getIcon(eq(SIGNAL_STRENGTH_GOOD),
- eq(NUM_SIGNAL_STRENGTH_BINS), eq(true));
- }
-
- @Test
- public void displayPreference_mobileDataOn_onlyNonDefaultSubHasCutOut() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2, 1, true);
- setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_POOR);
-
- mController.onResume();
- mController.displayPreference(mScreen);
-
- verify(mController).getIcon(eq(SIGNAL_STRENGTH_GOOD), eq(NUM_SIGNAL_STRENGTH_BINS),
- eq(false));
- verify(mController).getIcon(eq(SIGNAL_STRENGTH_POOR), eq(NUM_SIGNAL_STRENGTH_BINS),
- eq(true));
- }
-
- @Test
- public void displayPreference_subscriptionsWithSameGroupUUID_onlyOneWillBeSeen() {
- doReturn(false).when(mController).isSubscriptionCanBeDisplayed(any(), eq(3));
- final List<SubscriptionInfo> subs = setupMockSubscriptions(3);
- SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 3));
-
- mController.onResume();
- mController.displayPreference(mScreen);
-
- verify(mPreferenceCategory, times(2)).addPreference(any(Preference.class));
- }
-
- @Test
- public void onMobileDataEnabledChange_mobileDataTurnedOff_bothSubsHaveCutOut() {
- final List<SubscriptionInfo> subs = setupMockSubscriptions(2, 1, true);
-
- mController.onResume();
- mController.displayPreference(mScreen);
-
- setMockSubDataEnabled(subs, 0, false);
- mController.onMobileDataEnabledChange();
-
- final ArgumentCaptor<Boolean> cutOutCaptor = ArgumentCaptor.forClass(Boolean.class);
- verify(mController, times(4)).getIcon(eq(SIGNAL_STRENGTH_GOOD),
- eq(NUM_SIGNAL_STRENGTH_BINS), cutOutCaptor.capture());
- assertThat(cutOutCaptor.getAllValues().get(0)).isEqualTo(false); // sub1, first time
- assertThat(cutOutCaptor.getAllValues().get(1)).isEqualTo(true);
- assertThat(cutOutCaptor.getAllValues().get(2)).isEqualTo(true); // sub1, second time
- assertThat(cutOutCaptor.getAllValues().get(3)).isEqualTo(true);
- }
-
- private List<SubscriptionInfo> setupMockSubscriptions(int count) {
- return setupMockSubscriptions(count, 0, true);
- }
-
- /** Helper method to setup several mock active subscriptions. The generated subscription id's
- * start at 1.
- *
- * @param count How many subscriptions to create
- * @param defaultDataSubId The subscription id of the default data subscription - pass
- * INVALID_SUBSCRIPTION_ID if there should not be one
- * @param mobileDataEnabled Whether mobile data should be considered enabled for the default
- * data subscription
- */
- private List<SubscriptionInfo> setupMockSubscriptions(int count, int defaultDataSubId,
- boolean mobileDataEnabled) {
- if (defaultDataSubId != INVALID_SUBSCRIPTION_ID) {
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(defaultDataSubId);
- }
- final ArrayList<SubscriptionInfo> infos = new ArrayList<>();
- for (int i = 0; i < count; i++) {
- final int subscriptionId = i + 1;
- final SubscriptionInfo info = mock(SubscriptionInfo.class);
- final TelephonyManager mgrForSub = mock(TelephonyManager.class);
- final SignalStrength signalStrength = mock(SignalStrength.class);
-
- if (subscriptionId == defaultDataSubId) {
- when(mgrForSub.isDataEnabled()).thenReturn(mobileDataEnabled);
- }
- when(info.getSubscriptionId()).thenReturn(i + 1);
- when(info.getDisplayName()).thenReturn("sub" + (i + 1));
- doReturn(mgrForSub).when(mTelephonyManager).createForSubscriptionId(eq(subscriptionId));
- when(mgrForSub.getSignalStrength()).thenReturn(signalStrength);
- when(signalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_GOOD);
-
- infos.add(info);
- }
- SubscriptionUtil.setActiveSubscriptionsForTesting(infos);
- return infos;
- }
-
- /**
- * Helper method to set the signal strength returned for a mock subscription
- * @param subs The list of subscriptions
- * @param index The index in of the subscription in |subs| to change
- * @param level The signal strength level to return for the subscription. Pass -1 to force
- * return of a null SignalStrength object for the subscription.
- */
- private void setMockSubSignalStrength(List<SubscriptionInfo> subs, int index, int level) {
- final TelephonyManager mgrForSub =
- mTelephonyManager.createForSubscriptionId(subs.get(index).getSubscriptionId());
- if (level == -1) {
- when(mgrForSub.getSignalStrength()).thenReturn(null);
- } else {
- final SignalStrength signalStrength = mgrForSub.getSignalStrength();
- when(signalStrength.getLevel()).thenReturn(level);
- }
- }
-
- private void setMockSubDataEnabled(List<SubscriptionInfo> subs, int index, boolean enabled) {
- final TelephonyManager mgrForSub =
- mTelephonyManager.createForSubscriptionId(subs.get(index).getSubscriptionId());
- when(mgrForSub.isDataEnabled()).thenReturn(enabled);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
deleted file mode 100644
index 566ea8b..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import com.android.settings.network.apn.ApnSettings;
-import com.android.settingslib.RestrictedPreference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class ApnPreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
-
- private ApnPreferenceController mController;
- private RestrictedPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
-
- mPreference = new RestrictedPreference(mContext);
- mController = new ApnPreferenceController(mContext, "mobile_data");
- mController.init(SUB_ID);
- mController.setPreference(mPreference);
- mController.mCarrierConfigManager = mCarrierConfigManager;
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_apnSettingsNotSupported_returnUnavailable() {
- doReturn(TelephonyManager.PHONE_TYPE_CDMA).when(mTelephonyManager).getPhoneType();
- final PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL, false);
- doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_apnSettingsSupportedWithCDMA_returnAvailable() {
- doReturn(TelephonyManager.PHONE_TYPE_CDMA).when(mTelephonyManager).getPhoneType();
- final PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL, true);
- doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_apnSettingsSupportedWithGsm_returnAvailable() {
- doReturn(TelephonyManager.PHONE_TYPE_GSM).when(mTelephonyManager).getPhoneType();
- final PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL, true);
- doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_carrierConfigNull_returnUnavailable() {
- doReturn(TelephonyManager.PHONE_TYPE_GSM).when(mTelephonyManager).getPhoneType();
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(null);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
-
- @Test
- public void getAvailabilityStatus_hideCarrierNetworkSettings_returnUnavailable() {
- doReturn(TelephonyManager.PHONE_TYPE_GSM).when(mTelephonyManager).getPhoneType();
- final PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL, true);
- bundle.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, true);
- doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void handPreferenceTreeClick_fireIntent() {
- ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(captor.capture());
-
- mController.handlePreferenceTreeClick(mPreference);
-
- final Intent intent = captor.getValue();
- assertThat(intent.getAction()).isEqualTo(Settings.ACTION_APN_SETTINGS);
- assertThat(intent.getIntExtra(ApnSettings.SUB_ID, 0)).isEqualTo(SUB_ID);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java
deleted file mode 100644
index c8ce6c1..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java
+++ /dev/null
@@ -1,73 +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 static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowCarrierConfigManager;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowCarrierConfigManager.class)
-public class CarrierSettingsVersionPreferenceControllerTest {
-
- private ShadowCarrierConfigManager mCarrierConfigManager;
- private CarrierSettingsVersionPreferenceController mController;
- private int mSubscriptionId = 1234;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- final Context context = RuntimeEnvironment.application;
- mController = new CarrierSettingsVersionPreferenceController(context, "mock_key");
- mController.init(mSubscriptionId);
- mCarrierConfigManager = Shadows.shadowOf(
- context.getSystemService(CarrierConfigManager.class));
- }
-
- @Test
- public void getSummary_nullConfig_noCrash() {
- mCarrierConfigManager.setConfigForSubId(mSubscriptionId, null);
- assertThat(mController.getSummary()).isNull();
- }
-
- @Test
- public void getSummary_nullVersionString_noCrash() {
- mCarrierConfigManager.setConfigForSubId(mSubscriptionId, new PersistableBundle());
- 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");
- mCarrierConfigManager.setConfigForSubId(mSubscriptionId, bundle);
- assertThat(mController.getSummary()).isEqualTo("test_version_123");
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceControllerTest.java
index 3d54cfb..fd5ed37 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/ContactDiscoveryPreferenceControllerTest.java
@@ -159,7 +159,9 @@
}
private void setRcsPresenceConfig(boolean isEnabled) {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, isEnabled);
+ mCarrierConfig.putBoolean(
+ CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL,
+ isEnabled);
}
private ContentObserver getUceChangeObserver() {
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java
deleted file mode 100644
index 3eb3caf..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-
-import androidx.preference.Preference;
-
-import com.android.settingslib.RestrictedPreference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataServiceSetupPreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- private static final String SETUP_URL = "url://tmp_url:^1";
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
-
- private PersistableBundle mCarrierConfig;
- private DataServiceSetupPreferenceController mController;
- private Preference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL, SETUP_URL);
-
- mCarrierConfig = new PersistableBundle();
- doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
-
- mPreference = new RestrictedPreference(mContext);
- mController = new DataServiceSetupPreferenceController(mContext, "data_service_setup");
- mController.init(SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_allConfigOn_returnAvailable() {
- doReturn(true).when(mTelephonyManager).isLteCdmaEvdoGsmWcdmaEnabled();
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- false);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_missUrl_returnUnavailable() {
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL, "");
- doReturn(true).when(mTelephonyManager).isLteCdmaEvdoGsmWcdmaEnabled();
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- false);
-
- mController = new DataServiceSetupPreferenceController(mContext, "data_service_setup");
- mController.init(SUB_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_notCdma_returnUnavailable() {
- doReturn(false).when(mTelephonyManager).isLteCdmaEvdoGsmWcdmaEnabled();
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- false);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void handlePreferenceTreeClick_startActivity() {
- ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(captor.capture());
-
- mController.handlePreferenceTreeClick(mPreference);
-
- final Intent intent = captor.getValue();
- assertThat(intent.getAction()).isEqualTo(Intent.ACTION_VIEW);
- assertThat(intent.getData()).isEqualTo(
- Uri.parse(TextUtils.expandTemplate(SETUP_URL, "").toString()));
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java
deleted file mode 100644
index fa48ba5..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java
+++ /dev/null
@@ -1,91 +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 static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-
-import com.android.settings.network.SubscriptionUtil;
-
-import org.junit.Before;
-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 java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-public class DisableSimFooterPreferenceControllerTest {
- private static final String PREF_KEY = "pref_key";
- private static final int SUB_ID = 111;
-
- @Mock
- private SubscriptionInfo mInfo;
-
- private Context mContext;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- private DisableSimFooterPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
- when(mInfo.getSubscriptionId()).thenReturn(SUB_ID);
- SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mInfo));
- mController = new DisableSimFooterPreferenceController(mContext, PREF_KEY);
- }
-
- @Test
- public void isAvailable_noInit_notAvailable() {
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void isAvailable_eSIM_notAvailable() {
- when(mInfo.isEmbedded()).thenReturn(true);
- mController.init(SUB_ID);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void isAvailable_pSIM_available_cannot_disable_pSIM() {
- when(mInfo.isEmbedded()).thenReturn(false);
- mController.init(SUB_ID);
- doReturn(false).when(mSubscriptionManager).canDisablePhysicalSubscription();
- assertThat(mController.isAvailable()).isTrue();
- }
-
- @Test
- public void isAvailable_pSIM_available_can_disable_pSIM() {
- when(mInfo.isEmbedded()).thenReturn(false);
- mController.init(SUB_ID);
- doReturn(true).when(mSubscriptionManager).canDisablePhysicalSubscription();
- assertThat(mController.isAvailable()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
deleted file mode 100644
index 416e2f0..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
-import static android.app.slice.Slice.HINT_TITLE;
-import static android.app.slice.SliceItem.FORMAT_TEXT;
-
-import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.ims.ProvisioningManager;
-
-import androidx.slice.Slice;
-import androidx.slice.SliceItem;
-import androidx.slice.SliceMetadata;
-import androidx.slice.SliceProvider;
-import androidx.slice.core.SliceAction;
-import androidx.slice.core.SliceQuery;
-import androidx.slice.widget.SliceLiveData;
-
-import com.android.settings.R;
-import com.android.settings.network.ims.MockVolteQueryImsState;
-import com.android.settings.slices.CustomSliceRegistry;
-import com.android.settings.slices.SettingsSliceProvider;
-import com.android.settings.slices.SliceBroadcastReceiver;
-import com.android.settings.slices.SlicesFeatureProvider;
-import com.android.settings.testutils.FakeFeatureFactory;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowSubscriptionManager;
-
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class Enhanced4gLteSliceHelperTest {
- private static final int SUB_ID = 1;
-
- @Mock
- private CarrierConfigManager mMockCarrierConfigManager;
-
- @Mock
- private ProvisioningManager mProvisioningManager;
-
- private ShadowSubscriptionManager mShadowSubscriptionManager;
- private MockVolteQueryImsState mQueryImsState;
-
- private Context mContext;
- private FakeEnhanced4gLteSliceHelper mEnhanced4gLteSliceHelper;
- private SettingsSliceProvider mProvider;
- private SliceBroadcastReceiver mReceiver;
- private FakeFeatureFactory mFeatureFactory;
- private SlicesFeatureProvider mSlicesFeatureProvider;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
-
- mShadowSubscriptionManager = Shadow.extract(mContext.getSystemService(
- SubscriptionManager.class));
- mShadowSubscriptionManager.setDefaultVoiceSubscriptionId(SUB_ID);
-
- mFeatureFactory = FakeFeatureFactory.setupForTest();
- mSlicesFeatureProvider = mFeatureFactory.getSlicesFeatureProvider();
-
- //setup for SettingsSliceProvider tests
- mProvider = spy(new SettingsSliceProvider());
- doReturn(mContext).when(mProvider).getContext();
- mProvider.onCreateSliceProvider();
-
- //setup for SliceBroadcastReceiver test
- mReceiver = spy(new SliceBroadcastReceiver());
-
- mQueryImsState = spy(new MockVolteQueryImsState(mContext, SUB_ID));
- mQueryImsState.setEnabledByPlatform(true);
- mQueryImsState.setIsProvisionedOnDevice(true);
- mQueryImsState.setIsTtyOnVolteEnabled(true);
- mQueryImsState.setServiceStateReady(true);
- mQueryImsState.setIsEnabledByUser(true);
-
- mEnhanced4gLteSliceHelper = spy(new FakeEnhanced4gLteSliceHelper(mContext));
- doReturn(mQueryImsState).when(mEnhanced4gLteSliceHelper).queryImsState(anyInt());
-
- // Set-up specs for SliceMetadata.
- SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
- }
-
- @Test
- public void test_CreateEnhanced4gLteSlice_invalidSubId() {
- mQueryImsState.setEnabledByPlatform(false);
- mQueryImsState.setIsProvisionedOnDevice(false);
- mQueryImsState.setIsEnabledByUser(false);
- mShadowSubscriptionManager.setDefaultVoiceSubscriptionId(-1);
-
- final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice(
- CustomSliceRegistry.ENHANCED_4G_SLICE_URI);
-
- assertThat(slice).isNull();
- }
-
- @Test
- public void test_CreateEnhanced4gLteSlice_enhanced4gLteNotSupported() {
- mQueryImsState.setEnabledByPlatform(false);
-
- final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice(
- CustomSliceRegistry.ENHANCED_4G_SLICE_URI);
-
- assertThat(mEnhanced4gLteSliceHelper.getDefaultVoiceSubId()).isEqualTo(1);
- assertThat(slice).isNull();
- }
-
- @Test
- public void test_CreateEnhanced4gLteSlice_success() {
- mQueryImsState.setEnabledByPlatform(true);
- mQueryImsState.setIsProvisionedOnDevice(true);
- when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
-
- final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice(
- CustomSliceRegistry.ENHANCED_4G_SLICE_URI);
-
- assertThat(mEnhanced4gLteSliceHelper.getDefaultVoiceSubId()).isEqualTo(1);
- testEnhanced4gLteSettingsToggleSlice(slice);
- }
-
- @Test
- public void test_SettingSliceProvider_getsRightSliceEnhanced4gLte() {
- mQueryImsState.setEnabledByPlatform(true);
- mQueryImsState.setIsProvisionedOnDevice(true);
- when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
- when(mSlicesFeatureProvider.getNewEnhanced4gLteSliceHelper(mContext))
- .thenReturn(mEnhanced4gLteSliceHelper);
-
- final Slice slice = mProvider.onBindSlice(CustomSliceRegistry.ENHANCED_4G_SLICE_URI);
-
- assertThat(mEnhanced4gLteSliceHelper.getDefaultVoiceSubId()).isEqualTo(1);
- testEnhanced4gLteSettingsToggleSlice(slice);
- }
-
- @Test
- @Ignore
- public void test_SliceBroadcastReceiver_toggleOffEnhanced4gLte() {
- mQueryImsState.setEnabledByPlatform(true);
- mQueryImsState.setIsProvisionedOnDevice(true);
- mQueryImsState.setIsEnabledByUser(false);
- when(mSlicesFeatureProvider.getNewEnhanced4gLteSliceHelper(mContext))
- .thenReturn(mEnhanced4gLteSliceHelper);
-
- final ArgumentCaptor<Boolean> mEnhanced4gLteSettingCaptor = ArgumentCaptor.forClass(
- Boolean.class);
-
- // turn on Enhanced4gLte setting
- final Intent intent = new Intent(Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED);
- intent.putExtra(EXTRA_TOGGLE_STATE, true);
-
- // change the setting
- mReceiver.onReceive(mContext, intent);
-
- verify(mEnhanced4gLteSliceHelper).setEnhanced4gLteModeSetting(anyInt(),
- mEnhanced4gLteSettingCaptor.capture());
-
- // assert the change
- assertThat(mEnhanced4gLteSettingCaptor.getValue()).isTrue();
- }
-
- private void testEnhanced4gLteSettingsUnavailableSlice(Slice slice,
- PendingIntent expectedPrimaryAction) {
- final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
-
- //Check there is no toggle action
- final List<SliceAction> toggles = metadata.getToggles();
- assertThat(toggles).isEmpty();
-
- // Check whether the primary action is to open Enhanced4gLte settings activity
- final PendingIntent primaryPendingIntent =
- metadata.getPrimaryAction().getAction();
- assertThat(primaryPendingIntent).isEqualTo(expectedPrimaryAction);
-
- // Check the title
- final List<SliceItem> sliceItems = slice.getItems();
- assertTitle(sliceItems, mContext.getString(R.string.enhanced_4g_lte_mode_title));
- }
-
- private void testEnhanced4gLteSettingsToggleSlice(Slice slice) {
- final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
-
- final List<SliceAction> toggles = metadata.getToggles();
- assertThat(toggles).hasSize(1);
-
- final SliceAction mainToggleAction = toggles.get(0);
-
- // Check intent in Toggle Action
- final PendingIntent togglePendingIntent = mainToggleAction.getAction();
- final PendingIntent expectedToggleIntent = getBroadcastIntent(
- Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED);
- assertThat(togglePendingIntent).isEqualTo(expectedToggleIntent);
-
- // Check primary intent
- final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
- final PendingIntent expectedPendingIntent =
- getActivityIntent(Enhanced4gLteSliceHelper.ACTION_MOBILE_NETWORK_SETTINGS_ACTIVITY);
- assertThat(primaryPendingIntent).isEqualTo(expectedPendingIntent);
-
- // Check the title
- final List<SliceItem> sliceItems = slice.getItems();
- assertTitle(sliceItems, mContext.getString(R.string.enhanced_4g_lte_mode_title));
- }
-
- private PendingIntent getBroadcastIntent(String action) {
- final Intent intent = new Intent(action);
- intent.setClass(mContext, SliceBroadcastReceiver.class);
- return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
- }
-
- private PendingIntent getActivityIntent(String action) {
- final Intent intent = new Intent(action);
- intent.setPackage(SETTINGS_PACKAGE_NAME);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */);
- }
-
- private void assertTitle(List<SliceItem> sliceItems, String title) {
- boolean hasTitle = false;
- for (SliceItem item : sliceItems) {
- final List<SliceItem> titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE,
- null /* non-hints */);
- if (titleItems == null) {
- continue;
- }
-
- hasTitle = true;
- for (SliceItem subTitleItem : titleItems) {
- assertThat(subTitleItem.getText()).isEqualTo(title);
- }
- }
- assertThat(hasTitle).isTrue();
- }
-
- private class FakeEnhanced4gLteSliceHelper extends Enhanced4gLteSliceHelper {
- int mSubId = SUB_ID;
-
- FakeEnhanced4gLteSliceHelper(Context context) {
- super(context);
- }
-
- @Override
- protected CarrierConfigManager getCarrierConfigManager() {
- return mMockCarrierConfigManager;
- }
-
- protected int getDefaultVoiceSubId() {
- return mSubId;
- }
-
- private void setDefaultVoiceSubId(int id) {
- mSubId = id;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java
deleted file mode 100644
index bb60fd6..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.spy;
-import static org.robolectric.Shadows.shadowOf;
-
-import android.content.Context;
-import android.content.Intent;
-import android.telephony.TelephonyManager;
-import android.telephony.euicc.EuiccManager;
-
-import androidx.preference.Preference;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowTelephonyManager;
-
-@RunWith(AndroidJUnit4.class)
-public class EuiccPreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- private TelephonyManager mTelephonyManager;
- private ShadowTelephonyManager mShadowTelephonyManager;
-
- private EuiccPreferenceController mController;
- private Preference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application.getBaseContext());
-
- mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
- mShadowTelephonyManager = shadowOf(mTelephonyManager);
- mShadowTelephonyManager.setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyManager);
-
- mPreference = new Preference(mContext);
- mController = new EuiccPreferenceController(mContext, "euicc");
- mController.init(SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void handlePreferenceTreeClick_startActivity() {
- ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(captor.capture());
-
- mController.handlePreferenceTreeClick(mPreference);
-
- assertThat(captor.getValue().getAction()).isEqualTo(
- EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java
deleted file mode 100644
index c28c28c..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java
+++ /dev/null
@@ -1,125 +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 static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.telephony.data.ApnSetting;
-
-import androidx.preference.SwitchPreference;
-
-import org.junit.Before;
-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;
-import org.robolectric.shadows.ShadowSubscriptionManager;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowSubscriptionManager.class)
-public class MmsMessagePreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
-
- private MmsMessagePreferenceController mController;
- private SwitchPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
-
- mPreference = new SwitchPreference(mContext);
- mController = new MmsMessagePreferenceController(mContext, "mms_message");
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
- mController.init(SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_invalidSubscription_returnUnavailable() {
- mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_mobileDataOn_returnUnavailable() {
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
-
- assertThat(mController.getAvailabilityStatus(SUB_ID)).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_meteredOff_returnUnavailable() {
- when(mTelephonyManager.isApnMetered(ApnSetting.TYPE_MMS)).thenReturn(false);
-
- assertThat(mController.getAvailabilityStatus(SUB_ID)).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_mobileDataOffWithValidSubId_returnAvailable() {
- mController.init(SUB_ID);
- when(mTelephonyManager.isDataEnabled()).thenReturn(false);
- when(mTelephonyManager.isApnMetered(ApnSetting.TYPE_MMS)).thenReturn(true);
-
- assertThat(mController.getAvailabilityStatus(SUB_ID)).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void isChecked_returnDataFromTelephonyManager() {
- when(mTelephonyManager.isDataEnabledForApn(ApnSetting.TYPE_MMS)).thenReturn(false);
- assertThat(mController.isChecked()).isFalse();
-
- when(mTelephonyManager.isDataEnabledForApn(ApnSetting.TYPE_MMS)).thenReturn(true);
- assertThat(mController.isChecked()).isTrue();
- }
-
- @Test
- public void setChecked_setDataIntoSubscriptionManager() {
- mController.setChecked(true);
- verify(mTelephonyManager).setMobileDataPolicyEnabledStatus(
- TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED, true);
-
- mController.setChecked(false);
- verify(mTelephonyManager).setMobileDataPolicyEnabledStatus(
- TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED, false);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
deleted file mode 100644
index 29f0f25..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-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;
-import org.robolectric.shadows.ShadowSubscriptionManager;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowSubscriptionManager.class)
-public class MobileDataPreferenceControllerTest {
- private static final int SUB_ID = 2;
- private static final int SUB_ID_OTHER = 3;
-
- @Mock
- private FragmentManager mFragmentManager;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private SubscriptionInfo mSubscriptionInfo;
- @Mock
- private FragmentTransaction mFragmentTransaction;
-
- private MobileDataPreferenceController mController;
- private SwitchPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction();
-
- mPreference = new SwitchPreference(mContext);
- mController = new MobileDataPreferenceController(mContext, "mobile_data");
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
- mController.init(mFragmentManager, SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_invalidSubscription_returnAvailableUnsearchable() {
- mController.init(mFragmentManager, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
- }
-
- @Test
- public void isDialogNeeded_disableSingleSim_returnFalse() {
- doReturn(true).when(mTelephonyManager).isDataEnabled();
- doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- doReturn(1).when(mTelephonyManager).getActiveModemCount();
-
- assertThat(mController.isDialogNeeded()).isFalse();
- }
-
- @Test
- public void isDialogNeeded_enableNonDefaultSimInMultiSimMode_returnTrue() {
- doReturn(false).when(mTelephonyManager).isDataEnabled();
- doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(SUB_ID_OTHER);
- ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID_OTHER);
- doReturn(2).when(mTelephonyManager).getActiveModemCount();
-
- assertThat(mController.isDialogNeeded()).isTrue();
- assertThat(mController.mDialogType).isEqualTo(
- MobileDataDialogFragment.TYPE_MULTI_SIM_DIALOG);
- }
-
- @Test
- public void handlePreferenceTreeClick_needDialog_showDialog() {
- mController.mNeedDialog = true;
-
- mController.handlePreferenceTreeClick(mPreference);
-
- verify(mFragmentManager).beginTransaction();
- }
-
- @Test
- public void onPreferenceChange_singleSim_On_shouldEnableData() {
- doReturn(true).when(mTelephonyManager).isDataEnabled();
- doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- doReturn(1).when(mTelephonyManager).getActiveModemCount();
-
- mController.onPreferenceChange(mPreference, true);
-
- verify(mTelephonyManager).setDataEnabled(true);
- }
-
- @Test
- public void onPreferenceChange_multiSim_On_shouldEnableData() {
- doReturn(true).when(mTelephonyManager).isDataEnabled();
- doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- doReturn(2).when(mTelephonyManager).getActiveModemCount();
-
- mController.onPreferenceChange(mPreference, true);
-
- verify(mTelephonyManager).setDataEnabled(true);
- }
-
- @Test
- public void isChecked_returnUserDataEnabled() {
- mController.init(mFragmentManager, SUB_ID);
- assertThat(mController.isChecked()).isFalse();
-
- doReturn(true).when(mTelephonyManager).isDataEnabled();
- assertThat(mController.isChecked()).isTrue();
- }
-
- @Test
- public void updateState_opportunistic_disabled() {
- doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- mController.init(mFragmentManager, SUB_ID);
- doReturn(true).when(mSubscriptionInfo).isOpportunistic();
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- assertThat(mPreference.getSummary())
- .isEqualTo(mContext.getString(R.string.mobile_data_settings_summary_auto_switch));
- }
-
- @Test
- public void updateState_notOpportunistic_enabled() {
- doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- mController.init(mFragmentManager, SUB_ID);
- doReturn(false).when(mSubscriptionInfo).isOpportunistic();
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isTrue();
- assertThat(mPreference.getSummary())
- .isEqualTo(mContext.getString(R.string.mobile_data_settings_summary));
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
deleted file mode 100644
index bbb8aac..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telecom.PhoneAccountHandle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
-
-import org.junit.Before;
-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 java.util.ArrayList;
-import java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-public class MobileNetworkUtilsTest {
- private static final String PACKAGE_NAME = "com.android.app";
- private static final int SUB_ID_1 = 1;
- private static final int SUB_ID_2 = 2;
- private static final int SUB_ID_INVALID = -1;
- private static final String PLMN_FROM_TELEPHONY_MANAGER_API = "testPlmn";
- private static final String PLMN_FROM_SUB_ID_1 = "testPlmnSub1";
- private static final String PLMN_FROM_SUB_ID_2 = "testPlmnSub2";
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mTelephonyManager2;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private SubscriptionInfo mSubscriptionInfo1;
- @Mock
- private SubscriptionInfo mSubscriptionInfo2;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private PhoneAccountHandle mPhoneAccountHandle;
- @Mock
- private ComponentName mComponentName;
- @Mock
- private ResolveInfo mResolveInfo;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
-
- private Context mContext;
- private PersistableBundle mCarrierConfig;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID_1)).thenReturn(mTelephonyManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID_2)).thenReturn(mTelephonyManager2);
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
- when(mPhoneAccountHandle.getComponentName()).thenReturn(mComponentName);
- when(mComponentName.getPackageName()).thenReturn(PACKAGE_NAME);
- when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
- mCarrierConfigManager);
-
- mCarrierConfig = new PersistableBundle();
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID_1)).thenReturn(mCarrierConfig);
-
- when(mSubscriptionInfo1.getSubscriptionId()).thenReturn(SUB_ID_1);
- when(mSubscriptionInfo1.getCarrierName()).thenReturn(PLMN_FROM_SUB_ID_1);
- when(mSubscriptionInfo2.getSubscriptionId()).thenReturn(SUB_ID_2);
- when(mSubscriptionInfo2.getCarrierName()).thenReturn(PLMN_FROM_SUB_ID_2);
-
- when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
- Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
- when(mSubscriptionManager.getAccessibleSubscriptionInfoList()).thenReturn(
- Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
-
- when(mTelephonyManager.getNetworkOperatorName()).thenReturn(
- PLMN_FROM_TELEPHONY_MANAGER_API);
- }
-
- @Test
- public void setMobileDataEnabled_setEnabled_enabled() {
- MobileNetworkUtils.setMobileDataEnabled(mContext, SUB_ID_1, true, false);
-
- verify(mTelephonyManager).setDataEnabled(true);
- verify(mTelephonyManager2, never()).setDataEnabled(anyBoolean());
- }
-
- @Test
- public void setMobileDataEnabled_setDisabled_disabled() {
- MobileNetworkUtils.setMobileDataEnabled(mContext, SUB_ID_2, true, false);
-
- verify(mTelephonyManager2).setDataEnabled(true);
- verify(mTelephonyManager, never()).setDataEnabled(anyBoolean());
- }
-
- @Test
- public void setMobileDataEnabled_disableOtherSubscriptions() {
- MobileNetworkUtils.setMobileDataEnabled(mContext, SUB_ID_1, true, true);
-
- verify(mTelephonyManager).setDataEnabled(true);
- verify(mTelephonyManager2).setDataEnabled(false);
- }
-
- @Test
- public void buildConfigureIntent_nullHandle_returnNull() {
- assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, null)).isNull();
- }
-
- @Test
- public void buildConfigureIntent_noActivityHandleIntent_returnNull() {
- when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
- .thenReturn(new ArrayList<>());
-
- assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
- mPhoneAccountHandle)).isNull();
- }
-
- @Test
- public void buildConfigureIntent_hasActivityHandleIntent_returnIntent() {
- when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
- .thenReturn(Arrays.asList(mResolveInfo));
-
- assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
- mPhoneAccountHandle)).isNotNull();
- }
-
- @Test
- public void isCdmaOptions_phoneTypeCdma_returnTrue() {
- when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);
-
- assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void isCdmaOptions_worldModeWithGsmWcdma_returnTrue() {
- when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
-
- assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void isCdmaOptions_carrierWorldModeWithoutHideCarrier_returnTrue() {
- when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- false);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL, true);
-
- assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void getSearchableSubscriptionId_oneActive_returnValid() {
- when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
- Arrays.asList(mSubscriptionInfo1));
- assertThat(MobileNetworkUtils.getSearchableSubscriptionId(mContext)).isEqualTo(SUB_ID_1);
- }
-
- @Test
- public void getSearchableSubscriptionId_nonActive_returnInvalid() {
- when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(new ArrayList<>());
-
- assertThat(MobileNetworkUtils.getSearchableSubscriptionId(mContext))
- .isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- }
-
- @Test
- public void shouldDisplayNetworkSelectOptions_HideCarrierNetwork_returnFalse() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- true);
-
- assertThat(MobileNetworkUtils.shouldDisplayNetworkSelectOptions(mContext, SUB_ID_1))
- .isFalse();
- }
-
- @Test
- public void shouldDisplayNetworkSelectOptions_allCheckPass_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- false);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CSP_ENABLED_BOOL, false);
- when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
-
- assertThat(MobileNetworkUtils.shouldDisplayNetworkSelectOptions(mContext, SUB_ID_1))
- .isTrue();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_notWorldMode_returnFalse() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, false);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isFalse();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_supportTdscdma_returnFalse() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, true);
-
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isFalse();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaGsm_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM);
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaGsmWcdma_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA);
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdma_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA);
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaWcdma_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA);
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaCdmaEvdoGsmWcdma_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA);
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void shouldSpeciallyUpdateGsmCdma_ModeLteCdmaEvdoGsmWcdma_returnTrue() {
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
-
- Settings.Global.putInt(mContext.getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
- TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA);
- assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
- }
-
- @Test
- public void getCurrentCarrierNameForDisplay_withoutValidSubId_returnNetworkOperatorName() {
- assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
- mContext, SUB_ID_INVALID)).isEqualTo(PLMN_FROM_TELEPHONY_MANAGER_API);
- }
-
- @Test
- public void getCurrentCarrierNameForDisplay_withValidSubId_returnCurrentCarrierName() {
- assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
- mContext, SUB_ID_1)).isEqualTo(PLMN_FROM_SUB_ID_1);
- assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
- mContext, SUB_ID_2)).isEqualTo(PLMN_FROM_SUB_ID_2);
- }
-
- @Test
- public void getCurrentCarrierNameForDisplay_withoutSubId_returnNotNull() {
- assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
- mContext)).isNotNull();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceControllerTest.java
deleted file mode 100644
index b4e8a25..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceControllerTest.java
+++ /dev/null
@@ -1,107 +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.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import org.junit.Before;
-import org.junit.Ignore;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class NrDisabledInDsdsFooterPreferenceControllerTest {
- private static final String PREF_KEY = "pref_key";
- private static final int SUB_ID = 111;
-
- private Context mContext;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- private NrDisabledInDsdsFooterPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(
- Context.TELEPHONY_SUBSCRIPTION_SERVICE);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt());
- mController = new NrDisabledInDsdsFooterPreferenceController(mContext, PREF_KEY);
- }
-
- @Test
- public void isAvailable_noInit_notAvailable() {
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- @Ignore
- public void isAvailable_dataOnAndDsdsAnd5GSupported_Available() {
- when(mTelephonyManager.getSupportedRadioAccessFamily())
- .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR);
- when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1, 2});
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
- mController.init(SUB_ID);
- assertThat(mController.isAvailable()).isTrue();
- }
-
- @Test
- public void isAvailable_5gNotSupported_notAvailable() {
- when(mTelephonyManager.getSupportedRadioAccessFamily())
- .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_LTE);
- when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1, 2});
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
- mController.init(SUB_ID);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void isAvailable_mobileDataOff_notAvailable() {
- when(mTelephonyManager.getSupportedRadioAccessFamily())
- .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR);
- when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1, 2});
- when(mTelephonyManager.isDataEnabled()).thenReturn(false);
- mController.init(SUB_ID);
- assertThat(mController.isAvailable()).isFalse();
- }
-
- @Test
- public void isAvailable_singleSimMode_notAvailable() {
- when(mTelephonyManager.getSupportedRadioAccessFamily())
- .thenReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR);
- when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1});
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
- mController.init(SUB_ID);
- assertThat(mController.isAvailable()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java
deleted file mode 100644
index 1feb08b..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceControllerTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-import static com.android.settings.network.telephony.MobileNetworkUtils.getRafFromNetworkType;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.ServiceState;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.preference.ListPreference;
-
-import com.android.settings.R;
-import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class PreferredNetworkModePreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
- @Mock
- private ServiceState mServiceState;
-
- private PersistableBundle mPersistableBundle;
- private PreferredNetworkModePreferenceController mController;
- private ListPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class);
- doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- doReturn(mServiceState).when(mTelephonyManager).getServiceState();
- mPersistableBundle = new PersistableBundle();
- doReturn(mPersistableBundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
-
- mPreference = new ListPreference(mContext);
- mPreference.setEntries(R.array.preferred_network_mode_choices);
- mPreference.setEntryValues(R.array.preferred_network_mode_values);
- mController = new PreferredNetworkModePreferenceController(mContext, "mobile_data");
- mController.init(SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_hideCarrierNetworkSettings_returnUnavailable() {
- mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- true);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_worldPhone_returnAvailable() {
- mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
- false);
- mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL, true);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_hidePreferredNetworkType_returnUnavailable() {
- mPersistableBundle.putBoolean(CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL,
- true);
-
- when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
- when(mServiceState.getDataRegistrationState()).thenReturn(
- ServiceState.STATE_OUT_OF_SERVICE);
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
-
- when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
- when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE);
-
- when(mServiceState.getRoaming()).thenReturn(false);
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
-
- when(mServiceState.getRoaming()).thenReturn(true);
- assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
- }
-
- @Test
- public void updateState_updateByNetworkMode() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
- TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.getValue()).isEqualTo(
- String.valueOf(TelephonyManagerConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA));
- assertThat(mPreference.getSummary()).isEqualTo(
- mContext.getString(R.string.preferred_network_mode_tdscdma_gsm_wcdma_summary));
- }
-
- @Test
- public void onPreferenceChange_updateSuccess() {
- doReturn(true).when(mTelephonyManager).setPreferredNetworkTypeBitmask(
- getRafFromNetworkType(TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA));
-
- mController.onPreferenceChange(mPreference,
- String.valueOf(TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA));
-
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID, 0)).isEqualTo(
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA);
- }
-
- @Test
- public void onPreferenceChange_updateFail() {
- doReturn(false).when(mTelephonyManager).setPreferredNetworkTypeBitmask(
- getRafFromNetworkType(TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA));
-
- mController.onPreferenceChange(mPreference,
- String.valueOf(TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA));
-
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID, 0)).isNotEqualTo(
- TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/RoamingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/RoamingPreferenceControllerTest.java
deleted file mode 100644
index 092b9b7..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/RoamingPreferenceControllerTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
-import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.RestrictedSwitchPreference;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class RoamingPreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private FragmentManager mFragmentManager;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private FragmentTransaction mFragmentTransaction;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
-
- private RoamingPreferenceController mController;
- private RestrictedSwitchPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
- doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction();
-
- mPreference = spy(new RestrictedSwitchPreference(mContext));
- mController = spy(new RoamingPreferenceController(mContext, "roaming"));
- mController.init(mFragmentManager, SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_validSubId_returnAvailable() {
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_invalidSubId_returnUnsearchable() {
- mController.init(mFragmentManager, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE_UNSEARCHABLE);
- }
-
- @Test
- public void isDialogNeeded_roamingDisabledWithoutFlag_returnTrue() {
- final PersistableBundle bundle = new PersistableBundle();
- bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
- doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
- doReturn(false).when(mTelephonyManager).isDataRoamingEnabled();
-
- assertThat(mController.isDialogNeeded()).isTrue();
- }
-
- @Test
- public void isDialogNeeded_roamingEnabled_returnFalse() {
- doReturn(true).when(mTelephonyManager).isDataRoamingEnabled();
-
- assertThat(mController.isDialogNeeded()).isFalse();
- }
-
- @Test
- public void setChecked_needDialog_showDialog() {
- doReturn(true).when(mController).isDialogNeeded();
-
- mController.setChecked(true);
-
- verify(mFragmentManager).beginTransaction();
- }
-
- @Test
- public void updateState_invalidSubId_disabled() {
- mController.init(mFragmentManager, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void updateState_validSubId_enabled() {
- doReturn(true).when(mTelephonyManager).isDataRoamingEnabled();
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isTrue();
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void updateState_isNotDisabledByAdmin_shouldInvokeSetEnabled() {
- when(mPreference.isDisabledByAdmin()).thenReturn(false);
-
- mController.updateState(mPreference);
-
- verify(mPreference).setEnabled(anyBoolean());
- }
-
- @Test
- public void updateState_isDisabledByAdmin_shouldNotInvokeSetEnabled() {
- when(mPreference.isDisabledByAdmin()).thenReturn(true);
-
- mController.updateState(mPreference);
-
- verify(mPreference, never()).setEnabled(anyBoolean());
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/TelephonyBasePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/TelephonyBasePreferenceControllerTest.java
deleted file mode 100644
index 6ba2ffa..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/TelephonyBasePreferenceControllerTest.java
+++ /dev/null
@@ -1,98 +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 static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-
-import org.junit.Before;
-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 java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-public class TelephonyBasePreferenceControllerTest {
- private static final int VALID_SUB_ID = 1;
-
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private SubscriptionInfo mSubscriptionInfo;
-
- private TestPreferenceController mPreferenceController;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(SubscriptionManager.class))
- .thenReturn(mSubscriptionManager);
- when(mSubscriptionInfo.getSubscriptionId()).thenReturn(VALID_SUB_ID);
- mPreferenceController = new TestPreferenceController(mContext, "prefKey");
- }
-
- @Test
- public void isAvailable_validSubIdSet_returnTrue() {
- mPreferenceController.init(VALID_SUB_ID);
-
- assertThat(mPreferenceController.isAvailable()).isTrue();
- }
-
- @Test
- public void isAvailable_noIdSetHoweverHasDefaultOne_returnTrue() {
- when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
- Arrays.asList(mSubscriptionInfo));
-
- assertThat(mPreferenceController.isAvailable()).isTrue();
- }
-
- @Test
- public void isAvailable_noDefaultAndNoSet_returnFalse() {
- assertThat(mPreferenceController.isAvailable()).isFalse();
- }
-
- /**
- * Test preference controller for {@link TelephonyBasePreferenceController}
- */
- public class TestPreferenceController extends TelephonyBasePreferenceController {
- public TestPreferenceController(Context context, String prefKey) {
- super(context, prefKey);
- }
-
- public void init(int subId) {
- mSubId = subId;
- }
-
- @Override
- public int getAvailabilityStatus(int subId) {
- return subId == VALID_SUB_ID ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/TelephonyTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/TelephonyTogglePreferenceControllerTest.java
deleted file mode 100644
index 7542512..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/TelephonyTogglePreferenceControllerTest.java
+++ /dev/null
@@ -1,67 +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 android.content.Context;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class TelephonyTogglePreferenceControllerTest {
-
- private Context mContext;
- private FakeTelephonyToggle mFakeTelephonyToggle;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mFakeTelephonyToggle = new FakeTelephonyToggle(mContext, "key");
- }
-
- @Test
- public void isSliceable_byDefault_shouldReturnFalse() {
- assertThat(mFakeTelephonyToggle.isSliceable()).isFalse();
- }
-
- private static class FakeTelephonyToggle extends TelephonyTogglePreferenceController {
-
- private FakeTelephonyToggle(Context context, String preferenceKey) {
- super(context, preferenceKey);
- }
-
- @Override
- public boolean isChecked() {
- return false;
- }
-
- @Override
- public boolean setChecked(boolean isChecked) {
- return false;
- }
-
- @Override
- public int getAvailabilityStatus(int subId) {
- return 0;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java
deleted file mode 100644
index 40329a5..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony.cdma;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.telephony.TelephonyManager;
-
-import androidx.preference.PreferenceManager;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class CdmaListPreferenceTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private PreferenceManager mPreferenceManager;
-
- private CdmaListPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
-
- mPreference = spy(new CdmaListPreference(mContext, null));
- mPreference.setSubId(SUB_ID);
- }
-
- @Test
- public void onClick_inEcm_doNothing() {
- doReturn(true).when(mTelephonyManager).getEmergencyCallbackMode();
-
- mPreference.onClick();
-
- verify(mPreferenceManager, never()).showDialog(mPreference);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
deleted file mode 100644
index c6d3868..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony.cdma;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceManager;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class CdmaSubscriptionPreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private PreferenceManager mPreferenceManager;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
-
- private CdmaSubscriptionPreferenceController mController;
- private ListPreference mPreference;
- private PersistableBundle mCarrierConfig;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
-
- mCarrierConfig = new PersistableBundle();
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
-
- mPreference = new ListPreference(mContext);
- mController = new CdmaSubscriptionPreferenceController(mContext, "mobile_data");
- mController.init(mPreferenceManager, SUB_ID);
- mController.mPreference = mPreference;
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void onPreferenceChange_selectNV_returnNVMode() {
- mController.onPreferenceChange(mPreference, Integer.toString(
- TelephonyManager.CDMA_SUBSCRIPTION_NV));
-
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.CDMA_SUBSCRIPTION_MODE,
- TelephonyManager.CDMA_SUBSCRIPTION_RUIM_SIM)).isEqualTo(
- TelephonyManager.CDMA_SUBSCRIPTION_NV);
- }
-
- @Test
- public void updateState_stateRUIM_displayRUIM() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.CDMA_SUBSCRIPTION_MODE, TelephonyManager.CDMA_SUBSCRIPTION_NV);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.getValue()).isEqualTo(Integer.toString(
- TelephonyManager.CDMA_SUBSCRIPTION_NV));
- }
-
- @Test
- public void updateState_stateUnknown_doNothing() {
- mPreference.setValue(Integer.toString(TelephonyManager.CDMA_SUBSCRIPTION_NV));
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.CDMA_SUBSCRIPTION_MODE, TelephonyManager.CDMA_SUBSCRIPTION_UNKNOWN);
-
- mController.updateState(mPreference);
-
- // Still NV mode
- assertThat(mPreference.getValue()).isEqualTo(Integer.toString(
- TelephonyManager.CDMA_SUBSCRIPTION_NV));
- }
-
- @Test
- public void deviceSupportsNvAndRuim() {
- SystemProperties.set("ril.subscription.types", "NV,RUIM");
- assertThat(mController.deviceSupportsNvAndRuim()).isTrue();
-
- SystemProperties.set("ril.subscription.types", "");
-
- assertThat(mController.deviceSupportsNvAndRuim()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
deleted file mode 100644
index 2352b0f..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony.cdma;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceManager;
-
-import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
-
-import org.junit.Before;
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class CdmaSystemSelectPreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private PreferenceManager mPreferenceManager;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private TelephonyManager mInvalidTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
-
- private CdmaSystemSelectPreferenceController mController;
- private ListPreference mPreference;
- private PersistableBundle mCarrierConfig;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
- doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
- doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
- doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
-
- mCarrierConfig = new PersistableBundle();
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
-
-
- mPreference = new ListPreference(mContext);
- mController = new CdmaSystemSelectPreferenceController(mContext, "mobile_data");
- mController.init(mPreferenceManager, SUB_ID);
- mController.mPreference = mPreference;
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void onPreferenceChange_selectHome_returnHomeMode() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.CDMA_ROAMING_MODE,
- TelephonyManager.CDMA_ROAMING_MODE_ANY);
-
- mController.onPreferenceChange(mPreference,
- Integer.toString(TelephonyManager.CDMA_ROAMING_MODE_HOME));
-
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.CDMA_ROAMING_MODE,
- TelephonyManager.CDMA_ROAMING_MODE_ANY)).isEqualTo(
- TelephonyManager.CDMA_ROAMING_MODE_HOME);
- }
-
- @Test
- public void updateState_stateHome_displayHome() {
- doReturn(TelephonyManager.CDMA_ROAMING_MODE_HOME).when(
- mTelephonyManager).getCdmaRoamingMode();
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.getValue()).isEqualTo(
- Integer.toString(TelephonyManager.CDMA_ROAMING_MODE_HOME));
- }
-
- @Test
- public void updateState_LteGSMWcdma_disabled() {
- doReturn(TelephonyManager.CDMA_ROAMING_MODE_HOME).when(
- mTelephonyManager).getCdmaRoamingMode();
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
- TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void updateState_stateOther_resetToDefault() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.CDMA_ROAMING_MODE,
- TelephonyManager.CDMA_ROAMING_MODE_HOME);
- doReturn(TelephonyManager.CDMA_ROAMING_MODE_AFFILIATED).when(
- mTelephonyManager).getCdmaRoamingMode();
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.getValue()).isEqualTo(
- Integer.toString(TelephonyManager.CDMA_ROAMING_MODE_ANY));
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.CDMA_ROAMING_MODE,
- TelephonyManager.CDMA_ROAMING_MODE_HOME)).isEqualTo(
- TelephonyManager.CDMA_ROAMING_MODE_ANY);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java
deleted file mode 100644
index d1a794d..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony.gsm;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class AutoSelectPreferenceControllerTest {
- private static final int SUB_ID = 2;
- private static final String OPERATOR_NAME = "T-mobile";
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private TelephonyManager mTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
- @Mock
- private ProgressDialog mProgressDialog;
-
- private PersistableBundle mCarrierConfig;
- private AutoSelectPreferenceController mController;
- private SwitchPreference mSwitchPreference;
- private Context mContext;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
- mCarrierConfigManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
-
- mCarrierConfig = new PersistableBundle();
- mCarrierConfig.putBoolean(CarrierConfigManager.KEY_ONLY_AUTO_SELECT_IN_HOME_NETWORK_BOOL,
- true);
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
-
- mSwitchPreference = new SwitchPreference(mContext);
- mController = new AutoSelectPreferenceController(mContext, "auto_select");
- mController.mProgressDialog = mProgressDialog;
- mController.mSwitchPreference = mSwitchPreference;
- mController.init(mLifecycle, SUB_ID);
- }
-
- @Test
- public void setChecked_isChecked_showProgressDialog() {
- when(mTelephonyManager.getNetworkSelectionMode()).thenReturn(
- TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
-
- assertThat(mController.setChecked(true)).isFalse();
- Robolectric.flushBackgroundThreadScheduler();
-
- verify(mProgressDialog).show();
- verify(mTelephonyManager).setNetworkSelectionModeAutomatic();
- }
-
- @Test
- public void updateState_isRoaming_enabled() {
- when(mTelephonyManager.getServiceState().getRoaming()).thenReturn(true);
-
- mController.updateState(mSwitchPreference);
-
- assertThat(mSwitchPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void updateState_notRoamingWithAutoSelectOn_disabled() {
- when(mTelephonyManager.getServiceState().getRoaming()).thenReturn(false);
- doReturn(OPERATOR_NAME).when(mTelephonyManager).getSimOperatorName();
-
- mController.updateState(mSwitchPreference);
-
- assertThat(mSwitchPreference.isEnabled()).isFalse();
- assertThat(mSwitchPreference.getSummary()).isEqualTo(
- mContext.getString(R.string.manual_mode_disallowed_summary,
- mTelephonyManager.getSimOperatorName()));
- }
-
- @Test
- public void init_carrierConfigNull_shouldNotCrash() {
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(null);
-
- // Should not crash
- mController.init(mLifecycle, SUB_ID);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
deleted file mode 100644
index 60de5aa..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony.gsm;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.ServiceState;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
-
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-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 java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-public class OpenNetworkSelectPagePreferenceControllerTest {
- private static final int SUB_ID = 2;
- private static final String OPERATOR_NAME = "T-mobile";
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private CarrierConfigManager mCarrierConfigManager;
- @Mock
- private ServiceState mServiceState;
- @Mock
- private SubscriptionInfo mSubscriptionInfo;
-
- private PersistableBundle mCarrierConfig;
- private OpenNetworkSelectPagePreferenceController mController;
- private Preference mPreference;
- private Context mContext;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
- mCarrierConfigManager);
- when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
- when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
-
- mCarrierConfig = new PersistableBundle();
- when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
-
- when(mSubscriptionInfo.getSubscriptionId()).thenReturn(SUB_ID);
- when(mSubscriptionInfo.getCarrierName()).thenReturn(OPERATOR_NAME);
-
- when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
- Arrays.asList(mSubscriptionInfo));
- when(mSubscriptionManager.getAccessibleSubscriptionInfoList()).thenReturn(
- Arrays.asList(mSubscriptionInfo));
-
- when(mTelephonyManager.getNetworkOperatorName()).thenReturn(OPERATOR_NAME);
-
- mPreference = new Preference(mContext);
- mController = new OpenNetworkSelectPagePreferenceController(mContext,
- "open_network_select");
- mController.init(mLifecycle, SUB_ID);
- }
-
- @Test
- public void updateState_modeAuto_disabled() {
- when(mTelephonyManager.getNetworkSelectionMode()).thenReturn(
- TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void getSummary_inService_returnOperatorName() {
- when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
-
- assertThat(mController.getSummary()).isEqualTo(OPERATOR_NAME);
- }
-
- @Test
- public void getSummary_notInService_returnDisconnect() {
- when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
-
- assertThat(mController.getSummary()).isEqualTo(
- mContext.getString(R.string.network_disconnected));
- }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/AssistantFeedbackPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AssistantFeedbackPreferenceControllerTest.java
index 8cfb0e0..9f172a6 100644
--- a/tests/robotests/src/com/android/settings/notification/AssistantFeedbackPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/AssistantFeedbackPreferenceControllerTest.java
@@ -28,12 +28,18 @@
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.provider.DeviceConfig;
import android.provider.Settings;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowDeviceConfig;
+
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -42,8 +48,10 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDeviceConfig.class})
public class AssistantFeedbackPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -65,14 +73,48 @@
when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
}
+ @After
+ public void tearDown() {
+ ShadowDeviceConfig.reset();
+ }
+
@Test
- public void testIsVisible() {
+ public void testIsVisible_DeviceConfigOn() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.ENABLE_NAS_FEEDBACK, "true", true);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isTrue();
}
@Test
+ public void testIsVisible_DeviceConfigOff() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.ENABLE_NAS_FEEDBACK, "false", true);
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void getAvailabilityStatus_DeviceConfigOn_returnAvailable() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.ENABLE_NAS_FEEDBACK, "true", true);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_DeviceConfigOff_returnUnavailable() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.ENABLE_NAS_FEEDBACK, "false", true);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
public void updateState_preferenceSetCheckedWhenSettingIsOn() {
final TwoStatePreference preference = mock(TwoStatePreference.class);
final Context context = RuntimeEnvironment.application;
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenCustomRadioButtonPreferenceTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenCustomRadioButtonPreferenceTest.java
deleted file mode 100644
index f6e51cd..0000000
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenCustomRadioButtonPreferenceTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.notification.zen;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.RadioButton;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settings.notification.zen.ZenCustomRadioButtonPreference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class ZenCustomRadioButtonPreferenceTest {
-
- private Context mContext;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- }
-
- @Test
- public void createNewPreference_shouldSetLayout() {
- final ZenCustomRadioButtonPreference preference
- = new ZenCustomRadioButtonPreference(mContext);
-
- assertThat(preference.getLayoutResource()).isEqualTo(R.layout.preference_two_target_radio);
- assertThat(preference.getWidgetLayoutResource())
- .isEqualTo(R.layout.preference_widget_gear);
- }
-
- @Test
- public void setChecked_shouldUpdateButtonCheckedState() {
- final ZenCustomRadioButtonPreference preference =
- new ZenCustomRadioButtonPreference(mContext);
- final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
- LayoutInflater.from(mContext).inflate(
- R.layout.preference_two_target_radio, null));
- final RadioButton toggle = (RadioButton) holder.findViewById(android.R.id.checkbox);
- preference.onBindViewHolder(holder);
-
- preference.setChecked(true);
- assertThat(toggle.isChecked()).isTrue();
-
- preference.setChecked(false);
- assertThat(toggle.isChecked()).isFalse();
- }
-
- @Test
- public void clickRadioButton_shouldNotifyRadioButtonClicked() {
- final ZenCustomRadioButtonPreference preference
- = new ZenCustomRadioButtonPreference(mContext);
- final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
- LayoutInflater.from(mContext).inflate(R.layout.preference_two_target_radio, null));
- final View toggle = holder.findViewById(R.id.checkbox_frame);
-
- ZenCustomRadioButtonPreference.OnRadioButtonClickListener l = mock(
- ZenCustomRadioButtonPreference.OnRadioButtonClickListener.class);
- preference.setOnRadioButtonClickListener(l);
- preference.onBindViewHolder(holder);
-
- toggle.performClick();
- verify(l).onRadioButtonClick(preference);
- }
-
- @Test
- public void clickWidgetView_shouldNotifyWidgetClicked() {
- final ZenCustomRadioButtonPreference preference =
- new ZenCustomRadioButtonPreference(mContext);
- final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
- LayoutInflater.from(mContext).inflate(R.layout.preference_two_target_radio, null));
- final View widgetView = holder.findViewById(android.R.id.widget_frame);
-
- ZenCustomRadioButtonPreference.OnGearClickListener l = mock(
- ZenCustomRadioButtonPreference.OnGearClickListener.class);
- preference.setOnGearClickListener(l);
- preference.onBindViewHolder(holder);
-
- widgetView.performClick();
- verify(l).onGearClick(preference);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceControllerTest.java
index 05537f3..45a40d3 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsAllPreferenceControllerTest.java
@@ -40,11 +40,9 @@
import androidx.preference.PreferenceScreen;
-import com.android.settings.notification.zen.ZenCustomRadioButtonPreference;
-import com.android.settings.notification.zen.ZenModeBackend;
-import com.android.settings.notification.zen.ZenModeVisEffectsAllPreferenceController;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -63,7 +61,7 @@
@Mock
private ZenModeBackend mBackend;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mPref;
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
@Mock
@@ -86,7 +84,7 @@
mContext, mock(Lifecycle.class), PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPref);
mController.displayPreference(mScreen);
}
@@ -98,9 +96,9 @@
@Test
public void updateState_notChecked() {
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 1);
- mController.updateState(mockPref);
+ mController.updateState(mPref);
- verify(mockPref).setChecked(false);
+ verify(mPref).setChecked(false);
}
@Test
@@ -115,9 +113,9 @@
| SUPPRESSED_EFFECT_PEEK
| SUPPRESSED_EFFECT_NOTIFICATION_LIST;
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, allSuppressed);
- mController.updateState(mockPref);
+ mController.updateState(mPref);
- verify(mockPref).setChecked(true);
+ verify(mPref).setChecked(true);
}
@Test
@@ -132,7 +130,7 @@
| SUPPRESSED_EFFECT_PEEK
| SUPPRESSED_EFFECT_NOTIFICATION_LIST;
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 1);
- mController.onRadioButtonClick(mockPref);
+ mController.onRadioButtonClicked(mPref);
verify(mBackend).saveVisualEffectsPolicy(allSuppressed, true);
verify(mFeatureFactory.metricsFeatureProvider).action(eq(mContext),
eq(ACTION_ZEN_SOUND_AND_VIS_EFFECTS),
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceControllerTest.java
index baea9ef..88c2c50 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsCustomPreferenceControllerTest.java
@@ -38,11 +38,9 @@
import androidx.preference.PreferenceScreen;
-import com.android.settings.notification.zen.ZenCustomRadioButtonPreference;
-import com.android.settings.notification.zen.ZenModeBackend;
-import com.android.settings.notification.zen.ZenModeVisEffectsCustomPreferenceController;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -61,7 +59,7 @@
@Mock
private ZenModeBackend mBackend;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mPref;
private Context mContext;
@Mock
private PreferenceScreen mScreen;
@@ -83,7 +81,7 @@
mContext, mock(Lifecycle.class), PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPref);
mController.displayPreference(mScreen);
}
@@ -102,9 +100,9 @@
@Test
public void updateState_notChecked_noVisEffects() {
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 0);
- mController.updateState(mockPref);
+ mController.updateState(mPref);
- verify(mockPref).setChecked(false);
+ verify(mPref).setChecked(false);
}
@Test
@@ -119,25 +117,25 @@
| SUPPRESSED_EFFECT_PEEK
| SUPPRESSED_EFFECT_NOTIFICATION_LIST;
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, allSuppressed);
- mController.updateState(mockPref);
+ mController.updateState(mPref);
- verify(mockPref).setChecked(false);
+ verify(mPref).setChecked(false);
}
@Test
public void updateState_checked() {
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 2);
- mController.updateState(mockPref);
+ mController.updateState(mPref);
- verify(mockPref).setChecked(true);
+ verify(mPref).setChecked(true);
}
@Test
public void updateState_listeners() {
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 2);
- mController.updateState(mockPref);
+ mController.updateState(mPref);
- verify(mockPref).setOnGearClickListener(any());
- verify(mockPref).setOnRadioButtonClickListener(any());
+ verify(mPref).setExtraWidgetOnClickListener(any());
+ verify(mPref).setOnClickListener(any());
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceControllerTest.java
index aacb109..79c6cb8 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeVisEffectsNonePreferenceControllerTest.java
@@ -40,11 +40,9 @@
import androidx.preference.PreferenceScreen;
-import com.android.settings.notification.zen.ZenCustomRadioButtonPreference;
-import com.android.settings.notification.zen.ZenModeBackend;
-import com.android.settings.notification.zen.ZenModeVisEffectsNonePreferenceController;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -63,7 +61,7 @@
@Mock
private ZenModeBackend mBackend;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
@Mock
@@ -86,7 +84,7 @@
mContext, mock(Lifecycle.class), PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
@@ -98,17 +96,17 @@
@Test
public void updateState_notChecked() {
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 1);
- mController.updateState(mockPref);
+ mController.updateState(mMockPref);
- verify(mockPref).setChecked(false);
+ verify(mMockPref).setChecked(false);
}
@Test
public void updateState_checked() {
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 0);
- mController.updateState(mockPref);
+ mController.updateState(mMockPref);
- verify(mockPref).setChecked(true);
+ verify(mMockPref).setChecked(true);
}
@Test
@@ -123,7 +121,7 @@
| SUPPRESSED_EFFECT_PEEK
| SUPPRESSED_EFFECT_NOTIFICATION_LIST;
mBackend.mPolicy = new NotificationManager.Policy(0, 0, 0, 1);
- mController.onRadioButtonClick(mockPref);
+ mController.onRadioButtonClicked(mMockPref);
verify(mBackend).saveVisualEffectsPolicy(allSuppressed, false);
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
eq(ACTION_ZEN_SOUND_ONLY),
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceControllerTest.java
index f6fa5b7..f149541 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleCustomPolicyPreferenceControllerTest.java
@@ -27,6 +27,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -47,7 +48,7 @@
@Mock
private NotificationManager mNotificationManager;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
@Mock
private PreferenceScreen mScreen;
@@ -70,21 +71,21 @@
PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
when(mBackend.getAutomaticZenRule(RULE_ID)).thenReturn(mRule);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
@Test
public void updateState_nullZenPolicy() {
updateControllerZenPolicy(null);
- mController.updateState(mockPref);
- verify(mockPref).setChecked(false);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(false);
}
@Test
public void updateState_hasZenPolicy() {
updateControllerZenPolicy(new ZenPolicy.Builder().build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(true);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(true);
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceControllerTest.java
index 7091ceb..c0258e4 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleDefaultPolicyPreferenceControllerTest.java
@@ -27,6 +27,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -47,7 +48,7 @@
@Mock
private NotificationManager mNotificationManager;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
@Mock
private PreferenceScreen mScreen;
@@ -70,21 +71,21 @@
PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
when(mBackend.getAutomaticZenRule(RULE_ID)).thenReturn(mRule);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
@Test
public void updateState_nullZenPolicy() {
updateControllerZenPolicy(null);
- mController.updateState(mockPref);
- verify(mockPref).setChecked(true);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(true);
}
@Test
public void updateState_hasZenPolicy() {
updateControllerZenPolicy(new ZenPolicy.Builder().build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(false);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(false);
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRulePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRulePreferenceControllerTest.java
index 13963db..e3fef19 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRulePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRulePreferenceControllerTest.java
@@ -28,10 +28,8 @@
import androidx.preference.PreferenceScreen;
-import com.android.settings.notification.zen.AbstractZenCustomRulePreferenceController;
-import com.android.settings.notification.zen.ZenCustomRadioButtonPreference;
-import com.android.settings.notification.zen.ZenModeBackend;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -51,7 +49,7 @@
@Mock
private NotificationManager mNotificationManager;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
@Mock
private PreferenceScreen mScreen;
@@ -67,7 +65,7 @@
mContext = RuntimeEnvironment.application;
mController = new TestablePreferenceController(mContext,"test", mock(Lifecycle.class));
ReflectionHelpers.setField(mController, "mBackend", mBackend);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceControllerTest.java
index f30587f..edbcd06 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsAllPreferenceControllerTest.java
@@ -27,6 +27,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -47,7 +48,7 @@
@Mock
private NotificationManager mNotificationManager;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
@Mock
private PreferenceScreen mScreen;
@@ -69,7 +70,7 @@
PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
when(mBackend.getAutomaticZenRule(RULE_ID)).thenReturn(mRule);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
@@ -78,8 +79,8 @@
updateControllerZenPolicy(new ZenPolicy.Builder()
.hideAllVisualEffects()
.build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(false);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(false);
}
@Test
@@ -87,8 +88,8 @@
updateControllerZenPolicy(new ZenPolicy.Builder()
.showAllVisualEffects()
.build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(true);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(true);
}
@Test
@@ -97,8 +98,8 @@
.showPeeking(true)
.showBadges(false)
.build());
- mController.updateState(mockPref);
+ mController.updateState(mMockPref);
- verify(mockPref).setChecked(false);
+ verify(mMockPref).setChecked(false);
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceControllerTest.java
index 99b76ce..ece5d5f 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsCustomPreferenceControllerTest.java
@@ -27,6 +27,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -47,7 +48,7 @@
@Mock
private NotificationManager mNotificationManager;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
@Mock
private PreferenceScreen mScreen;
@@ -69,7 +70,7 @@
PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
when(mBackend.getAutomaticZenRule(RULE_ID)).thenReturn(mRule);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
@@ -78,8 +79,8 @@
updateControllerZenPolicy(new ZenPolicy.Builder()
.hideAllVisualEffects()
.build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(false);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(false);
}
@Test
@@ -87,8 +88,8 @@
updateControllerZenPolicy(new ZenPolicy.Builder()
.showAllVisualEffects()
.build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(false);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(false);
}
@Test
@@ -97,8 +98,8 @@
.showPeeking(true)
.showBadges(false)
.build());
- mController.updateState(mockPref);
+ mController.updateState(mMockPref);
- verify(mockPref).setChecked(true);
+ verify(mMockPref).setChecked(true);
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceControllerTest.java
index 510da5f..2daf4fb 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleVisEffectsNonePreferenceControllerTest.java
@@ -27,6 +27,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.RadioButtonPreference;
import org.junit.Before;
import org.junit.Test;
@@ -47,7 +48,7 @@
@Mock
private NotificationManager mNotificationManager;
@Mock
- private ZenCustomRadioButtonPreference mockPref;
+ private RadioButtonPreference mMockPref;
@Mock
private PreferenceScreen mScreen;
@@ -69,7 +70,7 @@
PREF_KEY);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
when(mBackend.getAutomaticZenRule(RULE_ID)).thenReturn(mRule);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mockPref);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
mController.displayPreference(mScreen);
}
@@ -78,8 +79,8 @@
updateControllerZenPolicy(new ZenPolicy.Builder()
.hideAllVisualEffects()
.build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(true);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(true);
}
@Test
@@ -87,8 +88,8 @@
updateControllerZenPolicy(new ZenPolicy.Builder()
.showAllVisualEffects()
.build());
- mController.updateState(mockPref);
- verify(mockPref).setChecked(false);
+ mController.updateState(mMockPref);
+ verify(mMockPref).setChecked(false);
}
@Test
@@ -97,8 +98,8 @@
.showPeeking(true)
.showBadges(false)
.build());
- mController.updateState(mockPref);
+ mController.updateState(mMockPref);
- verify(mockPref).setChecked(false);
+ verify(mMockPref).setChecked(false);
}
}
diff --git a/tests/robotests/src/com/android/settings/panel/FakeSettingsPanelActivity.java b/tests/robotests/src/com/android/settings/panel/FakeSettingsPanelActivity.java
index 2a62b54..ba763ce 100644
--- a/tests/robotests/src/com/android/settings/panel/FakeSettingsPanelActivity.java
+++ b/tests/robotests/src/com/android/settings/panel/FakeSettingsPanelActivity.java
@@ -30,4 +30,4 @@
final Intent intent = new Intent(FakePanelContent.FAKE_ACTION);
return intent;
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/panel/MediaOutputGroupPanelTest.java b/tests/robotests/src/com/android/settings/panel/MediaOutputGroupPanelTest.java
deleted file mode 100644
index 003fda7..0000000
--- a/tests/robotests/src/com/android/settings/panel/MediaOutputGroupPanelTest.java
+++ /dev/null
@@ -1,80 +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.panel;
-
-import static com.android.settings.media.MediaOutputSlice.MEDIA_PACKAGE_NAME;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.Uri;
-
-import com.android.settings.slices.CustomSliceRegistry;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class MediaOutputGroupPanelTest {
-
- private static final String TEST_PACKAGENAME = "com.test.packagename";
-
- private MediaOutputGroupPanel mPanel;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getApplicationContext()).thenReturn(mContext);
- mPanel = MediaOutputGroupPanel.create(mContext, TEST_PACKAGENAME);
- }
-
- @Test
- public void getSlices_containsNecessarySlices() {
- final List<Uri> uris = mPanel.getSlices();
-
- assertThat(uris).containsExactly(CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI);
- }
-
- @Test
- public void getSlices_verifyPackageName_isEqual() {
- final List<Uri> uris = mPanel.getSlices();
-
- assertThat(uris.get(0).getQueryParameter(MEDIA_PACKAGE_NAME)).isEqualTo(TEST_PACKAGENAME);
- }
-
- @Test
- public void getSeeMoreIntent_isNull() {
- assertThat(mPanel.getSeeMoreIntent()).isNull();
- }
-
- @Test
- public void getViewType_checkType() {
- assertThat(mPanel.getViewType()).isEqualTo(PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
index 405e4c3..41935c4 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
@@ -18,7 +18,6 @@
package com.android.settings.panel;
import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER;
-import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
import static com.google.common.truth.Truth.assertThat;
@@ -213,22 +212,6 @@
}
@Test
- public void sliderLargeIconPanelType_displayFooterDivider() {
- mFakePanelContent.setViewType(VIEW_TYPE_SLIDER_LARGE_ICON);
- final ActivityController<FakeSettingsPanelActivity> activityController =
- Robolectric.buildActivity(FakeSettingsPanelActivity.class);
- activityController.setup();
- final PanelFragment panelFragment = (PanelFragment)
- Objects.requireNonNull(activityController
- .get()
- .getSupportFragmentManager()
- .findFragmentById(R.id.main_content));
- final View footerDivider = panelFragment.mLayoutView.findViewById(R.id.footer_divider);
- // Check visibility
- assertThat(footerDivider.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
public void sliderPanelType_notDisplayFooterDivider() {
mFakePanelContent.setViewType(VIEW_TYPE_SLIDER);
final ActivityController<FakeSettingsPanelActivity> activityController =
diff --git a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
index f8c2f84..ac74fe5 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
@@ -17,11 +17,8 @@
package com.android.settings.panel;
import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER;
-import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
import static com.android.settings.panel.PanelSlicesAdapter.MAX_NUM_OF_SLICES;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
-import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI;
import static com.google.common.truth.Truth.assertThat;
@@ -144,22 +141,6 @@
}
@Test
- public void sliderLargeIconPanel_shouldNotAllowDividerBelow() {
- addTestLiveData(MEDIA_OUTPUT_SLICE_URI);
- mFakePanelContent.setViewType(PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
-
- final PanelSlicesAdapter adapter =
- new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
- final int position = 0;
- final ViewGroup view = new FrameLayout(mContext);
- final SliceRowViewHolder viewHolder =
- adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
- adapter.onBindViewHolder(viewHolder, position);
-
- assertThat(viewHolder.isDividerAllowedBelow()).isFalse();
- }
-
- @Test
public void sliderPanelType_shouldAllowDividerBelow() {
addTestLiveData(VOLUME_MEDIA_URI);
mFakePanelContent.setViewType(PanelContent.VIEW_TYPE_SLIDER);
@@ -191,42 +172,6 @@
}
@Test
- public void outputSwitcherSlice_shouldAddFirstItemPadding() {
- addTestLiveData(MEDIA_OUTPUT_SLICE_URI);
-
- final PanelSlicesAdapter adapter =
- new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
- final int position = 0;
- final ViewGroup view = new FrameLayout(mContext);
- final SliceRowViewHolder viewHolder =
- adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
-
- adapter.onBindViewHolder(viewHolder, position);
-
- assertThat(viewHolder.mSliceSliderLayout.getPaddingTop()).isEqualTo(
- mPanelFragment.getResources().getDimensionPixelSize(
- R.dimen.output_switcher_slice_padding_top));
- }
-
- @Test
- public void outputSwitcherGroupSlice_shouldAddFirstItemPadding() {
- addTestLiveData(MEDIA_OUTPUT_GROUP_SLICE_URI);
-
- final PanelSlicesAdapter adapter =
- new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
- final int position = 0;
- final ViewGroup view = new FrameLayout(mContext);
- final SliceRowViewHolder viewHolder =
- adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
-
- adapter.onBindViewHolder(viewHolder, position);
-
- assertThat(viewHolder.mSliceSliderLayout.getPaddingTop()).isEqualTo(
- mPanelFragment.getResources().getDimensionPixelSize(
- R.dimen.output_switcher_slice_padding_top));
- }
-
- @Test
public void mediaOutputIndicatorSlice_notSliderPanel_noSliderLayout() {
addTestLiveData(MEDIA_OUTPUT_INDICATOR_SLICE_URI);
@@ -256,19 +201,6 @@
}
@Test
- public void onCreateViewHolder_viewTypeSliderLargeIcon_verifyLayout() {
- final PanelSlicesAdapter adapter = new PanelSlicesAdapter(mPanelFragment, mData, 0);
- final ViewGroup view = new FrameLayout(mContext);
- final ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
-
- adapter.onCreateViewHolder(view, VIEW_TYPE_SLIDER_LARGE_ICON);
-
- verify(sLayoutInflater).inflate(intArgumentCaptor.capture(), eq(view), eq(false));
- assertThat(intArgumentCaptor.getValue()).isEqualTo(
- R.layout.panel_slice_slider_row_large_icon);
- }
-
- @Test
public void onCreateViewHolder_viewTypeDefault_verifyLayout() {
final PanelSlicesAdapter adapter =
new PanelSlicesAdapter(mPanelFragment, mData, 0);
diff --git a/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java b/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java
index 4a14798..25e1786 100644
--- a/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java
+++ b/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java
@@ -18,9 +18,6 @@
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
-import static com.android.settings.panel.SettingsPanelActivity.KEY_MEDIA_PACKAGE_NAME;
-import static com.android.settings.panel.SettingsPanelActivity.KEY_PANEL_TYPE_ARGUMENT;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -31,7 +28,6 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Window;
@@ -83,35 +79,6 @@
}
@Test
- public void startMediaOutputSlice_withPackageName_bundleShouldHaveValue() {
- final Intent intent = new Intent()
- .setAction("com.android.settings.panel.action.MEDIA_OUTPUT")
- .putExtra("com.android.settings.panel.extra.PACKAGE_NAME",
- "com.google.android.music");
-
- final SettingsPanelActivity activity =
- Robolectric.buildActivity(SettingsPanelActivity.class, intent).create().get();
-
- assertThat(activity.mBundle.getString(KEY_MEDIA_PACKAGE_NAME))
- .isEqualTo("com.google.android.music");
- assertThat(activity.mBundle.getString(KEY_PANEL_TYPE_ARGUMENT))
- .isEqualTo("com.android.settings.panel.action.MEDIA_OUTPUT");
- }
-
- @Test
- public void startMediaOutputSlice_withoutPackageName_bundleShouldHaveValue() {
- final Intent intent = new Intent()
- .setAction("com.android.settings.panel.action.MEDIA_OUTPUT");
-
- final SettingsPanelActivity activity =
- Robolectric.buildActivity(SettingsPanelActivity.class, intent).create().get();
-
- assertThat(activity.mBundle.containsKey(KEY_MEDIA_PACKAGE_NAME)).isTrue();
- assertThat(activity.mBundle.getString(KEY_PANEL_TYPE_ARGUMENT))
- .isEqualTo("com.android.settings.panel.action.MEDIA_OUTPUT");
- }
-
- @Test
public void onStart_isNotDebuggable_shouldHideSystemOverlay() {
ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", false);
diff --git a/tests/robotests/src/com/android/settings/search/FakeSettingsFragment.java b/tests/robotests/src/com/android/settings/search/FakeSettingsFragment.java
index 19282dd..7a229f6 100644
--- a/tests/robotests/src/com/android/settings/search/FakeSettingsFragment.java
+++ b/tests/robotests/src/com/android/settings/search/FakeSettingsFragment.java
@@ -115,4 +115,4 @@
return keys;
}
};
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/security/RequestManageCredentialsTest.java b/tests/robotests/src/com/android/settings/security/RequestManageCredentialsTest.java
index ccc6a0b..aacbf0c 100644
--- a/tests/robotests/src/com/android/settings/security/RequestManageCredentialsTest.java
+++ b/tests/robotests/src/com/android/settings/security/RequestManageCredentialsTest.java
@@ -18,18 +18,24 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.Shadows.shadowOf;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
-import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
+import android.os.UserHandle;
import android.security.AppUriAuthenticationPolicy;
import android.security.Credentials;
+import android.security.IKeyChainService;
import android.security.KeyChain;
import android.widget.Button;
import android.widget.LinearLayout;
-import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
@@ -37,10 +43,10 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.shadows.ShadowActivity;
@RunWith(RobolectricTestRunner.class)
public class RequestManageCredentialsTest {
@@ -52,7 +58,14 @@
private RequestManageCredentials mActivity;
- private ShadowActivity mShadowActivity;
+ @Mock
+ private DevicePolicyManager mDevicePolicyManager;
+
+ @Mock
+ private KeyChain.KeyChainConnection mKeyChainConnection;
+
+ @Mock
+ private IKeyChainService mKeyChainService;
@Before
public void setUp() {
@@ -60,21 +73,98 @@
}
@Test
- public void onCreate_intentActionNotManageCredentials_finishActivity() {
- final Intent intent = new Intent("android.security.ANOTHER_ACTION");
+ public void onCreate_intentActionNotManageCredentials_finishActivity()
+ throws Exception {
+ final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS + "_bad");
+ intent.putExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY, AUTHENTICATION_POLICY);
+ setupActivityWithAction(intent);
+ when(mDevicePolicyManager.getDeviceOwnerUser()).thenReturn(null);
+ when(mDevicePolicyManager.getProfileOwner()).thenReturn(null);
+ when(mActivity.getLaunchedFromPackage()).thenReturn("com.example.credapp");
- initActivity(intent);
+ mActivity.onCreate(null);
assertThat(mActivity).isNotNull();
assertThat(mActivity.isFinishing()).isTrue();
}
@Test
- public void onCreate_authenticationPolicyProvided_startActivity() {
+ public void onCreate_noAuthenticationPolicy_finishActivity()
+ throws Exception {
+ final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS);
+ setupActivityWithAction(intent);
+ when(mDevicePolicyManager.getDeviceOwnerUser()).thenReturn(null);
+ when(mDevicePolicyManager.getProfileOwner()).thenReturn(null);
+ when(mActivity.getLaunchedFromPackage()).thenReturn("com.example.credapp");
+
+ mActivity.onCreate(null);
+
+ assertThat(mActivity).isNotNull();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+
+ @Test
+ public void onCreate_invalidAuthenticationPolicy_finishActivity()
+ throws Exception {
+ final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS);
+ intent.putExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY, "Invalid policy");
+
+ setupActivityWithAction(intent);
+ when(mDevicePolicyManager.getDeviceOwnerUser()).thenReturn(null);
+ when(mDevicePolicyManager.getProfileOwner()).thenReturn(null);
+ when(mActivity.getLaunchedFromPackage()).thenReturn("com.example.credapp");
+
+ mActivity.onCreate(null);
+
+ assertThat(mActivity).isNotNull();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+
+ @Test
+ public void onCreate_runOnManagedProfile_finishActivity()
+ throws Exception {
final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS);
intent.putExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY, AUTHENTICATION_POLICY);
- initActivity(intent);
+ setupActivityWithAction(intent);
+ when(mDevicePolicyManager.getDeviceOwnerUser()).thenReturn(null);
+ when(mDevicePolicyManager.getProfileOwner()).thenReturn(new ComponentName("pkg", "cls"));
+ when(mActivity.getLaunchedFromPackage()).thenReturn("com.example.credapp");
+
+ mActivity.onCreate(null);
+
+ assertThat(mActivity).isNotNull();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+
+ @Test
+ public void onCreate_runOnManagedDevice_finishActivity()
+ throws Exception {
+ final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS);
+ intent.putExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY, AUTHENTICATION_POLICY);
+
+ setupActivityWithAction(intent);
+ when(mDevicePolicyManager.getDeviceOwnerUser()).thenReturn(UserHandle.SYSTEM);
+ when(mDevicePolicyManager.getProfileOwner()).thenReturn(null);
+ when(mActivity.getLaunchedFromPackage()).thenReturn("com.example.credapp");
+
+ mActivity.onCreate(null);
+
+ assertThat(mActivity).isNotNull();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+
+ @Test
+ public void onCreate_authenticationPolicyProvided_startActivity() throws Exception {
+ final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS);
+ intent.putExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY, AUTHENTICATION_POLICY);
+ setupActivityWithAction(intent);
+
+ when(mDevicePolicyManager.getDeviceOwnerUser()).thenReturn(null);
+ when(mDevicePolicyManager.getProfileOwner()).thenReturn(null);
+ when(mActivity.getLaunchedFromPackage()).thenReturn("com.example.credapp");
+
+ mActivity.onCreate(null);
assertThat(mActivity).isNotNull();
assertThat(mActivity.isFinishing()).isFalse();
@@ -84,23 +174,10 @@
assertThat((Button) mActivity.findViewById(R.id.dont_allow_button)).isNotNull();
}
- @Test
- public void onCreate_dontAllowButtonClicked_finishActivity() {
- final Intent intent = new Intent(Credentials.ACTION_MANAGE_CREDENTIALS);
- intent.putExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY, AUTHENTICATION_POLICY);
-
- initActivity(intent);
-
- Button dontAllowButton = mActivity.findViewById(R.id.dont_allow_button);
- assertThat(dontAllowButton.hasOnClickListeners()).isTrue();
- dontAllowButton.performClick();
- assertThat(mActivity.isFinishing()).isTrue();
- assertThat(mShadowActivity.getResultCode()).isEqualTo(Activity.RESULT_CANCELED);
+ private void setupActivityWithAction(Intent intent) throws Exception {
+ mActivity = spy(Robolectric.buildActivity(RequestManageCredentials.class, intent).get());
+ doReturn(mKeyChainConnection).when(mActivity).getKeyChainConnection(eq(mActivity), any());
+ doReturn(mDevicePolicyManager).when(mActivity).getSystemService(DevicePolicyManager.class);
+ when(mKeyChainConnection.getService()).thenReturn(mKeyChainService);
}
-
- private void initActivity(@NonNull Intent intent) {
- mActivity = Robolectric.buildActivity(RequestManageCredentials.class, intent).setup().get();
- mShadowActivity = shadowOf(mActivity);
- }
-
}
diff --git a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
index 8f861eb..84e88cb 100644
--- a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
+++ b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
@@ -21,11 +21,17 @@
import static android.provider.Settings.ENABLE_MMS_DATA_REQUEST_REASON_OUTGOING_MMS;
import static android.provider.Settings.EXTRA_ENABLE_MMS_DATA_REQUEST_REASON;
import static android.provider.Settings.EXTRA_SUB_ID;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DISMISS;
import static android.telephony.TelephonyManager.EXTRA_SIM_COMBINATION_NAMES;
import static android.telephony.TelephonyManager.EXTRA_SIM_COMBINATION_WARNING_TYPE;
import static android.telephony.TelephonyManager.EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA;
import static android.telephony.data.ApnSetting.TYPE_MMS;
+import static com.android.settings.sim.SimDialogActivity.DATA_PICK;
+import static com.android.settings.sim.SimDialogActivity.INVALID_PICK;
+import static com.android.settings.sim.SimDialogActivity.PICK_DISMISS;
import static com.android.settings.sim.SimSelectNotification.ENABLE_MMS_NOTIFICATION_CHANNEL;
import static com.android.settings.sim.SimSelectNotification.ENABLE_MMS_NOTIFICATION_ID;
import static com.android.settings.sim.SimSelectNotification.SIM_WARNING_NOTIFICATION_CHANNEL;
@@ -36,6 +42,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -54,7 +61,6 @@
import android.telephony.TelephonyManager;
import com.android.settings.R;
-
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import org.junit.Before;
@@ -197,6 +203,50 @@
}
@Test
+ public void onReceivePrimarySubListChange_WithDataPickExtra_shouldStartActivity() {
+ Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED);
+ intent.putExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE,
+ EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA);
+
+ mSimSelectNotification.onReceive(mContext, intent);
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(intentCaptor.capture());
+ Intent capturedIntent = intentCaptor.getValue();
+ assertThat(capturedIntent).isNotNull();
+ assertThat(capturedIntent.getComponent().getClassName()).isEqualTo(
+ SimDialogActivity.class.getName());
+ assertThat(capturedIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK)
+ .isNotEqualTo(0);
+ assertThat(capturedIntent.getIntExtra(SimDialogActivity.DIALOG_TYPE_KEY, INVALID_PICK))
+ .isEqualTo(DATA_PICK);
+ }
+
+ @Test
+ public void onReceivePrimarySubListChange_WithDismissExtra_shouldDismiss() {
+ Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED);
+ intent.putExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE,
+ EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA);
+
+ mSimSelectNotification.onReceive(mContext, intent);
+ clearInvocations(mContext);
+
+ // Dismiss.
+ intent.putExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE,
+ EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DISMISS);
+ mSimSelectNotification.onReceive(mContext, intent);
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(intentCaptor.capture());
+ Intent capturedIntent = intentCaptor.getValue();
+ assertThat(capturedIntent).isNotNull();
+ assertThat(capturedIntent.getComponent().getClassName()).isEqualTo(
+ SimDialogActivity.class.getName());
+ assertThat(capturedIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK)
+ .isNotEqualTo(0);
+ assertThat(capturedIntent.getIntExtra(SimDialogActivity.DIALOG_TYPE_KEY, INVALID_PICK))
+ .isEqualTo(PICK_DISMISS);
+ }
+ @Test
public void onReceivePrimarySubListChange_DualCdmaWarning_notificationShouldSend() {
Intent intent = new Intent(TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED);
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index b5c6c44..c2c67e3 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -565,7 +565,8 @@
final Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS)
.setPackage(Utils.SETTINGS_PACKAGE_NAME);
PendingIntent settingsPendingIntent =
- PendingIntent.getActivity(mContext, 0, settingsIntent, 0);
+ PendingIntent.getActivity(mContext, 0, settingsIntent,
+ PendingIntent.FLAG_IMMUTABLE);
assertThat(pendingIntent).isEqualTo(settingsPendingIntent);
}
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index 2c68269..6fb2eae 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -43,6 +43,7 @@
import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.slices.SlicesFeatureProvider;
import com.android.settings.users.UserFeatureProvider;
+import com.android.settings.wifi.WifiTrackerLibProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.mockito.Answers;
@@ -77,6 +78,8 @@
public SearchFeatureProvider searchFeatureProvider;
public ContextualCardFeatureProvider mContextualCardFeatureProvider;
+ public WifiTrackerLibProvider wifiTrackerLibProvider;
+
/**
* Call this in {@code @Before} method of the test class to use fake factory.
*/
@@ -120,6 +123,7 @@
mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
mAwareFeatureProvider = mock(AwareFeatureProvider.class);
mFaceFeatureProvider = mock(FaceFeatureProvider.class);
+ wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
}
@Override
@@ -231,4 +235,9 @@
public FaceFeatureProvider getFaceFeatureProvider() {
return mFaceFeatureProvider;
}
+
+ @Override
+ public WifiTrackerLibProvider getWifiTrackerLibProvider() {
+ return wifiTrackerLibProvider;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
index 8bceb13..6812451 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
@@ -12,9 +12,7 @@
* 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.testutils;
import android.content.Context;
@@ -26,8 +24,6 @@
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.slices.SliceBackgroundWorker;
-import java.io.IOException;
-
public class FakeToggleController extends TogglePreferenceController {
public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
diff --git a/tests/robotests/src/com/android/settings/testutils/SliceTester.java b/tests/robotests/src/com/android/settings/testutils/SliceTester.java
index f2cce3c..ede5fbd 100644
--- a/tests/robotests/src/com/android/settings/testutils/SliceTester.java
+++ b/tests/robotests/src/com/android/settings/testutils/SliceTester.java
@@ -322,4 +322,4 @@
expectedKeywords.add(data.getScreenTitle().toString());
assertThat(keywords).containsExactlyElementsIn(expectedKeywords);
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
index 90c9172..50ddd2a 100644
--- a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
@@ -363,7 +363,7 @@
mFragment.initialize(mActivity, mArguments);
verify(mRemoveUserPref).setOnPreferenceClickListener(mFragment);
- verify(mRemoveUserPref).setTitle(R.string.user_exit_guest_title);
+ verify(mRemoveUserPref).setTitle(R.string.user_exit_guest_menu);
verify(mFragment, never()).removePreference(KEY_REMOVE_USER);
}
diff --git a/tests/robotests/src/com/android/settings/widget/DonutViewTest.java b/tests/robotests/src/com/android/settings/widget/DonutViewTest.java
deleted file mode 100644
index cc41f92..0000000
--- a/tests/robotests/src/com/android/settings/widget/DonutViewTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.android.settings.widget;
-
-import android.content.Context;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class DonutViewTest {
- @Test
- public void getPercentageStringSpannable_doesntCrashForMissingPercentage() {
- Context context = RuntimeEnvironment.application;
-
- DonutView.getPercentageStringSpannable(context.getResources(), "50%", "h");
- }
-}
diff --git a/tests/robotests/src/com/android/settings/widget/RadioButtonPreferenceWithExtraWidgetTest.java b/tests/robotests/src/com/android/settings/widget/RadioButtonPreferenceWithExtraWidgetTest.java
deleted file mode 100644
index 2e2d786..0000000
--- a/tests/robotests/src/com/android/settings/widget/RadioButtonPreferenceWithExtraWidgetTest.java
+++ /dev/null
@@ -1,140 +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.widget;
-
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_GONE;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_INFO;
-import static com.android.settings.widget.RadioButtonPreferenceWithExtraWidget.EXTRA_WIDGET_VISIBILITY_SETTING;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertEquals;
-
-import android.app.Application;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class RadioButtonPreferenceWithExtraWidgetTest {
-
- private Application mContext;
- private RadioButtonPreferenceWithExtraWidget mPreference;
-
- private TextView mSummary;
- private ImageView mExtraWidget;
- private View mExtraWidgetDivider;
-
- private boolean mIsClickListenerCalled = false;
- private View.OnClickListener mClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mIsClickListenerCalled = true;
- }
- };
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mPreference = new RadioButtonPreferenceWithExtraWidget(mContext);
- mPreference.setSummary("test summary");
-
- View view = LayoutInflater.from(mContext)
- .inflate(R.layout.preference_radio_with_extra_widget, null);
- PreferenceViewHolder preferenceViewHolder =
- PreferenceViewHolder.createInstanceForTests(view);
- mPreference.onBindViewHolder(preferenceViewHolder);
-
- mSummary = view.findViewById(android.R.id.summary);
- mExtraWidget = view.findViewById(R.id.radio_extra_widget);
- mExtraWidgetDivider = view.findViewById(R.id.radio_extra_widget_divider);
- }
-
- @Test
- public void shouldHaveRadioPreferenceWithExtraWidgetLayout() {
- assertThat(mPreference.getLayoutResource())
- .isEqualTo(R.layout.preference_radio_with_extra_widget);
- }
-
- @Test
- public void iconSpaceReservedShouldBeFalse() {
- assertThat(mPreference.isIconSpaceReserved()).isFalse();
- }
-
- @Test
- public void summaryShouldBeVisible() {
- assertEquals(View.VISIBLE, mSummary.getVisibility());
- }
-
- @Test
- public void testSetExtraWidgetVisibility_gone() {
- mPreference.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_GONE);
- assertEquals(View.GONE, mExtraWidget.getVisibility());
- assertEquals(View.GONE, mExtraWidgetDivider.getVisibility());
- assertThat(mExtraWidget.isClickable()).isFalse();
- }
-
- @Test
- public void testSetExtraWidgetVisibility_info() {
- mPreference.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_INFO);
- assertEquals(View.VISIBLE, mExtraWidget.getVisibility());
- assertEquals(View.VISIBLE, mExtraWidgetDivider.getVisibility());
- assertThat(mExtraWidget.isClickable()).isTrue();
- assertEquals(mContext.getResources().getText(R.string.information_label),
- mExtraWidget.getContentDescription());
- }
-
- @Test
- public void testSetExtraWidgetVisibility_setting() {
- mPreference.setExtraWidgetVisibility(EXTRA_WIDGET_VISIBILITY_SETTING);
- assertEquals(View.VISIBLE, mExtraWidget.getVisibility());
- assertEquals(View.VISIBLE, mExtraWidgetDivider.getVisibility());
- assertThat(mExtraWidget.isClickable()).isTrue();
- assertEquals(mContext.getResources().getText(R.string.settings_label),
- mExtraWidget.getContentDescription());
- }
-
- @Test
- public void testSetExtraWidgetOnClickListener() {
- mPreference.setExtraWidgetOnClickListener(mClickListener);
-
- assertThat(mIsClickListenerCalled).isFalse();
- mExtraWidget.callOnClick();
- assertThat(mIsClickListenerCalled).isTrue();
- }
-
- @Test
- public void extraWidgetStaysEnabledWhenPreferenceIsDisabled() {
- mPreference.setEnabled(false);
- mExtraWidget.setEnabled(false);
-
- assertThat(mExtraWidget.isEnabled()).isFalse();
- mPreference.setExtraWidgetOnClickListener(mClickListener);
- assertThat(mExtraWidget.isEnabled()).isTrue();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
index 70c7810..24d4c47 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
@@ -20,6 +20,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -41,6 +42,7 @@
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -82,6 +84,8 @@
@Mock
private WifiEntry mWifiEntry;
+ private FakeFeatureFactory mFakeFeatureFactory;
+
@Mock
private WifiPickerTracker mWifiPickerTracker;
@@ -106,6 +110,8 @@
mSavedWpaConfigurationEntry = generateRegularWifiConfiguration(FAKE_NEW_SAVED_WPA_SSID,
WifiConfiguration.KeyMgmt.WPA_PSK, "\"1234567890\"");
+ mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
+
mAddAppNetworksFragment.mWifiPickerTracker = mWifiPickerTracker;
setUpOneScannedNetworkWithScanedLevel4();
}
@@ -485,6 +491,9 @@
}
private void setupFragment() {
+ when(mFakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker(
+ any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
+ .thenReturn(mWifiPickerTracker);
FragmentController.setupFragment(mAddAppNetworksFragment);
}
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java b/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java
index 395048c..2a8d265 100644
--- a/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java
@@ -20,11 +20,14 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import androidx.lifecycle.Lifecycle;
+import com.android.wifitrackerlib.MergedCarrierEntry;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -44,6 +47,8 @@
private WifiScanWorker mWifiScanWorker;
@Mock
WifiPickerTracker mWifiPickerTracker;
+ @Mock
+ MergedCarrierEntry mMergedCarrierEntry;
@Before
public void setUp() {
@@ -51,6 +56,7 @@
mWifiScanWorker = new WifiScanWorker(RuntimeEnvironment.application, WIFI_SLICE_URI);
mWifiScanWorker.mWifiPickerTracker = mWifiPickerTracker;
+ when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
}
@Test
@@ -102,4 +108,24 @@
assertThat(mWifiScanWorker.getWifiEntry(key)).isEqualTo(reachableWifiEntry);
}
+
+ @Test
+ public void setCarrierNetworkEnabled_shouldCallMergedCarrierEntrySetEnabled() {
+ mWifiScanWorker.setCarrierNetworkEnabled(true);
+
+ verify(mMergedCarrierEntry).setEnabled(true);
+
+ mWifiScanWorker.setCarrierNetworkEnabled(false);
+
+ verify(mMergedCarrierEntry).setEnabled(false);
+ }
+
+ @Test
+ public void connectCarrierNetwork_shouldCallMergedCarrierEntryConnect() {
+ when(mMergedCarrierEntry.canConnect()).thenReturn(true);
+
+ mWifiScanWorker.connectCarrierNetwork();
+
+ verify(mMergedCarrierEntry).connect(any());
+ }
}
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 7556cbe..b857a0a 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -18,6 +18,7 @@
"androidx.test.espresso.contrib-nodeps",
"androidx.test.espresso.intents-nodeps",
"androidx.test.ext.junit",
+ "androidx.preference_preference",
"mockito-target-minus-junit4",
"platform-test-annotations",
"truth-prebuilt",
diff --git a/tests/unit/OWNERS b/tests/unit/OWNERS
new file mode 100644
index 0000000..4123742
--- /dev/null
+++ b/tests/unit/OWNERS
@@ -0,0 +1,2 @@
+# Additional reviewers for this and subdirectories.
+goldmanj@google.com
diff --git a/tests/robotests/src/com/android/settings/LinkifyUtilsTest.java b/tests/unit/src/com/android/settings/LinkifyUtilsTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/LinkifyUtilsTest.java
rename to tests/unit/src/com/android/settings/LinkifyUtilsTest.java
index de06302..34586d5 100644
--- a/tests/robotests/src/com/android/settings/LinkifyUtilsTest.java
+++ b/tests/unit/src/com/android/settings/LinkifyUtilsTest.java
@@ -21,13 +21,14 @@
import android.text.style.ClickableSpan;
import android.widget.TextView;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class LinkifyUtilsTest {
private static final String TEST_STRING = "to LINK_BEGINscanning settingsLINK_END.";
private static final String WRONG_STRING = "to scanning settingsLINK_END.";
@@ -41,7 +42,7 @@
public void setUp() throws Exception {
mSpanStringBuilder = new StringBuilder(TEST_STRING);
mWrongSpanStringBuilder = new StringBuilder(WRONG_STRING);
- mTextView = new TextView(RuntimeEnvironment.application);
+ mTextView = new TextView(ApplicationProvider.getApplicationContext());
}
@Test
diff --git a/tests/unit/src/com/android/settings/TestUtils.java b/tests/unit/src/com/android/settings/TestUtils.java
new file mode 100644
index 0000000..d7b1ea4
--- /dev/null
+++ b/tests/unit/src/com/android/settings/TestUtils.java
@@ -0,0 +1,25 @@
+/*
+ * 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;
+
+/**
+ * Convenience methods and constants for testing.
+ */
+public class TestUtils {
+ public static final long KILOBYTE = 1024L; // TODO: Change to 1000 in O Robolectric.
+ public static final long MEGABYTE = KILOBYTE * KILOBYTE;
+ public static final long GIGABYTE = KILOBYTE * MEGABYTE;
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java
index 53f6cc0..7d903ee 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java
@@ -19,6 +19,9 @@
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
@@ -30,10 +33,8 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AccessibilityShortcutPreferenceControllerTest {
private Context mContext;
@@ -42,7 +43,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mController = new AccessibilityShortcutPreferenceController(mContext,
"accessibility_shortcut_preference");
diff --git a/tests/robotests/src/com/android/settings/accessibility/DisableAnimationsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/DisableAnimationsPreferenceControllerTest.java
similarity index 92%
rename from tests/robotests/src/com/android/settings/accessibility/DisableAnimationsPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/DisableAnimationsPreferenceControllerTest.java
index 245fb74..5706008 100644
--- a/tests/robotests/src/com/android/settings/accessibility/DisableAnimationsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/DisableAnimationsPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -26,16 +26,16 @@
import android.provider.Settings;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class DisableAnimationsPreferenceControllerTest {
private Context mContext;
@@ -44,7 +44,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mController = new DisableAnimationsPreferenceController(mContext, "disable_animation");
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
index eb49edd..7f4048d 100644
--- a/tests/robotests/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/FontWeightAdjustmentPreferenceControllerTest.java
@@ -22,16 +22,16 @@
import android.provider.Settings;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class FontWeightAdjustmentPreferenceControllerTest {
private static final int ON = FontWeightAdjustmentPreferenceController.BOLD_TEXT_ADJUSTMENT;
private static final int OFF = 0;
@@ -42,7 +42,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mController = new FontWeightAdjustmentPreferenceController(
mContext, "font_weight_adjustment");
diff --git a/tests/robotests/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
index 6eaf7a7..6250fef 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -22,16 +22,16 @@
import android.provider.Settings;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class HighTextContrastPreferenceControllerTest {
private static final int ON = 1;
@@ -44,7 +44,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mController = new HighTextContrastPreferenceController(mContext, "text_contrast");
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java
similarity index 92%
rename from tests/robotests/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java
index 1f7f5ad..db588e8 100644
--- a/tests/robotests/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/LargePointerIconPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -25,16 +25,16 @@
import android.provider.Settings;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class LargePointerIconPreferenceControllerTest {
private static final int UNKNOWN = -1;
@@ -45,7 +45,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mController = new LargePointerIconPreferenceController(mContext, "large_pointer");
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/MagnificationPreferenceControllerTest.java
similarity index 83%
rename from tests/robotests/src/com/android/settings/accessibility/MagnificationPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/MagnificationPreferenceControllerTest.java
index d462c2a..a81c3e4 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MagnificationPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/MagnificationPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -20,15 +20,16 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class MagnificationPreferenceControllerTest {
private Context mContext;
@@ -36,7 +37,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new MagnificationPreferenceController(mContext, "magnification");
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/PreferredShortcutTest.java b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutTest.java
similarity index 100%
rename from tests/robotests/src/com/android/settings/accessibility/PreferredShortcutTest.java
rename to tests/unit/src/com/android/settings/accessibility/PreferredShortcutTest.java
diff --git a/tests/robotests/src/com/android/settings/accessibility/PreferredShortcutsTest.java b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/accessibility/PreferredShortcutsTest.java
rename to tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java
index a694aa3..95a0b83 100644
--- a/tests/robotests/src/com/android/settings/accessibility/PreferredShortcutsTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java
@@ -22,13 +22,13 @@
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
/** Tests for {@link PreferredShortcuts} */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class PreferredShortcutsTest {
private static final String PACKAGE_NAME_1 = "com.test1.example";
diff --git a/tests/robotests/src/com/android/settings/accessibility/PrimaryMonoPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/PrimaryMonoPreferenceControllerTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/accessibility/PrimaryMonoPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/PrimaryMonoPreferenceControllerTest.java
index fab1b95..8caeaff 100644
--- a/tests/robotests/src/com/android/settings/accessibility/PrimaryMonoPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/PrimaryMonoPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -23,16 +23,16 @@
import android.provider.Settings;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class PrimaryMonoPreferenceControllerTest {
private static final int ON = 1;
@@ -45,7 +45,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mController = new PrimaryMonoPreferenceController(mContext, "test_key");
}
diff --git a/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
new file mode 100644
index 0000000..dee8817
--- /dev/null
+++ b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceControllerTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ReduceBrightColorsIntensityPreferenceControllerTest {
+
+ private Context mContext;
+ private Resources mResources;
+ private ReduceBrightColorsIntensityPreferenceController mPreferenceController;
+
+ @Before
+ public void setUp() {
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+ mPreferenceController = new ReduceBrightColorsIntensityPreferenceController(mContext,
+ "rbc_intensity");
+ }
+
+ @Test
+ public void isAvailable_configuredRbcAvailable_enabledRbc_shouldReturnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1);
+ doReturn(true).when(mResources).getBoolean(
+ com.android.internal.R.bool.config_setColorTransformAccelerated);
+ assertThat(mPreferenceController.isAvailable()).isTrue();
+ }
+ @Test
+ public void isAvailable_configuredRbcAvailable_disabledRbc_shouldReturnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 0);
+ doReturn(true).when(mResources).getBoolean(
+ com.android.internal.R.bool.config_setColorTransformAccelerated);
+ assertThat(mPreferenceController.isAvailable()).isTrue();
+ }
+ @Test
+ public void isAvailable_configuredRbcUnavailable_enabledRbc_shouldReturnFalse() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1);
+ doReturn(false).when(mResources).getBoolean(
+ com.android.internal.R.bool.config_setColorTransformAccelerated);
+ assertThat(mPreferenceController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void onPreferenceChange_changesTemperature() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, 1);
+ mPreferenceController.onPreferenceChange(/* preference= */ null, 20);
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.REDUCE_BRIGHT_COLORS_LEVEL, 0))
+ .isEqualTo(20);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ReduceBrightColorsPersistencePreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsPersistencePreferenceControllerTest.java
similarity index 100%
rename from tests/robotests/src/com/android/settings/accessibility/ReduceBrightColorsPersistencePreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/ReduceBrightColorsPersistencePreferenceControllerTest.java
diff --git a/tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java
similarity index 90%
rename from tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java
index 1bdfb41..899fc09 100644
--- a/tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -21,15 +21,16 @@
import android.content.Context;
import android.provider.Settings;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SelectLongPressTimeoutPreferenceControllerTest {
private static final int VALID_VALUE = 1500;
private static final int INVALID_VALUE = 0;
@@ -40,7 +41,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new SelectLongPressTimeoutPreferenceController(mContext, "press_timeout");
}
diff --git a/tests/robotests/src/com/android/settings/accounts/RemoveUserFragmentTest.java b/tests/unit/src/com/android/settings/accounts/RemoveUserFragmentTest.java
similarity index 87%
rename from tests/robotests/src/com/android/settings/accounts/RemoveUserFragmentTest.java
rename to tests/unit/src/com/android/settings/accounts/RemoveUserFragmentTest.java
index 4537eb9..e38f42d 100644
--- a/tests/robotests/src/com/android/settings/accounts/RemoveUserFragmentTest.java
+++ b/tests/unit/src/com/android/settings/accounts/RemoveUserFragmentTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -18,13 +18,14 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import java.lang.reflect.Modifier;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class RemoveUserFragmentTest {
@Test
diff --git a/tests/robotests/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java b/tests/unit/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java
similarity index 86%
rename from tests/robotests/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java
rename to tests/unit/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java
index 9c7b346..cda6373 100644
--- a/tests/robotests/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java
+++ b/tests/unit/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -22,13 +22,14 @@
import android.content.Context;
import android.os.UserHandle;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SyncStateSwitchPreferenceTest {
private Context mContext;
@@ -36,7 +37,7 @@
@Before
public void setup() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/AppStateInstallAppsBridgeTest.java b/tests/unit/src/com/android/settings/applications/AppStateInstallAppsBridgeTest.java
similarity index 85%
rename from tests/robotests/src/com/android/settings/applications/AppStateInstallAppsBridgeTest.java
rename to tests/unit/src/com/android/settings/applications/AppStateInstallAppsBridgeTest.java
index 277f63e..a3bfff9 100644
--- a/tests/robotests/src/com/android/settings/applications/AppStateInstallAppsBridgeTest.java
+++ b/tests/unit/src/com/android/settings/applications/AppStateInstallAppsBridgeTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -11,26 +11,26 @@
* 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
+ * limitations under the License.
*/
-
package com.android.settings.applications;
import static com.google.common.truth.Truth.assertThat;
import android.app.AppOpsManager;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AppStateInstallAppsBridgeTest {
@Test
public void testInstallAppsStateCanInstallApps() {
AppStateInstallAppsBridge.InstallAppsState appState =
- new AppStateInstallAppsBridge.InstallAppsState();
+ new AppStateInstallAppsBridge.InstallAppsState();
assertThat(appState.canInstallApps()).isFalse();
appState.permissionRequested = true;
@@ -46,7 +46,7 @@
@Test
public void testInstallAppsStateIsPotentialAppSource() {
AppStateInstallAppsBridge.InstallAppsState appState =
- new AppStateInstallAppsBridge.InstallAppsState();
+ new AppStateInstallAppsBridge.InstallAppsState();
assertThat(appState.isPotentialAppSource()).isFalse();
appState.appOpMode = AppOpsManager.MODE_ERRORED;
diff --git a/tests/robotests/src/com/android/settings/applications/EnterpriseDefaultAppsTest.java b/tests/unit/src/com/android/settings/applications/EnterpriseDefaultAppsTest.java
similarity index 85%
rename from tests/robotests/src/com/android/settings/applications/EnterpriseDefaultAppsTest.java
rename to tests/unit/src/com/android/settings/applications/EnterpriseDefaultAppsTest.java
index 558334d..b956089 100644
--- a/tests/robotests/src/com/android/settings/applications/EnterpriseDefaultAppsTest.java
+++ b/tests/unit/src/com/android/settings/applications/EnterpriseDefaultAppsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -11,24 +11,24 @@
* 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
+ * limitations under the License.
*/
-
package com.android.settings.applications;
import static org.junit.Assert.assertTrue;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.R;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class EnterpriseDefaultAppsTest {
@Test
public void testNumberOfIntentsCorrelateWithUI() {
- final int concatenation_templates[] =
+ final int[] concatenation_templates =
new int[]{0 /* no need for single app name */,
R.string.app_names_concatenation_template_2,
R.string.app_names_concatenation_template_3};
diff --git a/tests/robotests/src/com/android/settings/applications/assist/AssistSettingObserverTest.java b/tests/unit/src/com/android/settings/applications/assist/AssistSettingObserverTest.java
similarity index 88%
rename from tests/robotests/src/com/android/settings/applications/assist/AssistSettingObserverTest.java
rename to tests/unit/src/com/android/settings/applications/assist/AssistSettingObserverTest.java
index f930106..2bfdd0c 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/AssistSettingObserverTest.java
+++ b/tests/unit/src/com/android/settings/applications/assist/AssistSettingObserverTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -18,13 +18,14 @@
import android.net.Uri;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AssistSettingObserverTest {
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterRegistryTest.java b/tests/unit/src/com/android/settings/applications/manageapplications/AppFilterRegistryTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterRegistryTest.java
rename to tests/unit/src/com/android/settings/applications/manageapplications/AppFilterRegistryTest.java
index 4c51ae7..ba7a0d2 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterRegistryTest.java
+++ b/tests/unit/src/com/android/settings/applications/manageapplications/AppFilterRegistryTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -37,11 +37,12 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AppFilterRegistryTest {
@Test
diff --git a/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java
new file mode 100644
index 0000000..064f813
--- /dev/null
+++ b/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.applications.specialaccess.notificationaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.testutils.FakeFeatureFactory;
+
+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 ApprovalPreferenceControllerTest {
+
+ private Context mContext;
+ private FakeFeatureFactory mFeatureFactory;
+ @Mock
+ private NotificationAccessDetails mFragment;
+ private ApprovalPreferenceController mController;
+ @Mock
+ NotificationManager mNm;
+ @Mock
+ PackageManager mPm;
+ PackageInfo mPkgInfo;
+ ComponentName mCn = new ComponentName("a", "b");
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ doReturn(mContext).when(mFragment).getContext();
+
+ mPkgInfo = new PackageInfo();
+ mPkgInfo.applicationInfo = mock(ApplicationInfo.class);
+ when(mPkgInfo.applicationInfo.loadLabel(mPm)).thenReturn("LABEL");
+
+ mController = new ApprovalPreferenceController(mContext, "key");
+ mController.setCn(mCn);
+ mController.setNm(mNm);
+ mController.setParent(mFragment);
+ mController.setPkgInfo(mPkgInfo);
+ }
+
+ @Test
+ public void updateState_checked() {
+ when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true);
+ SwitchPreference pref = new SwitchPreference(mContext);
+
+ mController.updateState(pref);
+ assertThat(pref.isChecked()).isTrue();
+ }
+
+ @Test
+ public void enable() {
+ mController.enable(mCn);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mContext,
+ MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW,
+ "a");
+
+ verify(mNm).setNotificationListenerAccessGranted(mCn, true);
+ }
+
+ @Test
+ public void disable() {
+ mController.disable(mCn);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mContext,
+ MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW,
+ "a");
+
+ verify(mNm).setNotificationListenerAccessGranted(mCn, false);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceControllerTest.java b/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceControllerTest.java
similarity index 82%
rename from tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceControllerTest.java
index 6dd53a3..c46f84a 100644
--- a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -20,13 +20,14 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class FaceSettingsAttentionPreferenceControllerTest {
private Context mContext;
@@ -34,7 +35,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new FaceSettingsAttentionPreferenceController(mContext);
}
diff --git a/tests/unit/src/com/android/settings/core/BadPreferenceController.java b/tests/unit/src/com/android/settings/core/BadPreferenceController.java
new file mode 100644
index 0000000..68d3b53
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/BadPreferenceController.java
@@ -0,0 +1,37 @@
+/*
+ * 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.core;
+
+import android.content.Context;
+
+public class BadPreferenceController extends BasePreferenceController {
+
+ public BadPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ throw new IllegalArgumentException("error");
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean useDynamicSliceSummary() {
+ return true;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java b/tests/unit/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java
new file mode 100644
index 0000000..d2f5346
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java
@@ -0,0 +1,96 @@
+/*
+ * 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.core;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.Context;
+
+import com.android.settings.core.codeinspection.CodeInspector;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BasePreferenceControllerSignatureInspector extends CodeInspector {
+
+ private final List<String> mExemptList;
+
+ public BasePreferenceControllerSignatureInspector(List<Class<?>> classes) {
+ super(classes);
+ mExemptList = new ArrayList<>();
+ initializeExemptList(mExemptList,
+ "exempt_invalid_base_preference_controller_constructor");
+ }
+
+ @Override
+ public void run() {
+ StringBuilder badClasses = new StringBuilder();
+
+ for (Class c : mClasses) {
+ if (!isConcreteSettingsClass(c)) {
+ // Not a Settings class, or is abstract, don't care.
+ continue;
+ }
+ if (!BasePreferenceController.class.isAssignableFrom(c)) {
+ // Not a BasePreferenceController, don't care.
+ continue;
+ }
+ final String className = c.getName();
+ if (mExemptList.remove(className)) {
+ continue;
+ }
+ final Constructor[] constructors = c.getDeclaredConstructors();
+ if (constructors == null || constructors.length == 0) {
+ badClasses.append(c.getName()).append(",");
+ }
+
+ boolean hasValidConstructor = false;
+ for (Constructor constructor : constructors) {
+ if (hasValidConstructorSignature(constructor)) {
+ hasValidConstructor = true;
+ break;
+ }
+ }
+ if (!hasValidConstructor) {
+ badClasses.append(className).append(",");
+ }
+ }
+
+ assertWithMessage("All BasePreferenceController (and subclasses) constructor must either"
+ + " only take Context, or (Context, String). No other types are allowed")
+ .that(badClasses.toString())
+ .isEmpty();
+
+ assertWithMessage("Something in the exempt list is no longer relevant. Please remove"
+ + "it from packages/apps/Settings/tests/robotests/assets/"
+ + "exempt_invalid_base_preference_controller_constructor")
+ .that(mExemptList)
+ .isEmpty();
+ }
+
+ private static boolean hasValidConstructorSignature(Constructor constructor) {
+ final Class[] parameterTypes = constructor.getParameterTypes();
+ if (parameterTypes.length == 1) {
+ return Context.class.isAssignableFrom(parameterTypes[0]);
+ } else if (parameterTypes.length == 2) {
+ return Context.class.isAssignableFrom(parameterTypes[0])
+ && String.class.isAssignableFrom(parameterTypes[1]);
+ }
+ return false;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java b/tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
similarity index 73%
rename from tests/robotests/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
index a04ec37..846ffd7 100644
--- a/tests/robotests/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
@@ -1,33 +1,35 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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
+ * 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.
+ * 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.core;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.slices.SliceData;
import com.android.settings.widget.SeekBarPreference;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SettingsSliderPreferenceControllerTest {
private FakeSliderPreferenceController mSliderController;
@@ -36,9 +38,9 @@
@Before
public void setUp() {
- mPreference = new SeekBarPreference(RuntimeEnvironment.application);
- mSliderController = new FakeSliderPreferenceController(RuntimeEnvironment.application,
- "key");
+ mPreference = new SeekBarPreference(ApplicationProvider.getApplicationContext());
+ mSliderController = new FakeSliderPreferenceController(
+ ApplicationProvider.getApplicationContext(), "key");
mPreference.setContinuousUpdates(true);
mPreference.setMin(mSliderController.getMin());
@@ -71,7 +73,7 @@
private class FakeSliderPreferenceController extends SliderPreferenceController {
- private final int MAX_STEPS = 2112;
+ private static final int MAX_STEPS = 2112;
private int mPosition;
private FakeSliderPreferenceController(Context context, String key) {
diff --git a/tests/robotests/src/com/android/settings/core/TogglePreferenceControllerTest.java b/tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java
similarity index 89%
rename from tests/robotests/src/com/android/settings/core/TogglePreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java
index 541f0c4..8817a17 100644
--- a/tests/robotests/src/com/android/settings/core/TogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/core/TogglePreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -20,16 +20,16 @@
import android.content.Context;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.slices.SliceData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class TogglePreferenceControllerTest {
private FakeToggle mToggleController;
@@ -39,7 +39,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SwitchPreference(mContext);
mToggleController = new FakeToggle(mContext, "key");
}
@@ -102,7 +102,7 @@
private static class FakeToggle extends TogglePreferenceController {
- private boolean checkedFlag;
+ private boolean mCheckedFlag;
private FakeToggle(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -110,12 +110,12 @@
@Override
public boolean isChecked() {
- return checkedFlag;
+ return mCheckedFlag;
}
@Override
public boolean setChecked(boolean isChecked) {
- checkedFlag = isChecked;
+ mCheckedFlag = isChecked;
return true;
}
diff --git a/tests/unit/src/com/android/settings/core/codeinspection/ClassScanner.java b/tests/unit/src/com/android/settings/core/codeinspection/ClassScanner.java
new file mode 100644
index 0000000..b129ecd
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/codeinspection/ClassScanner.java
@@ -0,0 +1,66 @@
+/*
+ * 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.core.codeinspection;
+
+import com.google.common.reflect.ClassPath;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Scans and builds all classes in current classloader.
+ */
+public class ClassScanner {
+
+ public List<Class<?>> getClassesForPackage(String packageName) throws ClassNotFoundException {
+ final List<Class<?>> classes = new ArrayList<>();
+
+ try {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ClassPath classPath = ClassPath.from(classLoader);
+
+ // Some anonymous classes don't return true when calling isAnonymousClass(), but they
+ // always seem to be nested anonymous classes like com.android.settings.Foo$1$2. In
+ // general we don't want any anonymous classes so we just filter these out by searching
+ // for $[0-9] in the name.
+ Pattern anonymousClassPattern = Pattern.compile(".*\\$\\d+.*");
+ Matcher anonymousClassMatcher = anonymousClassPattern.matcher("");
+
+ for (ClassPath.ClassInfo info : classPath.getAllClasses()) {
+ if (info.getPackageName().startsWith(packageName)) {
+ try {
+ Class clazz = classLoader.loadClass(info.getName());
+ if (clazz.isAnonymousClass() || anonymousClassMatcher.reset(
+ clazz.getName()).matches()) {
+ continue;
+ }
+ classes.add(clazz);
+ } catch (NoClassDefFoundError e) {
+ // do nothing. this class hasn't been found by the
+ // loader, and we don't care.
+ }
+ }
+ }
+ } catch (final IOException e) {
+ throw new ClassNotFoundException("Error when parsing " + packageName, e);
+ }
+ return classes;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/core/codeinspection/CodeInspector.java b/tests/unit/src/com/android/settings/core/codeinspection/CodeInspector.java
new file mode 100644
index 0000000..fb8ad6e
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/codeinspection/CodeInspector.java
@@ -0,0 +1,94 @@
+/*
+ * 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.core.codeinspection;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Modifier;
+import java.util.List;
+
+/**
+ * Inspector takes a list of class objects and perform static code analysis in its {@link #run()}
+ * method.
+ */
+public abstract class CodeInspector {
+
+ protected static final String PACKAGE_NAME = "com.android.settings";
+
+ private static final String TEST_CLASS_SUFFIX = "Test";
+ private static final String TEST_INNER_CLASS_SIGNATURE = "Test$";
+
+ protected final List<Class<?>> mClasses;
+
+ public CodeInspector(List<Class<?>> classes) {
+ mClasses = classes;
+ }
+
+ /**
+ * Code inspection runner method.
+ */
+ public abstract void run();
+
+ protected void assertNoObsoleteInExemptList(String listName, List<String> list) {
+ final StringBuilder obsoleteExemptItems = new StringBuilder(listName).append(
+ " contains item that should not be exempted.\n");
+ for (String c : list) {
+ obsoleteExemptItems.append(c).append("\n");
+ }
+ assertWithMessage(obsoleteExemptItems.toString()).that(list).isEmpty();
+ }
+
+ protected boolean isConcreteSettingsClass(Class clazz) {
+ // Abstract classes
+ if (Modifier.isAbstract(clazz.getModifiers())) {
+ return false;
+ }
+ final String packageName = clazz.getPackage().getName();
+ // Classes that are not in Settings
+ if (!packageName.contains(PACKAGE_NAME + ".") && !packageName.endsWith(PACKAGE_NAME)) {
+ return false;
+ }
+ final String className = clazz.getName();
+ // Classes from tests
+ if (className.endsWith(TEST_CLASS_SUFFIX)) {
+ return false;
+ }
+ if (className.contains(TEST_INNER_CLASS_SIGNATURE)) {
+ return false;
+ }
+ return true;
+ }
+
+ public static void initializeExemptList(List<String> exemptList, String filename) {
+ try {
+ final InputStream in = ApplicationProvider.getApplicationContext()
+ .getAssets().open(filename);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ exemptList.add(line);
+ }
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Error initializing exempt list " + filename, e);
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/core/codeinspection/LifecycleObserverCodeInspector.java b/tests/unit/src/com/android/settings/core/codeinspection/LifecycleObserverCodeInspector.java
new file mode 100644
index 0000000..f8b2a46
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/codeinspection/LifecycleObserverCodeInspector.java
@@ -0,0 +1,93 @@
+/*
+ * 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.core.codeinspection;
+
+import static org.junit.Assert.fail;
+
+import android.util.ArraySet;
+
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnAttach;
+import com.android.settingslib.core.lifecycle.events.OnCreate;
+import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
+import com.android.settingslib.core.lifecycle.events.OnDestroy;
+import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
+import com.android.settingslib.core.lifecycle.events.OnPause;
+import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.core.lifecycle.events.SetPreferenceScreen;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+public class LifecycleObserverCodeInspector extends CodeInspector {
+
+ private static final List<Class> LIFECYCLE_EVENTS = Arrays.asList(
+ OnAttach.class,
+ OnCreate.class,
+ OnCreateOptionsMenu.class,
+ OnDestroy.class,
+ OnOptionsItemSelected.class,
+ OnPause.class,
+ OnPrepareOptionsMenu.class,
+ OnResume.class,
+ OnSaveInstanceState.class,
+ OnStart.class,
+ OnStop.class,
+ SetPreferenceScreen.class
+ );
+
+ public LifecycleObserverCodeInspector(List<Class<?>> classes) {
+ super(classes);
+ }
+
+ @Override
+ public void run() {
+ final Set<String> notImplementingLifecycleObserver = new ArraySet<>();
+ for (Class clazz : mClasses) {
+ if (!isConcreteSettingsClass(clazz)) {
+ continue;
+ }
+ boolean classObservesLifecycleEvent = false;
+ for (Class event : LIFECYCLE_EVENTS) {
+ if (event.isAssignableFrom(clazz)) {
+ classObservesLifecycleEvent = true;
+ break;
+ }
+ }
+ if (classObservesLifecycleEvent && !LifecycleObserver.class.isAssignableFrom(clazz)) {
+ // Observes LifecycleEvent but not implementing LifecycleObserver. Something is
+ // wrong.
+ notImplementingLifecycleObserver.add(clazz.getName());
+ }
+ }
+ if (!notImplementingLifecycleObserver.isEmpty()) {
+ final String errorTemplate =
+ "The following class(es) implements lifecycle.events.*, but don't "
+ + "implement LifecycleObserver. Something is wrong:\n";
+ final StringBuilder error = new StringBuilder(errorTemplate);
+ for (String name : notImplementingLifecycleObserver) {
+ error.append(name).append('\n');
+ }
+ fail(error.toString());
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java b/tests/unit/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java
new file mode 100644
index 0000000..98958cf
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java
@@ -0,0 +1,73 @@
+/*
+ * 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.core.instrumentation;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.util.ArraySet;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.settings.core.codeinspection.CodeInspector;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * {@link CodeInspector} that verifies all fragments implements Instrumentable.
+ */
+public class InstrumentableFragmentCodeInspector extends CodeInspector {
+
+ private final List<String> mNotImplementingInstrumentableExemptList;
+
+ public InstrumentableFragmentCodeInspector(List<Class<?>> classes) {
+ super(classes);
+ mNotImplementingInstrumentableExemptList = new ArrayList<>();
+ initializeExemptList(mNotImplementingInstrumentableExemptList,
+ "exempt_not_implementing_instrumentable");
+ }
+
+ @Override
+ public void run() {
+ final Set<String> broken = new ArraySet<>();
+
+ for (Class clazz : mClasses) {
+ if (!isConcreteSettingsClass(clazz)) {
+ continue;
+ }
+ final String className = clazz.getName();
+ // If it's a fragment, it must also be instrumentable.
+ final boolean allowlisted =
+ mNotImplementingInstrumentableExemptList.remove(className);
+ if (Fragment.class.isAssignableFrom(clazz)
+ && !Instrumentable.class.isAssignableFrom(clazz)
+ && !allowlisted) {
+ broken.add(className);
+ }
+ }
+ final StringBuilder sb = new StringBuilder(
+ "All fragments should implement Instrumentable, but the following are not:\n");
+ for (String c : broken) {
+ sb.append(c).append("\n");
+ }
+ assertWithMessage(sb.toString()).that(broken.isEmpty()).isTrue();
+ assertNoObsoleteInExemptList("exempt_not_implementing_instrumentable",
+ mNotImplementingInstrumentableExemptList);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java b/tests/unit/src/com/android/settings/dashboard/CategoryManagerTest.java
similarity index 97%
rename from tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java
rename to tests/unit/src/com/android/settings/dashboard/CategoryManagerTest.java
index a0db866..98540f9 100644
--- a/tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java
+++ b/tests/unit/src/com/android/settings/dashboard/CategoryManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -29,6 +29,9 @@
import android.os.Bundle;
import android.util.Pair;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settingslib.drawer.ActivityTile;
import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.DashboardCategory;
@@ -38,13 +41,11 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.HashMap;
import java.util.Map;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class CategoryManagerTest {
private ActivityInfo mActivityInfo;
@@ -55,7 +56,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mActivityInfo = new ActivityInfo();
mActivityInfo.packageName = "pkg";
mActivityInfo.name = "class";
@@ -144,7 +145,8 @@
mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
// Sort their priorities
- mCategoryManager.sortCategories(RuntimeEnvironment.application, mCategoryByKeyMap);
+ mCategoryManager.sortCategories(ApplicationProvider.getApplicationContext(),
+ mCategoryByKeyMap);
// Verify they are now sorted.
assertThat(category.getTile(0)).isSameInstanceAs(tile3);
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentRegistryTest.java b/tests/unit/src/com/android/settings/dashboard/DashboardFragmentRegistryTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/dashboard/DashboardFragmentRegistryTest.java
rename to tests/unit/src/com/android/settings/dashboard/DashboardFragmentRegistryTest.java
index 10aaad8..435fe01 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentRegistryTest.java
+++ b/tests/unit/src/com/android/settings/dashboard/DashboardFragmentRegistryTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -18,14 +18,15 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.accounts.AccountDashboardFragment;
import com.android.settingslib.drawer.CategoryKey;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class DashboardFragmentRegistryTest {
@Test
public void pageAndKeyShouldHave1to1Mapping() {
diff --git a/tests/unit/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java b/tests/unit/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
new file mode 100644
index 0000000..68a6788
--- /dev/null
+++ b/tests/unit/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
@@ -0,0 +1,84 @@
+/*
+ * 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.dashboard;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerListHelper;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.DatabaseIndexingUtils;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.List;
+
+public class DashboardFragmentSearchIndexProviderInspector {
+
+ public static boolean isSharingPreferenceControllers(Class clazz) {
+ final Context context = ApplicationProvider.getApplicationContext();
+ final Fragment fragment;
+ try {
+ fragment = Fragment.instantiate(context, clazz.getName());
+ } catch (Throwable e) {
+ // Can't do much with exception, assume the test passed.
+ return true;
+ }
+ if (!(fragment instanceof DashboardFragment)) {
+ return true;
+ }
+
+ final BaseSearchIndexProvider provider =
+ (BaseSearchIndexProvider) DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ if (provider == null) {
+ return true;
+ }
+ final List<AbstractPreferenceController> controllersFromSearchIndexProvider;
+ final List<AbstractPreferenceController> controllersFromFragment;
+ try {
+ controllersFromSearchIndexProvider = provider.getPreferenceControllers(context);
+ } catch (Throwable e) {
+ // Can't do much with exception, assume the test passed.
+ return true;
+ }
+ try {
+ controllersFromFragment =
+ ((DashboardFragment) fragment).createPreferenceControllers(context);
+ List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper
+ .getPreferenceControllersFromXml(context,
+ ((DashboardFragment) fragment).getPreferenceScreenResId());
+ final List<BasePreferenceController> uniqueControllerFromXml =
+ PreferenceControllerListHelper.filterControllers(
+ controllersFromXml, controllersFromFragment);
+ controllersFromFragment.addAll(uniqueControllerFromXml);
+
+ } catch (Throwable e) {
+ // Can't do much with exception, assume the test passed.
+ return true;
+ }
+
+ if (controllersFromFragment == controllersFromSearchIndexProvider) {
+ return true;
+ } else if (controllersFromFragment != null && controllersFromSearchIndexProvider != null) {
+ return controllersFromFragment.size() == controllersFromSearchIndexProvider.size();
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
new file mode 100644
index 0000000..76deec6
--- /dev/null
+++ b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -0,0 +1,571 @@
+/*
+ * 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.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.Typeface;
+import android.net.ConnectivityManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.telephony.SubscriptionManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.testutils.ResourcesUtils;
+import com.android.settingslib.Utils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+public class DataUsageSummaryPreferenceTest {
+
+ private static final long CYCLE_DURATION_MILLIS = 1000000000L;
+ private static final long UPDATE_LAG_MILLIS = 10000000L;
+ private static final String FAKE_CARRIER = "z-mobile";
+
+ private Context mContext;
+ private Resources mResources;
+ private PreferenceViewHolder mHolder;
+ private DataUsageSummaryPreference mSummaryPreference;
+
+ private long mCycleEnd;
+ private long mUpdateTime;
+
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+ mSummaryPreference = spy(new DataUsageSummaryPreference(mContext, null /* attrs */));
+ LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);
+ View view = inflater.inflate(
+ mSummaryPreference.getLayoutResource(),
+ null /* root */, false /* attachToRoot */);
+
+ mHolder = spy(PreferenceViewHolder.createInstanceForTests(view));
+ assertThat(mSummaryPreference.getDataUsed(mHolder)).isNotNull();
+
+ final long now = System.currentTimeMillis();
+ mCycleEnd = now + CYCLE_DURATION_MILLIS;
+ mUpdateTime = now - UPDATE_LAG_MILLIS;
+ }
+
+ @UiThreadTest
+ @Test
+ public void testSetUsageInfo_withLaunchIntent_launchButtonShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ null /* launchIntent */);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
+ .isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withDataPlans_carrierInfoShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withNoDataPlans_carrierInfoNotShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getVisibility())
+ .isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatDaysCorrectly() {
+ int baseUnit = 2;
+ int smudge = 6;
+ final long updateTime = System.currentTimeMillis()
+ - TimeUnit.DAYS.toMillis(baseUnit) - TimeUnit.HOURS.toMillis(smudge);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
+ .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " days ago");
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatHoursCorrectly() {
+ int baseUnit = 2;
+ int smudge = 6;
+ final long updateTime = System.currentTimeMillis()
+ - TimeUnit.HOURS.toMillis(baseUnit) - TimeUnit.MINUTES.toMillis(smudge);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
+ .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " hr ago");
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatMinutesCorrectly() {
+ int baseUnit = 2;
+ int smudge = 6;
+ final long updateTime = System.currentTimeMillis()
+ - TimeUnit.MINUTES.toMillis(baseUnit) - TimeUnit.SECONDS.toMillis(smudge);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
+ .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " min ago");
+ }
+
+ @Test
+ public void testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
+ .isEqualTo("Updated by " + FAKE_CARRIER + " just now");
+ }
+
+ @Test
+ public void testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
+ 1 /* numPlans */, new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
+ .isEqualTo("Updated just now");
+ }
+
+ @Test
+ public void testCarrierUpdateTimeWithNoCarrier_shouldFormatTime() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
+ 1 /* numPlans */, new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
+ .isEqualTo("Updated 2 min ago");
+ }
+
+ @Test
+ public void setUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ TextView carrierInfo = mSummaryPreference.getCarrierInfo(mHolder);
+ assertThat(carrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(carrierInfo.getCurrentTextColor()).isEqualTo(
+ Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorSecondary));
+ assertThat(carrierInfo.getTypeface()).isEqualTo(Typeface.SANS_SERIF);
+ }
+
+ @Test
+ public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont() {
+ final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7);
+ mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ TextView carrierInfo = mSummaryPreference.getCarrierInfo(mHolder);
+ assertThat(carrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(carrierInfo.getCurrentTextColor()).isEqualTo(
+ Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError));
+ assertThat(carrierInfo.getTypeface()).isEqualTo(
+ DataUsageSummaryPreference.SANS_SERIF_MEDIUM);
+ }
+
+ @Test
+ public void testSetUsageInfo_withNoDataPlans_usageTitleNotShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getUsageTitle(mHolder).getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withMultipleDataPlans_usageTitleShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 2 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getUsageTitle(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetUsageInfo_cycleRemainingTimeIsLessOneDay() {
+ // just under one day
+ final long cycleEnd = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(23);
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getText()).isEqualTo(
+ ResourcesUtils.getResourcesString(
+ mContext, "billing_cycle_less_than_one_day_left"));
+ }
+
+ @Test
+ public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft() {
+ final long cycleEnd = System.currentTimeMillis() - 1L;
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getText()).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "billing_cycle_none_left"));
+ }
+
+ @Test
+ public void testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals() {
+ final int daysLeft = 3;
+ final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
+ + TimeUnit.HOURS.toMillis(1);
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getText())
+ .isEqualTo(daysLeft + " days left");
+ }
+
+ @Test
+ public void testSetLimitInfo_withLimitInfo_dataLimitsShown() {
+ final String limitText = "test limit text";
+ mSummaryPreference.setLimitInfo(limitText);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getDataLimits(mHolder).getText()).isEqualTo(limitText);
+ }
+
+ @Test
+ public void testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown() {
+ mSummaryPreference.setLimitInfo(null);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetLimitInfo_withEmptyLimitInfo_dataLimitsNotShown() {
+ final String emptyLimitText = "";
+ mSummaryPreference.setLimitInfo(emptyLimitText);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetChartEnabledFalse_hidesLabelBar() {
+ setValidLabels();
+ mSummaryPreference.setChartEnabled(false);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getLabelBar(mHolder).getVisibility()).isEqualTo(View.GONE);
+ assertThat(mSummaryPreference.getProgressBar(mHolder).getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetEmptyLabels_hidesLabelBar() {
+ mSummaryPreference.setLabels("", "");
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getLabelBar(mHolder).getVisibility()).isEqualTo(View.GONE);
+ assertThat(mSummaryPreference.getProgressBar(mHolder).getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testLabelBar_isVisible_whenLabelsSet() {
+ setValidLabels();
+ //mChartEnabled defaults to true
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getLabelBar(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getProgressBar(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetProgress_updatesProgressBar() {
+ setValidLabels();
+ mSummaryPreference.setProgress(.5f);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getProgressBar(mHolder).getProgress()).isEqualTo(50);
+ }
+
+ private void setValidLabels() {
+ mSummaryPreference.setLabels("0.0 GB", "5.0 GB");
+ }
+
+ @Test
+ public void testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+ mSummaryPreference.setUsageNumbers(
+ BillingCycleSettings.MIB_IN_BYTES,
+ 10 * BillingCycleSettings.MIB_IN_BYTES,
+ true /* hasMobileData */);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getDataUsed(mHolder).getText().toString())
+ .isEqualTo("1.00 MB used");
+ assertThat(mSummaryPreference.getDataRemaining(mHolder).getText().toString())
+ .isEqualTo("9.00 MB left");
+ assertThat(mSummaryPreference.getDataRemaining(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ final int colorId = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorAccent);
+ assertThat(mSummaryPreference.getDataRemaining(mHolder).getCurrentTextColor())
+ .isEqualTo(colorId);
+ }
+
+ @Test
+ public void testSetUsageInfo_withDataOverusage() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+ mSummaryPreference.setUsageNumbers(
+ 11 * BillingCycleSettings.MIB_IN_BYTES,
+ 10 * BillingCycleSettings.MIB_IN_BYTES,
+ true /* hasMobileData */);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getDataUsed(mHolder).getText().toString())
+ .isEqualTo("11.00 MB used");
+ assertThat(mSummaryPreference.getDataRemaining(mHolder).getText().toString())
+ .isEqualTo("1.00 MB over");
+ final int colorId = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError);
+ assertThat(mSummaryPreference.getDataRemaining(mHolder).getCurrentTextColor())
+ .isEqualTo(colorId);
+ }
+
+ @Test
+ public void testSetUsageInfo_withUsageInfo_dataUsageShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+ mSummaryPreference.setUsageNumbers(
+ BillingCycleSettings.MIB_IN_BYTES, -1L, true /* hasMobileData */);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getDataUsed(mHolder).getText().toString())
+ .isEqualTo("1.00 MB used");
+ assertThat(mSummaryPreference.getDataRemaining(mHolder).getText()).isEqualTo("");
+ }
+
+ @Test
+ public void testSetAppIntent_toMdpApp_intentCorrect() {
+ final Intent intent = new Intent(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
+ intent.setPackage("test-owner.example.com");
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, 42);
+
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ intent);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).getText())
+ .isEqualTo(ResourcesUtils.getResourcesString(mContext, "launch_mdp_app_text"));
+
+ doNothing().when(mContext).startActivity(any(Intent.class));
+ mSummaryPreference.getLaunchButton(mHolder).callOnClick();
+ final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+ verify(mContext).startActivity(intentCaptor.capture());
+ final Intent startedIntent = intentCaptor.getValue();
+
+ assertThat(startedIntent.getAction())
+ .isEqualTo(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
+ assertThat(startedIntent.getPackage()).isEqualTo("test-owner.example.com");
+ assertThat(startedIntent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, -1))
+ .isEqualTo(42);
+ }
+
+ @Test
+ public void testSetUsageInfo_withOverflowStrings_dataRemainingNotShown() {
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */,
+ false /* attachToRoot */);
+
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
+ new Intent());
+ mSummaryPreference.setUsageNumbers(
+ BillingCycleSettings.MIB_IN_BYTES,
+ 10 * BillingCycleSettings.MIB_IN_BYTES,
+ true /* hasMobileData */);
+
+ int data_used_formatted_id = ResourcesUtils.getResourcesId(
+ mContext, "string", "data_used_formatted");
+ int data_remaining_id = ResourcesUtils.getResourcesId(
+ mContext, "string", "data_remaining");
+ CharSequence data_used_formatted_cs = "^1 ^2 used with long trailing text";
+ CharSequence data_remaining_cs = "^1 left";
+ doReturn(data_used_formatted_cs).when(mResources).getText(data_used_formatted_id);
+ doReturn(data_remaining_cs).when(mResources).getText(data_remaining_id);
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+
+ TextView dataUsed = mSummaryPreference.getDataUsed(mHolder);
+ TextView dataRemaining = mSummaryPreference.getDataRemaining(mHolder);
+ int width = MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY);
+ dataUsed.measure(width, MeasureSpec.UNSPECIFIED);
+ dataRemaining.measure(width, MeasureSpec.UNSPECIFIED);
+
+ assertThat(dataRemaining.getVisibility()).isEqualTo(View.VISIBLE);
+
+ MeasurableLinearLayout layout = mSummaryPreference.getLayout(mHolder);
+ layout.measure(
+ MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
+
+ assertThat(dataUsed.getText().toString()).isEqualTo("1.00 MB used with long trailing text");
+ // TODO(b/175389659): re-enable this line once cuttlefish device specs are verified.
+ // assertThat(dataRemaining.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetWifiMode_withUsageInfo_dataUsageShown() {
+ final int daysLeft = 3;
+ final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
+ + TimeUnit.HOURS.toMillis(1);
+ mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
+ new Intent());
+ mSummaryPreference.setUsageNumbers(1000000L, -1L, true);
+ final String cycleText = "The quick fox";
+ mSummaryPreference.setWifiMode(true /* isWifiMode */, cycleText, false /* isSingleWifi */);
+ doReturn(200L).when(mSummaryPreference).getHistoricalUsageLevel();
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+ assertThat(mSummaryPreference.getUsageTitle(mHolder).getText().toString())
+ .isEqualTo(ResourcesUtils.getResourcesString(mContext, "data_usage_wifi_title"));
+ assertThat(mSummaryPreference.getUsageTitle(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getCycleTime(mHolder).getText()).isEqualTo(cycleText);
+ assertThat(mSummaryPreference.getCarrierInfo(mHolder).getVisibility()).isEqualTo(View.GONE);
+ assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility()).isEqualTo(View.GONE);
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
+ .isEqualTo(View.VISIBLE);
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).getText())
+ .isEqualTo(ResourcesUtils.getResourcesString(mContext, "launch_wifi_text"));
+
+ doNothing().when(mContext).startActivity(any(Intent.class));
+ mSummaryPreference.getLaunchButton(mHolder).callOnClick();
+
+ final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+ verify(mContext).startActivity(intentCaptor.capture());
+ final Intent startedIntent = intentCaptor.getValue();
+
+ final Bundle expect = new Bundle(1);
+ expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
+ NetworkTemplate.buildTemplateWifiWildcard());
+ final Bundle actual = startedIntent
+ .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE))
+ .isEqualTo(NetworkTemplate.buildTemplateWifiWildcard());
+
+ assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
+ .isEqualTo(ResourcesUtils.getResourcesId(mContext, "string", "wifi_data_usage"));
+ }
+
+ @UiThreadTest
+ @Test
+ public void testSetWifiMode_noUsageInfo_shouldDisableLaunchButton() {
+ mSummaryPreference.setWifiMode(true /* isWifiMode */, "Test cycle text",
+ false /* isSingleWifi */);
+ doReturn(0L).when(mSummaryPreference).getHistoricalUsageLevel();
+
+ mSummaryPreference.onBindViewHolder(mHolder);
+
+ assertThat(mSummaryPreference.getLaunchButton(mHolder).isEnabled()).isFalse();
+ }
+
+ @Test
+ public void launchWifiDataUsage_shouldSetWifiNetworkTypeInIntentExtra() {
+ doNothing().when(mContext).startActivity(any(Intent.class));
+ mSummaryPreference.launchWifiDataUsage(mContext);
+
+ final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(
+ Intent.class);
+ verify(mContext).startActivity(intentCaptor.capture());
+ final Intent launchIntent = intentCaptor.getValue();
+ final Bundle args =
+ launchIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+
+ assertThat(args.getInt(DataUsageList.EXTRA_NETWORK_TYPE))
+ .isEqualTo(ConnectivityManager.TYPE_WIFI);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/datausage/OWNERS b/tests/unit/src/com/android/settings/datausage/OWNERS
new file mode 100644
index 0000000..18806f4
--- /dev/null
+++ b/tests/unit/src/com/android/settings/datausage/OWNERS
@@ -0,0 +1 @@
+include /src/com/android/settings/datausage/OWNERS
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePickerTest.java b/tests/unit/src/com/android/settings/datetime/timezone/RegionZonePickerTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePickerTest.java
rename to tests/unit/src/com/android/settings/datetime/timezone/RegionZonePickerTest.java
index dd734bb..de607da 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePickerTest.java
+++ b/tests/unit/src/com/android/settings/datetime/timezone/RegionZonePickerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -20,6 +20,8 @@
import android.icu.text.Collator;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.datetime.timezone.RegionZonePicker.TimeZoneInfoComparator;
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
@@ -31,9 +33,8 @@
import java.util.Date;
import java.util.List;
import java.util.Locale;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class RegionZonePickerTest {
@Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java b/tests/unit/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java
similarity index 89%
rename from tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java
index 563bf8d..64d8abb 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -23,18 +23,19 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.Date;
import java.util.Locale;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class TimeZoneInfoPreferenceControllerTest {
private TimeZoneInfo mTimeZoneInfo;
@@ -42,7 +43,7 @@
@Before
public void setUp() {
- final Context context = RuntimeEnvironment.application;
+ final Context context = ApplicationProvider.getApplicationContext();
final Date now = new Date(0L); // 00:00 1/1/1970
final Formatter formatter = new Formatter(Locale.US, now);
mTimeZoneInfo = formatter.format("America/Los_Angeles");
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoTest.java b/tests/unit/src/com/android/settings/datetime/timezone/TimeZoneInfoTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoTest.java
rename to tests/unit/src/com/android/settings/datetime/timezone/TimeZoneInfoTest.java
index fd8b81f..f43cde3 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoTest.java
+++ b/tests/unit/src/com/android/settings/datetime/timezone/TimeZoneInfoTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -18,6 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter;
import org.junit.Test;
@@ -25,9 +27,8 @@
import java.util.Date;
import java.util.Locale;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class TimeZoneInfoTest {
@Test
diff --git a/tests/robotests/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java
similarity index 95%
rename from tests/robotests/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java
index 4f04c38..827f5a1 100644
--- a/tests/robotests/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java
@@ -22,14 +22,14 @@
import android.content.SharedPreferences;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class OverlaySettingsPreferenceControllerTest {
private Context mContext;
@@ -38,7 +38,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new OverlaySettingsPreferenceController(mContext);
mPreference = new SwitchPreference(mContext);
}
diff --git a/tests/unit/src/com/android/settings/development/autofill/AutofillTestingHelper.java b/tests/unit/src/com/android/settings/development/autofill/AutofillTestingHelper.java
new file mode 100644
index 0000000..c1ef2b5
--- /dev/null
+++ b/tests/unit/src/com/android/settings/development/autofill/AutofillTestingHelper.java
@@ -0,0 +1,62 @@
+/*
+ * 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.development.autofill;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+
+final class AutofillTestingHelper {
+ private final ContentResolver mResolver;
+
+ AutofillTestingHelper(Context context) {
+ mResolver = context.getContentResolver();
+ }
+
+ public void setLoggingLevel(int max) {
+ setGlobal(Settings.Global.AUTOFILL_LOGGING_LEVEL, max);
+ }
+
+ public void setMaxPartitionsSize(int max) {
+ setGlobal(Settings.Global.AUTOFILL_MAX_PARTITIONS_SIZE, max);
+ }
+
+ public void setMaxVisibleDatasets(int level) {
+ setGlobal(Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS, level);
+ }
+
+ public int getLoggingLevel() throws SettingNotFoundException {
+ return getGlobal(Settings.Global.AUTOFILL_LOGGING_LEVEL);
+ }
+
+ public int getMaxPartitionsSize() throws SettingNotFoundException {
+ return getGlobal(Settings.Global.AUTOFILL_MAX_PARTITIONS_SIZE);
+ }
+
+ public int getMaxVisibleDatasets() throws SettingNotFoundException {
+ return getGlobal(Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS);
+ }
+
+ private void setGlobal(String key, int value) {
+ Settings.Global.putInt(mResolver, key, value);
+ }
+
+ private int getGlobal(String key) throws SettingNotFoundException {
+ return Settings.Global.getInt(mResolver, key);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagPersistentTest.java b/tests/unit/src/com/android/settings/development/featureflags/FeatureFlagPersistentTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagPersistentTest.java
rename to tests/unit/src/com/android/settings/development/featureflags/FeatureFlagPersistentTest.java
index 7d7e36b..9b978b0 100644
--- a/tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagPersistentTest.java
+++ b/tests/unit/src/com/android/settings/development/featureflags/FeatureFlagPersistentTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -22,14 +22,15 @@
import android.provider.Settings;
import android.util.FeatureFlagUtils;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class FeatureFlagPersistentTest {
private static final String TEST_FEATURE_NAME = "test_feature";
@@ -43,7 +44,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
FeatureFlagPersistent.getAllPersistentFlags().add(TEST_FEATURE_NAME);
FeatureFlagUtils.getAllFeatureFlags().put(TEST_FEATURE_NAME, "false");
@@ -137,7 +138,8 @@
FeatureFlagPersistent.setEnabled(mContext, TEST_FEATURE_NAME, true);
- assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME)).isEqualTo("true");
+ assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME))
+ .isEqualTo("true");
assertThat(FeatureFlagUtils.isEnabled(mContext, TEST_FEATURE_NAME)).isTrue();
}
@@ -150,7 +152,8 @@
FeatureFlagPersistent.setEnabled(mContext, TEST_FEATURE_NAME, false);
- assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME)).isEqualTo("false");
+ assertThat(SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + TEST_FEATURE_NAME))
+ .isEqualTo("false");
assertThat(FeatureFlagUtils.isEnabled(mContext, TEST_FEATURE_NAME)).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
index 06e66a1..550613b 100644
--- a/tests/robotests/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeDefaultOptionPreferenceControllerTest.java
@@ -22,15 +22,15 @@
import android.os.SystemProperties;
import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class TranscodeDefaultOptionPreferenceControllerTest {
private static final String TRANSCODE_DEFAULT_SYS_PROP_KEY =
"persist.sys.fuse.transcode_default";
diff --git a/tests/robotests/src/com/android/settings/development/transcode/TranscodeGlobalTogglePreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeGlobalTogglePreferenceControllerTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/development/transcode/TranscodeGlobalTogglePreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/development/transcode/TranscodeGlobalTogglePreferenceControllerTest.java
index aa2e672..7c0acd7 100644
--- a/tests/robotests/src/com/android/settings/development/transcode/TranscodeGlobalTogglePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeGlobalTogglePreferenceControllerTest.java
@@ -22,13 +22,13 @@
import android.os.SystemProperties;
import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class TranscodeGlobalTogglePreferenceControllerTest {
private static final String TRANSCODE_ENABLED_PROP_KEY = "persist.sys.fuse.transcode_enabled";
diff --git a/tests/robotests/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
index 8cba0c3..3caf8ae 100644
--- a/tests/robotests/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/transcode/TranscodeUserControlPreferenceControllerTest.java
@@ -22,15 +22,15 @@
import android.os.SystemProperties;
import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class TranscodeUserControlPreferenceControllerTest {
private static final String TRANSCODE_USER_CONTROL_SYS_PROP_KEY =
"persist.sys.fuse.transcode_user_control";
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
similarity index 77%
rename from tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
index 50a2cd1..1c13506 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -18,75 +18,94 @@
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+import static com.android.settings.deviceinfo.DeviceNamePreferenceController.RES_SHOW_DEVICE_NAME_BOOL;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
+import android.content.res.Resources;
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
+import android.os.Looper;
import android.provider.Settings;
+import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.widget.ValidatedEditTextPreference;
+import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBluetoothAdapter.class})
+@RunWith(AndroidJUnit4.class)
public class DeviceNamePreferenceControllerTest {
private static final String TESTING_STRING = "Testing";
+ private static final String TEST_PREFERENCE_KEY = "test_key";
@Mock
private WifiManager mWifiManager;
- @Mock
private PreferenceScreen mScreen;
private ValidatedEditTextPreference mPreference;
private DeviceNamePreferenceController mController;
private Context mContext;
+ private Resources mResources;
private BluetoothAdapter mBluetoothAdapter;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowApplication shadowApplication = ShadowApplication.getInstance();
- shadowApplication.setSystemService(Context.WIFI_SERVICE, mWifiManager);
- mContext = RuntimeEnvironment.application;
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ mScreen = preferenceManager.createPreferenceScreen(mContext);
mPreference = new ValidatedEditTextPreference(mContext);
- when(mScreen.findPreference(anyString())).thenReturn(mPreference);
+ mPreference.setKey(TEST_PREFERENCE_KEY);
+ mScreen.addPreference(mPreference);
+
final SoftApConfiguration configuration =
new SoftApConfiguration.Builder().setSsid("test-ap").build();
when(mWifiManager.getSoftApConfiguration()).thenReturn(configuration);
- mController = new DeviceNamePreferenceController(mContext, "test_key");
+ mController = new DeviceNamePreferenceController(mContext, TEST_PREFERENCE_KEY);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
+ @After
+ public void tearDown() {
+ Settings.Global.putString(
+ mContext.getContentResolver(), Settings.Global.DEVICE_NAME, null);
+ }
+
@Test
public void getAvailibilityStatus_availableByDefault() {
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
- @Config(qualifiers = "mcc999")
public void getAvailabilityStatus_unsupportedWhenSet() {
+ doReturn(false).when(mResources).getBoolean(RES_SHOW_DEVICE_NAME_BOOL);
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
@@ -122,6 +141,8 @@
assertThat(mPreference.getSummary()).isEqualTo(TESTING_STRING);
}
+ // TODO(b/175389659): Determine why this test case fails for virtual but not local devices.
+ @Ignore
@Test
public void setDeviceName_bluetoothNameUpdatedWhenDeviceNameUpdated() {
acceptDeviceName(true);
@@ -151,15 +172,6 @@
}
@Test
- public void setDeviceName_ignoresIfCancelPressed() {
- acceptDeviceName(true);
- mController.displayPreference(mScreen);
- mController.onPreferenceChange(mPreference, TESTING_STRING);
-
- assertThat(mBluetoothAdapter.getName()).isEqualTo(TESTING_STRING);
- }
-
- @Test
public void setDeviceName_okInDeviceNameWarningDialog_shouldChangePreferenceText() {
acceptDeviceName(true);
mController.displayPreference(mScreen);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicenseProviderTest.java b/tests/unit/src/com/android/settings/deviceinfo/legal/ModuleLicenseProviderTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicenseProviderTest.java
rename to tests/unit/src/com/android/settings/deviceinfo/legal/ModuleLicenseProviderTest.java
index b65137b..7719186 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicenseProviderTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/legal/ModuleLicenseProviderTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.settings.deviceinfo.legal;
@@ -28,27 +28,23 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
import android.content.pm.ModuleInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.res.AssetFileDescriptor;
-import android.content.res.AssetManager;
-import android.content.res.Resources;
import android.net.Uri;
-import android.os.ParcelFileDescriptor;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ModuleLicenseProviderTest {
public static final String PACKAGE_NAME = "com.android.test_package";
@Test
@@ -149,7 +145,7 @@
ModuleLicenseProvider provider = spy(new ModuleLicenseProvider());
Context context = mock(Context.class);
PackageManager packageManager = mock(PackageManager.class);
- when(provider.getContext()).thenReturn(context);
+ when(provider.getModuleContext()).thenReturn(context);
when(context.getPackageManager()).thenReturn(packageManager);
when(packageManager.getModuleInfo(PACKAGE_NAME, 0))
.thenThrow(new PackageManager.NameNotFoundException());
@@ -168,7 +164,7 @@
ModuleLicenseProvider provider = spy(new ModuleLicenseProvider());
Context context = mock(Context.class);
PackageManager packageManager = mock(PackageManager.class);
- when(provider.getContext()).thenReturn(context);
+ when(provider.getModuleContext()).thenReturn(context);
when(context.getPackageManager()).thenReturn(packageManager);
when(packageManager.getModuleInfo(PACKAGE_NAME, 0))
.thenReturn(new ModuleInfo());
@@ -249,7 +245,7 @@
ModuleLicenseProvider provider = spy(new ModuleLicenseProvider());
Context context = mock(Context.class);
PackageManager packageManager = mock(PackageManager.class);
- when(provider.getContext()).thenReturn(context);
+ when(provider.getModuleContext()).thenReturn(context);
when(context.getPackageManager()).thenReturn(packageManager);
when(packageManager.getModuleInfo(PACKAGE_NAME, 0))
.thenThrow(new PackageManager.NameNotFoundException());
@@ -268,7 +264,7 @@
ModuleLicenseProvider provider = spy(new ModuleLicenseProvider());
Context context = mock(Context.class);
PackageManager packageManager = mock(PackageManager.class);
- when(provider.getContext()).thenReturn(context);
+ when(provider.getModuleContext()).thenReturn(context);
when(context.getPackageManager()).thenReturn(packageManager);
when(packageManager.getModuleInfo(PACKAGE_NAME, 0))
.thenReturn(new ModuleInfo());
@@ -284,7 +280,7 @@
@Test
public void isCachedHtmlFileOutdated_packageNotInSharedPrefs_returnTrue()
throws PackageManager.NameNotFoundException {
- Context context = RuntimeEnvironment.application;
+ Context context = ApplicationProvider.getApplicationContext();
context.getSharedPreferences(ModuleLicenseProvider.PREFS_NAME, Context.MODE_PRIVATE)
.edit().clear().commit();
@@ -294,7 +290,7 @@
@Test
public void isCachedHtmlFileOutdated_versionCodeDiffersFromSharedPref_returnTrue()
throws PackageManager.NameNotFoundException {
- Context context = spy(RuntimeEnvironment.application);
+ Context context = spy(ApplicationProvider.getApplicationContext());
SharedPreferences.Editor editor = context.getSharedPreferences(
ModuleLicenseProvider.PREFS_NAME, Context.MODE_PRIVATE)
.edit();
@@ -313,7 +309,7 @@
@Test
public void isCachedHtmlFileOutdated_fileDoesNotExist_returnTrue()
throws PackageManager.NameNotFoundException {
- Context context = spy(RuntimeEnvironment.application);
+ Context context = spy(ApplicationProvider.getApplicationContext());
context.getSharedPreferences(ModuleLicenseProvider.PREFS_NAME, Context.MODE_PRIVATE)
.edit().clear().commit();
SharedPreferences.Editor editor = context.getSharedPreferences(
@@ -335,7 +331,7 @@
@Test
public void isCachedHtmlFileOutdated_fileIsEmpty_returnTrue()
throws PackageManager.NameNotFoundException, IOException {
- Context context = spy(RuntimeEnvironment.application);
+ Context context = spy(ApplicationProvider.getApplicationContext());
context.getSharedPreferences(ModuleLicenseProvider.PREFS_NAME, Context.MODE_PRIVATE)
.edit().clear().commit();
SharedPreferences.Editor editor = context.getSharedPreferences(
@@ -360,7 +356,7 @@
@Test
public void isCachedHtmlFileOutdated_notOutdated_returnFalse()
throws PackageManager.NameNotFoundException, IOException {
- Context context = spy(RuntimeEnvironment.application);
+ Context context = spy(ApplicationProvider.getApplicationContext());
context.getSharedPreferences(ModuleLicenseProvider.PREFS_NAME, Context.MODE_PRIVATE)
.edit().clear().commit();
SharedPreferences.Editor editor = context.getSharedPreferences(
@@ -388,6 +384,8 @@
@Test
public void getUriForPackage_returnsProperlyFormattedUri() {
assertThat(ModuleLicenseProvider.getUriForPackage(PACKAGE_NAME))
- .isEqualTo(Uri.parse("content://com.android.settings.module_licenses/com.android.test_package/NOTICE.html"));
+ .isEqualTo(Uri.parse(
+ "content://com.android.settings.module_licenses/"
+ + "com.android.test_package/NOTICE.html"));
}
}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
similarity index 85%
rename from tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
rename to tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
index a854c04..e94c4e7 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
@@ -28,13 +28,11 @@
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.NETWORK_PROVIDER_VALUE_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.OPERATOR_INFO_LABEL_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.OPERATOR_INFO_VALUE_ID;
-import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.PHONE_NUMBER_VALUE_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.ROAMING_INFO_VALUE_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.SERVICE_STATE_VALUE_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.SIGNAL_STRENGTH_LABEL_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.SIGNAL_STRENGTH_VALUE_ID;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
@@ -45,16 +43,11 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
-import android.content.pm.PackageInfo;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.CellSignalStrength;
-import android.telephony.CellSignalStrengthCdma;
-import android.telephony.CellSignalStrengthLte;
-import android.telephony.CellSignalStrengthWcdma;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
@@ -65,34 +58,27 @@
import android.telephony.euicc.EuiccManager;
import androidx.lifecycle.LifecycleOwner;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.R;
-import com.android.settings.testutils.shadow.ShadowDeviceInfoUtils;
-import com.android.settingslib.DeviceInfoUtils;
+import com.android.settings.testutils.ResourcesUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
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.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowPackageManager;
-import org.robolectric.shadows.ShadowTelephonyManager;
-import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowDeviceInfoUtils.class})
+@RunWith(AndroidJUnit4.class)
public class SimStatusDialogControllerTest {
@Mock
@@ -107,14 +93,13 @@
@Mock
private SignalStrength mSignalStrength;
@Mock
- private CellSignalStrengthCdma mCellSignalStrengthCdma;
+ private CellSignalStrength mCellSignalStrengthCdma;
@Mock
- private CellSignalStrengthLte mCellSignalStrengthLte;
+ private CellSignalStrength mCellSignalStrengthLte;
@Mock
- private CellSignalStrengthWcdma mCellSignalStrengthWcdma;
+ private CellSignalStrength mCellSignalStrengthWcdma;
@Mock
private CarrierConfigManager mCarrierConfigManager;
- @Mock
private PersistableBundle mPersistableBundle;
@Mock
private EuiccManager mEuiccManager;
@@ -122,6 +107,7 @@
private SimStatusDialogController mController;
private Context mContext;
+ @Mock
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@@ -131,27 +117,31 @@
private static final int MAX_PHONE_COUNT_DUAL_SIM = 2;
@Before
+ @UiThreadTest
public void setup() {
MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
+ mContext = spy(ApplicationProvider.getApplicationContext());
when(mDialog.getContext()).thenReturn(mContext);
- mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
- mSubscriptionManager = spy(mContext.getSystemService(SubscriptionManager.class));
-
mTelephonyManager = spy(mContext.getSystemService(TelephonyManager.class));
- final ShadowTelephonyManager shadowTelephonyMgr = shadowOf(mTelephonyManager);
- shadowTelephonyMgr.setTelephonyManagerForSubscriptionId(
- SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, mTelephonyManager);
+ mSubscriptionManager = spy(mContext.getSystemService(SubscriptionManager.class));
+ doReturn(mSubscriptionInfo).when(mSubscriptionManager)
+ .getActiveSubscriptionInfoForSimSlotIndex(anyInt());
+
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+ mCarrierConfigManager);
+ when(mContext.getSystemService(EuiccManager.class)).thenReturn(mEuiccManager);
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+
+ doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
+ SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
doReturn(2).when(mTelephonyManager).getCardIdForDefaultEuicc();
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mTelephonyManager).getDataNetworkType();
- doReturn(mEuiccManager).when(mContext).getSystemService(EuiccManager.class);
-
mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
- ShadowDeviceInfoUtils.setPhoneNumber("");
- //CellSignalStrength setup
+ // CellSignalStrength setup
doReturn(0).when(mCellSignalStrengthCdma).getDbm();
doReturn(0).when(mCellSignalStrengthCdma).getAsuLevel();
doReturn(0).when(mCellSignalStrengthLte).getDbm();
@@ -163,12 +153,6 @@
doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
- ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager);
- ReflectionHelpers.setField(mController, "mCarrierConfigManager", mCarrierConfigManager);
- ReflectionHelpers.setField(mController, "mSubscriptionInfo", mSubscriptionInfo);
- ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager);
- ReflectionHelpers.setField(mController, "mSubscriptionManager", mSubscriptionManager);
-
when(mTelephonyManager.getActiveModemCount()).thenReturn(MAX_PHONE_COUNT_SINGLE_SIM);
doReturn(new ArrayList<UiccCardInfo>()).when(mTelephonyManager).getUiccCardsInfo();
doReturn(new HashMap<Integer, Integer>()).when(mTelephonyManager)
@@ -178,23 +162,13 @@
when(mEuiccManager.getEid()).thenReturn("");
when(mEuiccManager.createForCardId(anyInt())).thenReturn(mEuiccManager);
+ mPersistableBundle = new PersistableBundle();
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL))
- .thenReturn(true);
+
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL, true);
doReturn(mServiceState).when(mTelephonyManager).getServiceState();
doReturn(mSignalStrength).when(mTelephonyManager).getSignalStrength();
-
- final ShadowPackageManager shadowPackageManager =
- Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager());
- final PackageInfo sysUIPackageInfo = new PackageInfo();
- sysUIPackageInfo.packageName = "com.android.systemui";
- shadowPackageManager.addPackage(sysUIPackageInfo);
- }
-
- @After
- public void tearDown() {
- ShadowDeviceInfoUtils.reset();
}
@Test
@@ -208,15 +182,10 @@
}
@Test
- public void initialize_updatePhoneNumberWith1111111111_shouldUpdatePhoneNumber() {
- ShadowDeviceInfoUtils.setPhoneNumber("1111111111");
-
- final String phoneNumber = DeviceInfoUtils.getBidiFormattedPhoneNumber(mContext,
- mSubscriptionInfo);
-
+ public void initialize_shouldUpdatePhoneNumber() {
mController.initialize();
- verify(mDialog).setText(PHONE_NUMBER_VALUE_ID, phoneNumber);
+ verify(mController).updatePhoneNumber();
}
@Test
@@ -235,19 +204,19 @@
mController.initialize();
- final String inServiceText = mContext.getString(R.string.radioInfo_service_in);
+ final String inServiceText = ResourcesUtils.getResourcesString(
+ mContext, "radioInfo_service_in");
verify(mDialog).setText(SERVICE_STATE_VALUE_ID, inServiceText);
}
@Test
public void initialize_updateServiceStateWithPowerOff_shouldUpdateTextAndResetSignalStrength() {
when(mServiceState.getState()).thenReturn(ServiceState.STATE_POWER_OFF);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
mController.initialize();
- final String offServiceText = mContext.getString(R.string.radioInfo_service_off);
+ final String offServiceText = ResourcesUtils.getResourcesString(
+ mContext, "radioInfo_service_off");
verify(mDialog).setText(SERVICE_STATE_VALUE_ID, offServiceText);
verify(mDialog).setText(SIGNAL_STRENGTH_VALUE_ID, "0");
}
@@ -257,12 +226,11 @@
when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
when(mServiceState.getDataRegistrationState()).thenReturn(
ServiceState.STATE_OUT_OF_SERVICE);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
mController.initialize();
- final String offServiceText = mContext.getString(R.string.radioInfo_service_out);
+ final String offServiceText = ResourcesUtils.getResourcesString(
+ mContext, "radioInfo_service_out");
verify(mDialog).setText(SERVICE_STATE_VALUE_ID, offServiceText);
verify(mDialog).setText(SIGNAL_STRENGTH_VALUE_ID, "0");
}
@@ -271,12 +239,11 @@
public void initialize_updateVoiceOutOfServiceDataInService_shouldUpdateTextToBeInService() {
when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
mController.initialize();
- final String inServiceText = mContext.getString(R.string.radioInfo_service_in);
+ final String inServiceText = ResourcesUtils.getResourcesString(
+ mContext, "radioInfo_service_in");
verify(mDialog).setText(SERVICE_STATE_VALUE_ID, inServiceText);
}
@@ -287,13 +254,11 @@
final int wcdmaDbm = 40;
final int wcdmaAsu = 40;
setupCellSignalStrength_lteWcdma(lteDbm, lteAsu, wcdmaDbm, wcdmaAsu);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
mController.initialize();
- final String signalStrengthString =
- mContext.getString(R.string.sim_signal_strength, lteDbm, lteAsu);
+ final String signalStrengthString = ResourcesUtils.getResourcesString(
+ mContext, "sim_signal_strength", lteDbm, lteAsu);
verify(mDialog, times(2)).setText(SIGNAL_STRENGTH_VALUE_ID, signalStrengthString);
}
@@ -304,13 +269,11 @@
final int cdmaDbm = 30;
final int cdmaAsu = 30;
setupCellSignalStrength_lteCdma(lteDbm, lteAsu, cdmaDbm, cdmaAsu);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
mController.initialize();
- final String signalStrengthString =
- mContext.getString(R.string.sim_signal_strength, lteDbm, lteAsu);
+ final String signalStrengthString = ResourcesUtils.getResourcesString(
+ mContext, "sim_signal_strength", lteDbm, lteAsu);
verify(mDialog, times(2)).setText(SIGNAL_STRENGTH_VALUE_ID, signalStrengthString);
}
@@ -318,19 +281,15 @@
public void initialize_updateVoiceOutOfServiceDataInService_shouldUpdateSignalStrengthTo50() {
when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
final int lteDbm = 50;
final int lteAsu = 50;
setupCellSignalStrength_lteOnly(lteDbm, lteAsu);
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
mController.initialize();
- final String signalStrengthString =
- mContext.getString(R.string.sim_signal_strength, lteDbm, lteAsu);
+ final String signalStrengthString = ResourcesUtils.getResourcesString(
+ mContext, "sim_signal_strength", lteDbm, lteAsu);
verify(mDialog, times(2)).setText(SIGNAL_STRENGTH_VALUE_ID, signalStrengthString);
}
@@ -362,7 +321,8 @@
mController.initialize();
- final String roamingOnString = mContext.getString(R.string.radioInfo_roaming_in);
+ final String roamingOnString = ResourcesUtils.getResourcesString(
+ mContext, "radioInfo_roaming_in");
verify(mDialog).setText(ROAMING_INFO_VALUE_ID, roamingOnString);
}
@@ -372,14 +332,15 @@
mController.initialize();
- final String roamingOffString = mContext.getString(R.string.radioInfo_roaming_not);
+ final String roamingOffString = ResourcesUtils.getResourcesString(
+ mContext, "radioInfo_roaming_not");
verify(mDialog).setText(ROAMING_INFO_VALUE_ID, roamingOffString);
}
@Test
public void initialize_doNotShowIccid_shouldRemoveIccidSetting() {
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL)).thenReturn(false);
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL, false);
mController.initialize();
@@ -389,9 +350,8 @@
@Test
public void initialize_doNotShowSignalStrength_shouldRemoveSignalStrengthSetting() {
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL))
- .thenReturn(false);
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL, false);
mController.initialize();
@@ -414,8 +374,7 @@
@Test
public void initialize_showIccid_shouldSetIccidToSetting() {
final String iccid = "12351351231241";
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL)).thenReturn(true);
+ mPersistableBundle.putBoolean(CarrierConfigManager.KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL, true);
doReturn(iccid).when(mTelephonyManager).getSimSerialNumber();
mController.initialize();
@@ -720,8 +679,8 @@
@Test
@Ignore
public void initialize_imsRegistered_shouldSetImsRegistrationStateSummaryToRegisterd() {
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)).thenReturn(true);
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, true);
when(mTelephonyManager.isImsRegistered(anyInt())).thenReturn(true);
mController.initialize();
@@ -733,8 +692,8 @@
@Test
@Ignore
public void initialize_imsNotRegistered_shouldSetImsRegistrationStateSummaryToNotRegisterd() {
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)).thenReturn(true);
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, true);
when(mTelephonyManager.isImsRegistered(anyInt())).thenReturn(false);
mController.initialize();
@@ -746,8 +705,8 @@
@Test
@Ignore
public void initialize_showImsRegistration_shouldNotRemoveImsRegistrationStateSetting() {
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)).thenReturn(true);
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, true);
mController.initialize();
@@ -757,8 +716,8 @@
@Test
@Ignore
public void initialize_doNotShowImsRegistration_shouldRemoveImsRegistrationStateSetting() {
- when(mPersistableBundle.getBoolean(
- CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)).thenReturn(false);
+ mPersistableBundle.putBoolean(
+ CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false);
mController.initialize();
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
similarity index 61%
rename from tests/robotests/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
rename to tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
index 5aa9f72..79c5db8 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
@@ -1,3 +1,18 @@
+/*
+ * 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.deviceinfo.storage;
import static com.google.common.truth.Truth.assertThat;
@@ -8,14 +23,15 @@
import android.os.storage.VolumeInfo;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class VolumeSizesLoaderTest {
@Test
public void getVolumeSize_getsValidSizes() throws Exception {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java b/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
similarity index 82%
rename from tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
rename to tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
index 2919edc..b807114 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsControllerTest.java
@@ -1,3 +1,18 @@
+/*
+ * 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.fuelgauge.batterysaver;
import static com.google.common.truth.Truth.assertThat;
@@ -9,13 +24,14 @@
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class BatterySaverScheduleRadioButtonsControllerTest {
private Context mContext;
private ContentResolver mResolver;
@@ -24,7 +40,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mSeekBarController = new BatterySaverScheduleSeekBarController(mContext);
mController = new BatterySaverScheduleRadioButtonsController(
mContext, mSeekBarController);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java b/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
similarity index 87%
rename from tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
index 0e7c312..8cfedf6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -21,13 +21,15 @@
import android.content.Context;
import android.provider.Settings;
import android.provider.Settings.Global;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class BatterySaverStickyPreferenceControllerTest {
private static final String PREF_KEY = "battery_saver_sticky";
@@ -37,7 +39,7 @@
@Before
public void setup() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new BatterySaverStickyPreferenceController(mContext, PREF_KEY);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java b/tests/unit/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
similarity index 95%
rename from tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
rename to tests/unit/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
index ad546f3..069f123 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -21,6 +21,8 @@
import android.os.Parcel;
import android.text.format.DateUtils;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -28,9 +30,8 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class AppInfoTest {
private static final String PACKAGE_NAME = "com.android.app";
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java b/tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
similarity index 94%
rename from tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
rename to tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
index 9b54fc7..4be2ae6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -22,13 +22,14 @@
import android.provider.Settings;
import android.text.format.DateUtils;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class BatteryTipPolicyTest {
private static final String BATTERY_TIP_CONSTANTS_VALUE = "battery_tip_enabled=true"
@@ -54,7 +55,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/OneHandedAppTapsExitPreferenceControllerTest.java b/tests/unit/src/com/android/settings/gestures/OneHandedAppTapsExitPreferenceControllerTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/gestures/OneHandedAppTapsExitPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/gestures/OneHandedAppTapsExitPreferenceControllerTest.java
index 28ce802..18738e9 100644
--- a/tests/robotests/src/com/android/settings/gestures/OneHandedAppTapsExitPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/gestures/OneHandedAppTapsExitPreferenceControllerTest.java
@@ -21,16 +21,16 @@
import android.content.Context;
import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.TogglePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class OneHandedAppTapsExitPreferenceControllerTest {
private static final String KEY = "gesture_app_taps_to_exit";
@@ -42,7 +42,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new OneHandedAppTapsExitPreferenceController(mContext, KEY);
mSwitchPreference = new SwitchPreference(mContext);
mSwitchPreference.setKey(KEY);
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardDatabaseHelperTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/CardDatabaseHelperTest.java
similarity index 89%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/CardDatabaseHelperTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/CardDatabaseHelperTest.java
index c908225..cf9b3c6 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardDatabaseHelperTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/CardDatabaseHelperTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -22,14 +22,15 @@
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class CardDatabaseHelperTest {
private Context mContext;
@@ -38,7 +39,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mCardDatabaseHelper = CardDatabaseHelper.getInstance(mContext);
mDatabase = mCardDatabaseHelper.getReadableDatabase();
}
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLookupTableTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLookupTableTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLookupTableTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLookupTableTest.java
index 36f9c96..a7acffc 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLookupTableTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardLookupTableTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -18,18 +18,19 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.homepage.contextualcards.ContextualCardLookupTable.ControllerRendererMapping;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
import java.util.ArrayList;
import java.util.List;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ContextualCardLookupTableTest {
private static final int UNSUPPORTED_CARD_TYPE = -99999;
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardsDiffCallbackTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardsDiffCallbackTest.java
similarity index 95%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardsDiffCallbackTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardsDiffCallbackTest.java
index 1e17a0b..3e7dadf 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardsDiffCallbackTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/ContextualCardsDiffCallbackTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -11,9 +11,8 @@
* 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
+ * limitations under the License.
*/
-
package com.android.settings.homepage.contextualcards;
import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE;
@@ -23,15 +22,16 @@
import android.net.Uri;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
import java.util.ArrayList;
import java.util.List;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ContextualCardsDiffCallbackTest {
private static final Uri TEST_SLICE_URI = Uri.parse("content://test/test");
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardTest.java
similarity index 90%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardTest.java
index b658822..0a039a9 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -18,13 +18,14 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.homepage.contextualcards.ContextualCard;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ConditionFooterContextualCardTest {
@Test(expected = IllegalArgumentException.class)
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardTest.java
similarity index 90%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardTest.java
index 275e96b..59ff550 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -18,13 +18,14 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.homepage.contextualcards.ContextualCard;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ConditionHeaderContextualCardTest {
@Test(expected = IllegalArgumentException.class)
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
similarity index 92%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
index 3f57228..a06afc8 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -21,13 +21,14 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.homepage.contextualcards.ContextualCard;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ConditionalContextualCardTest {
@Test(expected = IllegalArgumentException.class)
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSliceTest.java b/tests/unit/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSliceTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSliceTest.java
rename to tests/unit/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSliceTest.java
index 6f212df..a67d2e9 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSliceTest.java
+++ b/tests/unit/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSliceTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -11,9 +11,8 @@
* 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
+ * limitations under the License.
*/
-
package com.android.settings.homepage.contextualcards.slices;
import static com.google.common.truth.Truth.assertThat;
@@ -31,14 +30,14 @@
import androidx.slice.SliceMetadata;
import androidx.slice.SliceProvider;
import androidx.slice.widget.SliceLiveData;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class FaceSetupSliceTest {
private Context mContext;
@@ -48,7 +47,7 @@
public void setUp() {
// Set-up specs for SliceMetadata.
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
- mContext = spy(RuntimeEnvironment.application);
+ mContext = spy(ApplicationProvider.getApplicationContext());
mPackageManager = mock(PackageManager.class);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
}
diff --git a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
index ce47eb7..a344ab6 100644
--- a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
+++ b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
@@ -34,7 +34,8 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.settings.AirplaneModeEnabler;
+import com.android.settings.testutils.AirplaneModeRule;
+import com.android.settings.testutils.ResourcesUtils;
import org.junit.Before;
import org.junit.Rule;
@@ -47,24 +48,20 @@
@RunWith(AndroidJUnit4.class)
public class AirplaneSafeNetworksSliceTest {
- private static final String VIEW_AIRPLANE_SAFE_NETWORKS = "View airplane-safe networks";
- private static final String TURN_OFF_AIRPLANE_MODE = "Turn off Airplane Mode";
-
@Rule
public MockitoRule mMocks = MockitoJUnit.rule();
+ @Rule
+ public AirplaneModeRule mAirplaneModeRule = new AirplaneModeRule();
@Mock
private WifiManager mWifiManager;
private Context mContext;
- private AirplaneModeEnabler mAirplaneModeEnabler;
private AirplaneSafeNetworksSlice mAirplaneSafeNetworksSlice;
@Before
public void setUp() {
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
- mAirplaneModeEnabler =
- new AirplaneModeEnabler(mContext, null /* OnAirplaneModeChangedListener */);
// Set-up specs for SliceMetadata.
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
@@ -74,14 +71,14 @@
@Test
public void getSlice_airplaneModeOff_shouldBeNull() {
- mAirplaneModeEnabler.setAirplaneMode(false);
+ mAirplaneModeRule.setAirplaneMode(false);
assertThat(mAirplaneSafeNetworksSlice.getSlice()).isNull();
}
@Test
public void getSlice_wifiDisabled_shouldShowViewAirplaneSafeNetworks() {
- mAirplaneModeEnabler.setAirplaneMode(true);
+ mAirplaneModeRule.setAirplaneMode(true);
when(mWifiManager.isWifiEnabled()).thenReturn(false);
final Slice slice = mAirplaneSafeNetworksSlice.getSlice();
@@ -89,12 +86,13 @@
assertThat(slice).isNotNull();
final SliceItem sliceTitle =
SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
- assertThat(sliceTitle.getText()).isEqualTo(VIEW_AIRPLANE_SAFE_NETWORKS);
+ assertThat(sliceTitle.getText()).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "view_airplane_safe_networks"));
}
@Test
public void getSlice_wifiEnabled_shouldShowTurnOffAirplaneMode() {
- mAirplaneModeEnabler.setAirplaneMode(true);
+ mAirplaneModeRule.setAirplaneMode(true);
when(mWifiManager.isWifiEnabled()).thenReturn(true);
final Slice slice = mAirplaneSafeNetworksSlice.getSlice();
@@ -102,12 +100,13 @@
assertThat(slice).isNotNull();
final SliceItem sliceTitle =
SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
- assertThat(sliceTitle.getText()).isEqualTo(TURN_OFF_AIRPLANE_MODE);
+ assertThat(sliceTitle.getText()).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "turn_off_airplane_mode"));
}
@Test
public void onNotifyChange_viewAirplaneSafeNetworks_shouldSetWifiEnabled() {
- mAirplaneModeEnabler.setAirplaneMode(true);
+ mAirplaneModeRule.setAirplaneMode(true);
when(mWifiManager.isWifiEnabled()).thenReturn(false);
Intent intent = mAirplaneSafeNetworksSlice.getIntent();
@@ -118,12 +117,12 @@
@Test
public void onNotifyChange_turnOffAirplaneMode_shouldSetAirplaneModeOff() {
- mAirplaneModeEnabler.setAirplaneMode(true);
+ mAirplaneModeRule.setAirplaneMode(true);
when(mWifiManager.isWifiEnabled()).thenReturn(true);
Intent intent = mAirplaneSafeNetworksSlice.getIntent();
mAirplaneSafeNetworksSlice.onNotifyChange(intent);
- assertThat(mAirplaneModeEnabler.isAirplaneModeOn()).isFalse();
+ assertThat(mAirplaneModeRule.isAirplaneModeOn()).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java b/tests/unit/src/com/android/settings/network/EraseEuiccDataControllerTest.java
similarity index 60%
copy from tests/robotests/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
copy to tests/unit/src/com/android/settings/network/EraseEuiccDataControllerTest.java
index ecc2f2d..05b92a8 100644
--- a/tests/robotests/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/EraseEuiccDataControllerTest.java
@@ -14,37 +14,38 @@
* limitations under the License.
*/
-package com.android.settings.security;
+package com.android.settings.network;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
-public class CredentialManagementAppButtonsControllerTest {
+@RunWith(AndroidJUnit4.class)
+public class EraseEuiccDataControllerTest {
- private Context mContext;
- private CredentialManagementAppButtonsController mController;
+ private static final String ERASE_EUICC_DATA_PREFERENCE_KEY = "erase_euicc_data";
- private static final String PREF_KEY_CREDENTIAL_MANAGEMENT_APP = "certificate_management_app";
+ private EraseEuiccDataController mController;
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
- mController = new CredentialManagementAppButtonsController(
- mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
+ Context context = ApplicationProvider.getApplicationContext();
+ mController = new EraseEuiccDataController(context, ERASE_EUICC_DATA_PREFERENCE_KEY);
}
@Test
- public void getAvailabilityStatus_shouldAlwaysReturnAvailableUnsearchable() {
+ public void getAvailabilityStatus_byDefault_true() {
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
}
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
new file mode 100644
index 0000000..abbc2ec
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
@@ -0,0 +1,307 @@
+/*
+ * 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.Uri;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.slice.Slice;
+import androidx.slice.builders.GridRowBuilder;
+import androidx.slice.builders.GridRowBuilder.CellBuilder;
+import androidx.slice.builders.ListBuilder;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.Utils;
+import com.android.settings.slices.CustomSliceable;
+import com.android.settings.testutils.ResourcesUtils;
+import com.android.settings.wifi.slice.WifiSliceItem;
+import com.android.wifitrackerlib.WifiEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class ProviderModelSliceHelperTest {
+ private Context mContext;
+ private MockProviderModelSliceHelper mProviderModelSliceHelper;
+ private PersistableBundle mBundle;
+ private Network mNetwork;
+ private NetworkCapabilities mNetworkCapabilities;
+
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private CarrierConfigManager mCarrierConfigManager;
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private ServiceState mServiceState;
+ @Mock
+ private WifiSliceItem mWifiSliceItem1;
+ @Mock
+ private WifiSliceItem mWifiSliceItem2;
+ @Mock
+ private SubscriptionInfo mDefaultDataSubscriptionInfo;
+ @Mock
+ private Drawable mDrawableWithSignalStrength;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mBundle = new PersistableBundle();
+ mNetwork = new Network(anyInt());
+
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+ mCarrierConfigManager);
+ when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
+ when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
+ when(mConnectivityManager.getActiveNetwork()).thenReturn(mNetwork);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
+
+ TestCustomSliceable testCustomSliceable = new TestCustomSliceable();
+ mProviderModelSliceHelper = new MockProviderModelSliceHelper(mContext, testCustomSliceable);
+ }
+
+ @Test
+ public void createMessageGridRow_inputTheResourceId_verifyTitle() {
+ int messageResId = ResourcesUtils.getResourcesId(mContext, "string",
+ "non_carrier_network_unavailable");
+ CharSequence title = ResourcesUtils.getResourcesString(mContext,
+ "non_carrier_network_unavailable");
+
+ GridRowBuilder testGridRow = mProviderModelSliceHelper.createMessageGridRow(messageResId);
+ List<CellBuilder> cellItem = testGridRow.getCells();
+
+ assertThat(cellItem.get(0).getTitle()).isEqualTo(title);
+ }
+
+ @Test
+ public void getConnectedWifiItem_inputListInvolveOneConnectedWifiItem_verifyReturnItem() {
+ when(mWifiSliceItem1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
+ when(mWifiSliceItem2.getConnectedState()).thenReturn(
+ WifiEntry.CONNECTED_STATE_DISCONNECTED);
+ List<WifiSliceItem> wifiList = new ArrayList<>();
+ wifiList.add(mWifiSliceItem1);
+ wifiList.add(mWifiSliceItem2);
+
+ WifiSliceItem testItem = mProviderModelSliceHelper.getConnectedWifiItem(wifiList);
+
+ assertThat(testItem).isNotNull();
+ assertEquals(mWifiSliceItem1, testItem);
+ }
+
+ @Test
+ public void getConnectedWifiItem_inputListInvolveNoConnectedWifiItem_verifyReturnItem() {
+ when(mWifiSliceItem1.getConnectedState()).thenReturn(
+ WifiEntry.CONNECTED_STATE_DISCONNECTED);
+ when(mWifiSliceItem2.getConnectedState()).thenReturn(
+ WifiEntry.CONNECTED_STATE_DISCONNECTED);
+ List<WifiSliceItem> wifiList = new ArrayList<>();
+ wifiList.add(mWifiSliceItem1);
+ wifiList.add(mWifiSliceItem2);
+
+ WifiSliceItem testItem = mProviderModelSliceHelper.getConnectedWifiItem(wifiList);
+
+ assertThat(testItem).isNull();
+ }
+
+ @Test
+ public void getConnectedWifiItem_inputNull_verifyReturnItem() {
+ List<WifiSliceItem> wifiList = null;
+
+ WifiSliceItem testItem = mProviderModelSliceHelper.getConnectedWifiItem(wifiList);
+
+ assertThat(testItem).isNull();
+ }
+
+ @Test
+ public void createCarrierRow_hasDefaultDataSubscriptionId_verifyTitle() {
+ String expectDisplayName = "Name1";
+ int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
+ mDefaultDataSubscriptionInfo);
+ when(mDefaultDataSubscriptionInfo.getDisplayName()).thenReturn(expectDisplayName);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+ mBundle.putBoolean(CarrierConfigManager.KEY_INFLATE_SIGNAL_STRENGTH_BOOL, false);
+
+ ListBuilder.RowBuilder testRowBuild = mProviderModelSliceHelper.createCarrierRow();
+
+ assertThat(testRowBuild.getTitle()).isEqualTo(expectDisplayName);
+ }
+
+ @Test
+ public void isNoCarrierData_mobileDataOnAndNoData_returnTrue() {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+
+ assertThat(mProviderModelSliceHelper.isNoCarrierData()).isTrue();
+ }
+
+ @Test
+ public void isNoCarrierData_mobileDataOffAndOutOfService_returnTrue() {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(false);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
+
+ assertThat(mProviderModelSliceHelper.isNoCarrierData()).isTrue();
+ }
+
+ @Test
+ public void isNoCarrierData_mobileDataOnAndDataConnected_returnFalse() {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_CONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+
+ assertThat(mProviderModelSliceHelper.isNoCarrierData()).isFalse();
+ }
+
+ @Test
+ public void isNoCarrierData_mobileDataOffAndVoiceIsInService_returnFalse() {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(false);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+
+ assertThat(mProviderModelSliceHelper.isNoCarrierData()).isFalse();
+ }
+
+ @Test
+ public void getMobileDrawable_noCarrierData_getMobileDrawable() throws Throwable {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(false);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
+ int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
+ mDefaultDataSubscriptionInfo);
+ when(mConnectivityManager.getActiveNetwork()).thenReturn(null);
+ Drawable expectDrawable = mock(Drawable.class);
+
+ assertThat(mProviderModelSliceHelper.getMobileDrawable(expectDrawable)).isEqualTo(
+ expectDrawable);
+ }
+
+ @Test
+ public void getMobileDrawable_hasCarrierDataAndDataIsOnCellular_getMobileDrawable()
+ throws Throwable {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_CONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+ Drawable drawable = mock(Drawable.class);
+ int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
+ mDefaultDataSubscriptionInfo);
+ addNetworkTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
+
+ assertThat(mProviderModelSliceHelper.getMobileDrawable(drawable)).isEqualTo(
+ mDrawableWithSignalStrength);
+
+ verify(mDrawableWithSignalStrength).setTint(Utils.getColorAccentDefaultColor(mContext));
+ }
+
+ @Test
+ public void getMobileDrawable_hasCarrierDataAndDataIsOnWifi_getMobileDrawable()
+ throws Throwable {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_CONNECTED);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+ Drawable drawable = mock(Drawable.class);
+ int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
+ mDefaultDataSubscriptionInfo);
+ addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);
+
+ assertThat(mProviderModelSliceHelper.getMobileDrawable(drawable)).isEqualTo(
+ mDrawableWithSignalStrength);
+ }
+
+ private void addNetworkTransportType(int networkType) {
+ mNetworkCapabilities = new NetworkCapabilities().addTransportType(networkType);
+ when(mConnectivityManager.getNetworkCapabilities(mNetwork)).thenReturn(
+ mNetworkCapabilities);
+ }
+
+ private class TestCustomSliceable implements CustomSliceable {
+ TestCustomSliceable() {
+ }
+
+ @Override
+ public Slice getSlice() {
+ return null;
+ }
+
+ @Override
+ public Uri getUri() {
+ return Uri.parse("content://android.settings.slices/action/provider_model");
+ }
+
+ @Override
+ public Intent getIntent() {
+ return new Intent();
+ }
+ }
+
+ private class MockProviderModelSliceHelper extends ProviderModelSliceHelper {
+ MockProviderModelSliceHelper(Context context, CustomSliceable sliceable) {
+ super(context, sliceable);
+ }
+
+ @Override
+ public Drawable getDrawableWithSignalStrength() {
+ return mDrawableWithSignalStrength;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
new file mode 100644
index 0000000..f9450db
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
@@ -0,0 +1,365 @@
+/*
+ * 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;
+
+import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.net.ConnectivityManager;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.slice.Slice;
+import androidx.slice.SliceProvider;
+import androidx.slice.builders.GridRowBuilder;
+import androidx.slice.builders.ListBuilder;
+import androidx.slice.builders.SliceAction;
+import androidx.slice.widget.SliceLiveData;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.Utils;
+import com.android.settings.network.telephony.NetworkProviderWorker;
+import com.android.settings.testutils.ResourcesUtils;
+import com.android.settings.wifi.slice.WifiSliceItem;
+import com.android.wifitrackerlib.WifiEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class ProviderModelSliceTest {
+ private static final Uri PROVIDER_MODEL_SLICE_URI =
+ Uri.parse("content://com.android.settings.slices/action/provider_model");
+ private static final int MOCK_SLICE_LEVEL = 3;
+
+ private Context mContext;
+ private MockProviderModelSlice mMockProviderModelSlice;
+ List<WifiSliceItem> mWifiList = new ArrayList<>();
+ private ListBuilder mListBuilder;
+ private MockNetworkProviderWorker mMockNetworkProviderWorker;
+
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private ProviderModelSliceHelper mProviderModelSliceHelper;
+ @Mock
+ private WifiSliceItem mMockWifiSliceItem1;
+ @Mock
+ private WifiSliceItem mMockWifiSliceItem2;
+ @Mock
+ private WifiSliceItem mMockWifiSliceItem3;
+ @Mock
+ ListBuilder.RowBuilder mMockCarrierRowBuild;
+ @Mock
+ ListBuilder.HeaderBuilder mMockHeader;
+ @Mock
+ GridRowBuilder mMockGridRowBuilderNonCarrierNetworkUnavailable;
+ @Mock
+ GridRowBuilder mMockGridRowBuilderAllNetworkUnavailable;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+
+
+ // Set-up specs for SliceMetadata.
+ SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
+ mMockNetworkProviderWorker = spy(new MockNetworkProviderWorker(mContext,
+ PROVIDER_MODEL_SLICE_URI));
+ mMockProviderModelSlice = new MockProviderModelSlice(mContext, mMockNetworkProviderWorker);
+ mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI,
+ ListBuilder.INFINITY).setAccentColor(-1));
+ when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn(
+ mListBuilder);
+ when(mProviderModelSliceHelper.getSubscriptionManager()).thenReturn(mSubscriptionManager);
+
+ mWifiList = new ArrayList<>();
+ mMockNetworkProviderWorker.updateSelfResults(mWifiList);
+
+ mockBuilder();
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_noWorkerAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() {
+ mWifiList.clear();
+ mMockProviderModelSlice = new MockProviderModelSlice(mContext, null);
+ mockHelperCondition(false, false, false, null);
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(1)).setHeader(mMockHeader);
+ verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_noWifiAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() {
+ mWifiList.clear();
+ mMockNetworkProviderWorker.updateSelfResults(null);
+ mockHelperCondition(false, false, false, null);
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(1)).setHeader(mMockHeader);
+ verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_noWifiAndHasCarrierNoData_oneCarrierOneGridRowWithAllNetworkUnavailable() {
+ mWifiList.clear();
+ mMockNetworkProviderWorker.updateSelfResults(null);
+ mockHelperCondition(false, true, true, null);
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
+ verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_noWifiAndNoCarrier_oneCarrierOneGridRowWithNonCarrierNetworkUnavailable() {
+ mWifiList.clear();
+ mMockProviderModelSlice = new MockProviderModelSlice(mContext, null);
+ mockHelperCondition(false, true, false, null);
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
+ verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderNonCarrierNetworkUnavailable);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_haveTwoWifiAndOneCarrier_getCarrierAndTwoWiFi() {
+ mWifiList.clear();
+ mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
+ WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
+ mWifiList.add(mMockWifiSliceItem1);
+ mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
+ WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
+ mWifiList.add(mMockWifiSliceItem2);
+ mMockNetworkProviderWorker.updateSelfResults(mWifiList);
+ mockHelperCondition(false, true, false, mWifiList.get(0));
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
+ verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class));
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getTwoRow() {
+ mWifiList.clear();
+ mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
+ WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
+ mWifiList.add(mMockWifiSliceItem1);
+ mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
+ WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
+ mWifiList.add(mMockWifiSliceItem2);
+ mockWifiItemCondition(mMockWifiSliceItem3, "wifi3", "wifi3",
+ WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi3_key", true);
+ mWifiList.add(mMockWifiSliceItem3);
+ mMockNetworkProviderWorker.updateSelfResults(mWifiList);
+ mockHelperCondition(false, false, false, mWifiList.get(0));
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class));
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getTwoRow() {
+ mWifiList.clear();
+ mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
+ WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
+ mWifiList.add(mMockWifiSliceItem1);
+ mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
+ WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
+ mWifiList.add(mMockWifiSliceItem2);
+ mMockNetworkProviderWorker.updateSelfResults(mWifiList);
+ mockHelperCondition(false, false, false, null);
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ verify(mListBuilder, times(2)).addRow(any(ListBuilder.RowBuilder.class));
+ }
+
+ @Test
+ public void providerModelSlice_hasCorrectUri() {
+ assertThat(mMockProviderModelSlice.getUri()).isEqualTo(PROVIDER_MODEL_SLICE_URI);
+ }
+
+ private void mockHelperCondition(boolean airplaneMode, boolean hasCarrier,
+ boolean isNoCarrierData, WifiSliceItem connectedWifiItem) {
+ when(mProviderModelSliceHelper.isAirplaneModeEnabled()).thenReturn(airplaneMode);
+ when(mProviderModelSliceHelper.hasCarrier()).thenReturn(hasCarrier);
+ when(mProviderModelSliceHelper.isNoCarrierData()).thenReturn(isNoCarrierData);
+ when(mProviderModelSliceHelper.getConnectedWifiItem(any())).thenReturn(connectedWifiItem);
+ }
+
+ private void mockWifiItemCondition(WifiSliceItem mockWifiItem, String title, String summary,
+ int connectedState, String key, boolean shouldEditBeforeConnect) {
+ when(mockWifiItem.getTitle()).thenReturn(title);
+ when(mockWifiItem.getSummary()).thenReturn(summary);
+ when(mockWifiItem.getConnectedState()).thenReturn(connectedState);
+ when(mockWifiItem.getLevel()).thenReturn(MOCK_SLICE_LEVEL);
+ when(mockWifiItem.getKey()).thenReturn(key);
+ when(mockWifiItem.shouldEditBeforeConnect()).thenReturn(shouldEditBeforeConnect);
+ }
+
+ private void mockBuilder() {
+ SliceAction mockSliceAction = getPrimarySliceAction();
+ when(mMockHeader.getTitle()).thenReturn("mockHeader");
+ when(mMockHeader.getPrimaryAction()).thenReturn(mockSliceAction);
+ when(mProviderModelSliceHelper.createHeader()).thenReturn(mMockHeader);
+
+ int resId = ResourcesUtils.getResourcesId(mContext, "string",
+ "non_carrier_network_unavailable");
+ when(mProviderModelSliceHelper.createMessageGridRow(resId)).thenReturn(
+ mMockGridRowBuilderNonCarrierNetworkUnavailable);
+ resId = ResourcesUtils.getResourcesId(mContext, "string",
+ "all_network_unavailable");
+ when(mProviderModelSliceHelper.createMessageGridRow(resId)).thenReturn(
+ mMockGridRowBuilderAllNetworkUnavailable);
+
+ when(mMockCarrierRowBuild.getTitle()).thenReturn("mockRow");
+ when(mMockCarrierRowBuild.getPrimaryAction()).thenReturn(mockSliceAction);
+ when(mProviderModelSliceHelper.createCarrierRow()).thenReturn(mMockCarrierRowBuild);
+ }
+
+ private SliceAction getPrimarySliceAction() {
+ return SliceAction.createDeeplink(
+ getPrimaryAction(),
+ Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT)),
+ ListBuilder.ICON_IMAGE,
+ ResourcesUtils.getResourcesString(mContext, "summary_placeholder"));
+ }
+
+ private PendingIntent getPrimaryAction() {
+ final Intent intent = new Intent("android.settings.NETWORK_PROVIDER_SETTINGS")
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */,
+ intent, PendingIntent.FLAG_IMMUTABLE /* flags */);
+ }
+
+ public class MockNetworkProviderWorker extends NetworkProviderWorker {
+ MockNetworkProviderWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ public void updateSelfResults(List<WifiSliceItem> results) {
+ this.updateResults(results);
+ }
+ }
+
+ public class MockProviderModelSlice extends ProviderModelSlice {
+ private MockNetworkProviderWorker mNetworkProviderWorker;
+
+ MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) {
+ super(context);
+ mNetworkProviderWorker = networkProviderWorker;
+ }
+
+ @Override
+ ProviderModelSliceHelper getHelper() {
+ return mProviderModelSliceHelper;
+ }
+
+ @Override
+ NetworkProviderWorker getWorker() {
+ return mNetworkProviderWorker;
+ }
+ }
+
+ @Test
+ public void onNotifyChange_intentToggleActionOn_shouldSetCarrierNetworkEnabledTrue() {
+ Intent intent = mMockProviderModelSlice.getBroadcastIntent(mContext).getIntent();
+ intent.putExtra(EXTRA_TOGGLE_STATE, true);
+
+ mMockProviderModelSlice.onNotifyChange(intent);
+
+ verify(mMockNetworkProviderWorker).setCarrierNetworkEnabled(true);
+ }
+
+ @Test
+ public void onNotifyChange_intentToggleActionOff_shouldSetCarrierNetworkEnabledFalse() {
+ Intent intent = mMockProviderModelSlice.getBroadcastIntent(mContext).getIntent();
+ intent.putExtra(EXTRA_TOGGLE_STATE, false);
+
+ mMockProviderModelSlice.onNotifyChange(intent);
+
+ verify(mMockNetworkProviderWorker).setCarrierNetworkEnabled(false);
+ }
+
+ @Test
+ public void onNotifyChange_intentPrimaryAction_shouldConnectCarrierNetwork() {
+ Intent intent = mMockProviderModelSlice.getBroadcastIntent(mContext).getIntent();
+
+ mMockProviderModelSlice.onNotifyChange(intent);
+
+ verify(mMockNetworkProviderWorker).connectCarrierNetwork();
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
new file mode 100644
index 0000000..27dd2aa
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
@@ -0,0 +1,673 @@
+/*
+ * 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;
+
+import static android.telephony.SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
+import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GOOD;
+import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GREAT;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.os.Looper;
+import android.provider.Settings;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.Utils;
+import com.android.settings.network.SubscriptionsPreferenceController.SubsPrefCtrlInjector;
+import com.android.settings.testutils.ResourcesUtils;
+import com.android.settings.wifi.WifiPickerTrackerHelper;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class SubscriptionsPreferenceControllerTest {
+ private static final String KEY = "preference_group";
+
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private TelephonyManager mTelephonyManagerForSub;
+ @Mock
+ private Network mActiveNetwork;
+ @Mock
+ private Lifecycle mLifecycle;
+ @Mock
+ private LifecycleOwner mLifecycleOwner;
+ @Mock
+ private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+ private LifecycleRegistry mLifecycleRegistry;
+ private int mOnChildUpdatedCount;
+ private Context mContext;
+ private SubscriptionsPreferenceController.UpdateListener mUpdateListener;
+ private PreferenceCategory mPreferenceCategory;
+ private PreferenceScreen mPreferenceScreen;
+ private PreferenceManager mPreferenceManager;
+ private NetworkCapabilities mNetworkCapabilities;
+
+ private FakeSubscriptionsPreferenceController mController;
+ private static SubsPrefCtrlInjector sInjector;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ mLifecycleRegistry = new LifecycleRegistry(mLifecycleOwner);
+
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
+ when(mConnectivityManager.getActiveNetwork()).thenReturn(mActiveNetwork);
+ when(mConnectivityManager.getNetworkCapabilities(mActiveNetwork))
+ .thenReturn(mNetworkCapabilities);
+ when(mLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry);
+
+ mPreferenceManager = new PreferenceManager(mContext);
+ mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
+ mPreferenceScreen.setInitialExpandedChildrenCount(3);
+ mPreferenceCategory = new PreferenceCategory(mContext);
+ mPreferenceCategory.setKey(KEY);
+ mPreferenceCategory.setOrderingAsAdded(true);
+ mPreferenceScreen.addPreference(mPreferenceCategory);
+
+ mOnChildUpdatedCount = 0;
+ mUpdateListener = () -> mOnChildUpdatedCount++;
+ sInjector = spy(new SubsPrefCtrlInjector());
+ initializeMethod(true, 1, 1, 1, false, false);
+ mController = new FakeSubscriptionsPreferenceController(mContext, mLifecycle,
+ mUpdateListener, KEY, 5);
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);
+ }
+
+ @After
+ public void tearDown() {
+ SubscriptionUtil.setActiveSubscriptionsForTesting(null);
+ }
+
+ @Test
+ public void isAvailable_oneSubscription_availableFalse() {
+ setupMockSubscriptions(1);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_oneSubAndProviderOn_availableTrue() {
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ setupMockSubscriptions(1);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_twoSubscriptions_availableTrue() {
+ setupMockSubscriptions(2);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_fiveSubscriptions_availableTrue() {
+ doReturn(true).when(sInjector).canSubscriptionBeDisplayed(mContext, 0);
+ setupMockSubscriptions(5);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_airplaneModeOn_availableFalse() {
+ setupMockSubscriptions(2);
+
+ assertThat(mController.isAvailable()).isTrue();
+
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onAirplaneModeChanged_airplaneModeTurnedOn_eventFired() {
+ setupMockSubscriptions(2);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mController.isAvailable()).isTrue();
+
+ final int updateCountBeforeModeChange = mOnChildUpdatedCount;
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
+
+ mController.onAirplaneModeChanged(true);
+
+ assertThat(mController.isAvailable()).isFalse();
+ assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeModeChange + 1);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onAirplaneModeChanged_airplaneModeTurnedOff_eventFired() {
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
+ setupMockSubscriptions(2);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+ assertThat(mController.isAvailable()).isFalse();
+
+ final int updateCountBeforeModeChange = mOnChildUpdatedCount;
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);
+
+ mController.onAirplaneModeChanged(true);
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeModeChange + 1);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSubscriptionsChanged_countBecameTwo_eventFired() {
+ final List<SubscriptionInfo> subs = setupMockSubscriptions(2);
+ SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 1));
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mController.isAvailable()).isFalse();
+
+ final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
+ SubscriptionUtil.setActiveSubscriptionsForTesting(subs);
+
+ mController.onSubscriptionsChanged();
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSubscriptionsChanged_countBecameOne_eventFiredAndPrefsRemoved() {
+ final List<SubscriptionInfo> subs = setupMockSubscriptions(2);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+
+ final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
+ SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 1));
+
+ mController.onSubscriptionsChanged();
+
+ assertThat(mController.isAvailable()).isFalse();
+ assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSubscriptionsChanged_subscriptionReplaced_preferencesChanged() {
+ final List<SubscriptionInfo> subs = setupMockSubscriptions(3);
+
+ // Start out with only sub1 and sub2.
+ SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 2));
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub2");
+ assertThat(mPreferenceCategory.getPreference(1).getTitle()).isEqualTo("sub1");
+
+ // Now replace sub2 with sub3, and make sure the old preference was removed and the new
+ // preference was added.
+ final int updateCountBeforeSubscriptionChange = mOnChildUpdatedCount;
+ SubscriptionUtil.setActiveSubscriptionsForTesting(Arrays.asList(subs.get(0), subs.get(2)));
+ mController.onSubscriptionsChanged();
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mOnChildUpdatedCount).isEqualTo(updateCountBeforeSubscriptionChange + 1);
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub3");
+ assertThat(mPreferenceCategory.getPreference(1).getTitle()).isEqualTo("sub1");
+ }
+
+ @Test
+ public void getSummary_twoSubsOneDefaultForEverythingDataActive() {
+ setupMockSubscriptions(2);
+
+ doReturn(11).when(sInjector).getDefaultSmsSubscriptionId();
+ doReturn(11).when(sInjector).getDefaultVoiceSubscriptionId();
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ doReturn(true).when(sInjector).isActiveCellularNetwork(mContext);
+
+ assertThat(mController.getSummary(11, true)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "default_for_calls_and_sms")
+ + System.lineSeparator()
+ + ResourcesUtils.getResourcesString(mContext, "mobile_data_active"));
+
+ assertThat(mController.getSummary(22, false)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "subscription_available"));
+ }
+
+ @Test
+ public void getSummary_twoSubsOneDefaultForEverythingDataNotActive() {
+ setupMockSubscriptions(2, 1, true);
+
+ doReturn(1).when(sInjector).getDefaultSmsSubscriptionId();
+ doReturn(1).when(sInjector).getDefaultVoiceSubscriptionId();
+
+ assertThat(mController.getSummary(1, true)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "default_for_calls_and_sms")
+ + System.lineSeparator()
+ + ResourcesUtils.getResourcesString(mContext, "default_for_mobile_data"));
+
+ assertThat(mController.getSummary(2, false)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "subscription_available"));
+ }
+
+ @Test
+ public void getSummary_twoSubsOneDefaultForEverythingDataDisabled() {
+ setupMockSubscriptions(2);
+
+ doReturn(1).when(sInjector).getDefaultSmsSubscriptionId();
+ doReturn(1).when(sInjector).getDefaultVoiceSubscriptionId();
+
+ assertThat(mController.getSummary(1, true)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "default_for_calls_and_sms")
+ + System.lineSeparator()
+ + ResourcesUtils.getResourcesString(mContext, "mobile_data_off"));
+
+ assertThat(mController.getSummary(2, false)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "subscription_available"));
+ }
+
+ @Test
+ public void getSummary_twoSubsOneForCallsAndDataOneForSms() {
+ setupMockSubscriptions(2, 1, true);
+
+ doReturn(2).when(sInjector).getDefaultSmsSubscriptionId();
+ doReturn(1).when(sInjector).getDefaultVoiceSubscriptionId();
+
+ assertThat(mController.getSummary(1, true)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "default_for_calls")
+ + System.lineSeparator()
+ + ResourcesUtils.getResourcesString(mContext, "default_for_mobile_data"));
+
+ assertThat(mController.getSummary(2, false)).isEqualTo(
+ ResourcesUtils.getResourcesString(mContext, "default_for_sms"));
+ }
+
+ @Test
+ @UiThreadTest
+ public void setIcon_greatSignal_correctLevels() {
+ final List<SubscriptionInfo> subs = setupMockSubscriptions(2, 1, true);
+ setMockSubSignalStrength(subs, 0, SIGNAL_STRENGTH_GREAT);
+ setMockSubSignalStrength(subs, 1, SIGNAL_STRENGTH_GREAT);
+ final Preference pref = new Preference(mContext);
+ final Drawable greatDrawWithoutCutOff = mock(Drawable.class);
+ doReturn(greatDrawWithoutCutOff).when(sInjector)
+ .getIcon(mContext, 4, NUM_SIGNAL_STRENGTH_BINS, true);
+
+ mController.setIcon(pref, 1, true /* isDefaultForData */);
+ assertThat(pref.getIcon()).isEqualTo(greatDrawWithoutCutOff);
+
+ final Drawable greatDrawWithCutOff = mock(Drawable.class);
+ doReturn(greatDrawWithCutOff).when(sInjector)
+ .getIcon(mContext, 4, NUM_SIGNAL_STRENGTH_BINS, true);
+ mController.setIcon(pref, 2, false /* isDefaultForData */);
+ assertThat(pref.getIcon()).isEqualTo(greatDrawWithCutOff);
+ }
+
+ @Test
+ @UiThreadTest
+ public void displayPreference_providerAndHasSim_showPreference() {
+ final List<SubscriptionInfo> sub = setupMockSubscriptions(1);
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(sub.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub1");
+ }
+
+ @Test
+ @UiThreadTest
+ public void displayPreference_providerAndHasMultiSim_showDataSubPreference() {
+ final List<SubscriptionInfo> sub = setupMockSubscriptions(2);
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(sub.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub1");
+ }
+
+ @Test
+ @UiThreadTest
+ public void displayPreference_providerAndNoSim_noPreference() {
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(null).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onAirplaneModeChanged_providerAndHasSim_noPreference() {
+ setupMockSubscriptions(1);
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
+
+ mController.onAirplaneModeChanged(true);
+
+ assertThat(mController.isAvailable()).isFalse();
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ @UiThreadTest
+ public void dataSubscriptionChanged_providerAndHasMultiSim_showSubId1Preference() {
+ final List<SubscriptionInfo> sub = setupMockSubscriptions(2);
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(sub.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+ Intent intent = new Intent(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+ mController.mDataSubscriptionChangedReceiver.onReceive(mContext, intent);
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub1");
+ }
+
+ @Test
+ @UiThreadTest
+ public void dataSubscriptionChanged_providerAndHasMultiSim_showSubId2Preference() {
+ final List<SubscriptionInfo> sub = setupMockSubscriptions(2);
+ final int subId = sub.get(0).getSubscriptionId();
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(sub.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+ Intent intent = new Intent(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub1");
+
+ doReturn(sub.get(1)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+
+ mController.mDataSubscriptionChangedReceiver.onReceive(mContext, intent);
+
+ assertThat(mController.isAvailable()).isTrue();
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+ assertThat(mPreferenceCategory.getPreference(0).getTitle()).isEqualTo("sub2");
+ }
+
+ @Test
+ @UiThreadTest
+ public void getIcon_cellularIsActive_iconColorIsAccentDefaultColor() {
+ final List<SubscriptionInfo> sub = setupMockSubscriptions(1);
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(sub.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+ Drawable icon = mock(Drawable.class);
+ doReturn(icon).when(sInjector).getIcon(any(), anyInt(), anyInt(), eq(false));
+ setupGetIconConditions(sub.get(0).getSubscriptionId(), true, true,
+ TelephonyManager.DATA_CONNECTED, ServiceState.STATE_IN_SERVICE);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+
+ verify(icon).setTint(Utils.getColorAccentDefaultColor(mContext));
+ }
+
+ @Test
+ @UiThreadTest
+ public void getIcon_dataStateConnectedAndMobileDataOn_iconIsSignalIcon() {
+ final List<SubscriptionInfo> subs = setupMockSubscriptions(1);
+ final int subId = subs.get(0).getSubscriptionId();
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(subs.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+ Drawable icon = mock(Drawable.class);
+ doReturn(icon).when(sInjector).getIcon(any(), anyInt(), anyInt(), eq(false));
+ setupGetIconConditions(subId, false, true,
+ TelephonyManager.DATA_CONNECTED, ServiceState.STATE_IN_SERVICE);
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+ Drawable actualIcon = mPreferenceCategory.getPreference(0).getIcon();
+
+ assertThat(icon).isEqualTo(actualIcon);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getIcon_voiceInServiceAndMobileDataOff_iconIsSignalIcon() {
+ final List<SubscriptionInfo> subs = setupMockSubscriptions(1);
+ final int subId = subs.get(0).getSubscriptionId();
+ doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(subs.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
+ Drawable icon = mock(Drawable.class);
+ doReturn(icon).when(sInjector).getIcon(any(), anyInt(), anyInt(), eq(false));
+
+ setupGetIconConditions(subId, false, false,
+ TelephonyManager.DATA_DISCONNECTED, ServiceState.STATE_IN_SERVICE);
+
+ mController.onResume();
+ mController.displayPreference(mPreferenceScreen);
+ Drawable actualIcon = mPreferenceCategory.getPreference(0).getIcon();
+ doReturn(TelephonyManager.DATA_CONNECTED).when(mTelephonyManagerForSub).getDataState();
+
+ assertThat(icon).isEqualTo(actualIcon);
+ }
+
+ @Test
+ public void connectCarrierNetwork_isDataEnabled_helperConnect() {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(true);
+ mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);
+
+ mController.connectCarrierNetwork();
+
+ verify(mWifiPickerTrackerHelper).connectCarrierNetwork(any());
+ }
+
+ @Test
+ public void connectCarrierNetwork_isNotDataEnabled_helperNeverConnect() {
+ when(mTelephonyManager.isDataEnabled()).thenReturn(false);
+ mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);
+
+ mController.connectCarrierNetwork();
+
+ verify(mWifiPickerTrackerHelper, never()).connectCarrierNetwork(any());
+ }
+
+ private void setupGetIconConditions(int subId, boolean isActiveCellularNetwork,
+ boolean isDataEnable, int dataState, int servicestate) {
+ doReturn(mTelephonyManagerForSub).when(mTelephonyManager).createForSubscriptionId(subId);
+ doReturn(isActiveCellularNetwork).when(sInjector).isActiveCellularNetwork(mContext);
+ doReturn(isDataEnable).when(mTelephonyManagerForSub).isDataEnabled();
+ doReturn(dataState).when(mTelephonyManagerForSub).getDataState();
+ ServiceState ss = mock(ServiceState.class);
+ doReturn(ss).when(mTelephonyManagerForSub).getServiceState();
+ doReturn(servicestate).when(ss).getState();
+ }
+
+ private List<SubscriptionInfo> setupMockSubscriptions(int count) {
+ return setupMockSubscriptions(count, 0, true);
+ }
+
+ /** Helper method to setup several mock active subscriptions. The generated subscription id's
+ * start at 1.
+ *
+ * @param count How many subscriptions to create
+ * @param defaultDataSubId The subscription id of the default data subscription - pass
+ * INVALID_SUBSCRIPTION_ID if there should not be one
+ * @param mobileDataEnabled Whether mobile data should be considered enabled for the default
+ * data subscription
+ */
+ private List<SubscriptionInfo> setupMockSubscriptions(int count, int defaultDataSubId,
+ boolean mobileDataEnabled) {
+ if (defaultDataSubId != INVALID_SUBSCRIPTION_ID) {
+ when(sInjector.getDefaultDataSubscriptionId()).thenReturn(defaultDataSubId);
+ }
+ final ArrayList<SubscriptionInfo> infos = new ArrayList<>();
+ for (int i = 0; i < count; i++) {
+ final int subscriptionId = i + 1;
+ final SubscriptionInfo info = mock(SubscriptionInfo.class);
+ final TelephonyManager mgrForSub = mock(TelephonyManager.class);
+ final SignalStrength signalStrength = mock(SignalStrength.class);
+
+ if (subscriptionId == defaultDataSubId) {
+ when(mgrForSub.isDataEnabled()).thenReturn(mobileDataEnabled);
+ }
+ when(info.getSubscriptionId()).thenReturn(subscriptionId);
+ when(info.getDisplayName()).thenReturn("sub" + (subscriptionId));
+ doReturn(mgrForSub).when(mTelephonyManager).createForSubscriptionId(eq(subscriptionId));
+ when(mgrForSub.getSignalStrength()).thenReturn(signalStrength);
+ when(signalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_GOOD);
+ doReturn(true).when(sInjector).canSubscriptionBeDisplayed(mContext, subscriptionId);
+ infos.add(info);
+ }
+ SubscriptionUtil.setActiveSubscriptionsForTesting(infos);
+ return infos;
+ }
+
+ /**
+ * Helper method to set the signal strength returned for a mock subscription
+ * @param subs The list of subscriptions
+ * @param index The index in of the subscription in |subs| to change
+ * @param level The signal strength level to return for the subscription. Pass -1 to force
+ * return of a null SignalStrength object for the subscription.
+ */
+ private void setMockSubSignalStrength(List<SubscriptionInfo> subs, int index, int level) {
+ final int subId = subs.get(index).getSubscriptionId();
+ doReturn(mTelephonyManagerForSub).when(mTelephonyManager).createForSubscriptionId(subId);
+ if (level == -1) {
+ when(mTelephonyManagerForSub.getSignalStrength()).thenReturn(null);
+ } else {
+ final SignalStrength signalStrength = mock(SignalStrength.class);
+ doReturn(signalStrength).when(mTelephonyManagerForSub).getSignalStrength();
+ when(signalStrength.getLevel()).thenReturn(level);
+ }
+ }
+
+ private void initializeMethod(boolean isSubscriptionCanBeDisplayed,
+ int defaultSmsSubscriptionId, int defaultVoiceSubscriptionId,
+ int defaultDataSubscriptionId, boolean isActiveCellularNetwork,
+ boolean isProviderModelEnabled) {
+ doReturn(isSubscriptionCanBeDisplayed)
+ .when(sInjector).canSubscriptionBeDisplayed(mContext, eq(anyInt()));
+ doReturn(defaultSmsSubscriptionId).when(sInjector).getDefaultSmsSubscriptionId();
+ doReturn(defaultVoiceSubscriptionId).when(sInjector).getDefaultVoiceSubscriptionId();
+ doReturn(defaultDataSubscriptionId).when(sInjector).getDefaultDataSubscriptionId();
+ doReturn(isActiveCellularNetwork).when(sInjector).isActiveCellularNetwork(mContext);
+ doReturn(isProviderModelEnabled).when(sInjector).isProviderModelEnabled(mContext);
+ doReturn(mock(Drawable.class))
+ .when(sInjector).getIcon(any(), anyInt(), anyInt(), eq(false));
+ }
+
+ private static class FakeSubscriptionsPreferenceController
+ extends SubscriptionsPreferenceController {
+
+ /**
+ * @param context the context for the UI where we're placing these preferences
+ * @param lifecycle for listening to lifecycle events for the UI
+ * @param updateListener called to let our parent controller know that our
+ * availability has
+ * changed, or that one or more of the preferences we've placed
+ * in the
+ * PreferenceGroup has changed
+ * @param preferenceGroupKey the key used to lookup the PreferenceGroup where Preferences
+ * will
+ * be placed
+ * @param startOrder the order that should be given to the first Preference
+ * placed into
+ * the PreferenceGroup; the second will use startOrder+1, third
+ * will
+ * use startOrder+2, etc. - this is useful for when the parent
+ * wants
+ * to have other preferences in the same PreferenceGroup and wants
+ */
+ FakeSubscriptionsPreferenceController(Context context, Lifecycle lifecycle,
+ UpdateListener updateListener, String preferenceGroupKey, int startOrder) {
+ super(context, lifecycle, updateListener, preferenceGroupKey, startOrder);
+ }
+
+ @Override
+ protected SubsPrefCtrlInjector createSubsPrefCtrlInjector() {
+ return sInjector;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/ims/MockVtQueryImsState.java b/tests/unit/src/com/android/settings/network/ims/MockVtQueryImsState.java
new file mode 100644
index 0000000..0949f1c
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/ims/MockVtQueryImsState.java
@@ -0,0 +1,104 @@
+/*
+ * 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.ims;
+
+import android.content.Context;
+import android.telephony.ims.ImsException;
+
+/**
+ * Controller class for mock VT status
+ */
+public class MockVtQueryImsState extends VtQueryImsState {
+
+ private Boolean mIsTtyOnVolteEnabled;
+ private Boolean mIsEnabledOnPlatform;
+ private Boolean mIsProvisionedOnDevice;
+ private Boolean mIsEnabledByUser;
+ private Boolean mIsServiceStateReady;
+
+ /**
+ * Constructor
+ *
+ * @param context {@link Context}
+ * @param subId subscription's id
+ */
+ public MockVtQueryImsState(Context context, int subId) {
+ super(context, subId);
+ }
+
+ public void setIsTtyOnVolteEnabled(boolean enabled) {
+ mIsTtyOnVolteEnabled = enabled;
+ }
+
+ @Override
+ boolean isTtyOnVolteEnabled(int subId) {
+ if (mIsTtyOnVolteEnabled != null) {
+ return mIsTtyOnVolteEnabled;
+ }
+ return super.isTtyOnVolteEnabled(subId);
+ }
+
+ public void setIsEnabledByPlatform(boolean isEnabled) {
+ mIsEnabledOnPlatform = isEnabled;
+ }
+
+ @Override
+ boolean isEnabledByPlatform(int subId) throws InterruptedException, ImsException,
+ IllegalArgumentException {
+ if (mIsEnabledOnPlatform != null) {
+ return mIsEnabledOnPlatform;
+ }
+ return super.isEnabledByPlatform(subId);
+ }
+
+ public void setIsProvisionedOnDevice(boolean isProvisioned) {
+ mIsProvisionedOnDevice = isProvisioned;
+ }
+
+ @Override
+ boolean isProvisionedOnDevice(int subId) {
+ if (mIsProvisionedOnDevice != null) {
+ return mIsProvisionedOnDevice;
+ }
+ return super.isProvisionedOnDevice(subId);
+ }
+
+ public void setServiceStateReady(boolean isReady) {
+ mIsServiceStateReady = isReady;
+ }
+
+ @Override
+ boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
+ IllegalArgumentException {
+ if (mIsServiceStateReady != null) {
+ return mIsServiceStateReady;
+ }
+ return super.isServiceStateReady(subId);
+ }
+
+ public void setIsEnabledByUser(boolean enabled) {
+ mIsEnabledByUser = enabled;
+ }
+
+ @Override
+ boolean isEnabledByUser(int subId) {
+ if (mIsEnabledByUser != null) {
+ return mIsEnabledByUser;
+ }
+ return super.isEnabledByUser(subId);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/ims/MockWifiCallingQueryImsState.java b/tests/unit/src/com/android/settings/network/ims/MockWifiCallingQueryImsState.java
new file mode 100644
index 0000000..abea839
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/ims/MockWifiCallingQueryImsState.java
@@ -0,0 +1,106 @@
+/*
+ * 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.ims;
+
+import android.content.Context;
+import android.telephony.ims.ImsException;
+
+/**
+ * Controller class for mock Wifi calling status
+ */
+public class MockWifiCallingQueryImsState extends WifiCallingQueryImsState {
+
+ private Boolean mIsTtyOnVolteEnabled;
+ private Boolean mIsEnabledOnPlatform;
+ private Boolean mIsProvisionedOnDevice;
+ private Boolean mIsServiceStateReady;
+ private Boolean mIsEnabledByUser;
+
+ /**
+ * Constructor
+ *
+ * @param context {@code Context}
+ * @param subId subscription's id
+ */
+ public MockWifiCallingQueryImsState(Context context, int subId) {
+ super(context, subId);
+ }
+
+ public void setIsTtyOnVolteEnabled(boolean enabled) {
+ mIsTtyOnVolteEnabled = enabled;
+ }
+
+ @Override
+ boolean isTtyOnVolteEnabled(int subId) {
+ if (mIsTtyOnVolteEnabled != null) {
+ return mIsTtyOnVolteEnabled;
+ }
+ return super.isTtyOnVolteEnabled(subId);
+ }
+
+
+ public void setIsEnabledByPlatform(boolean isEnabled) {
+ mIsEnabledOnPlatform = isEnabled;
+ }
+
+ @Override
+ boolean isEnabledByPlatform(int subId) throws InterruptedException, ImsException,
+ IllegalArgumentException {
+ if (mIsEnabledOnPlatform != null) {
+ return mIsEnabledOnPlatform;
+ }
+ return super.isEnabledByPlatform(subId);
+ }
+
+ public void setIsProvisionedOnDevice(boolean isProvisioned) {
+ mIsProvisionedOnDevice = isProvisioned;
+ }
+
+ @Override
+ boolean isProvisionedOnDevice(int subId) {
+ if (mIsProvisionedOnDevice != null) {
+ return mIsProvisionedOnDevice;
+ }
+ return super.isProvisionedOnDevice(subId);
+ }
+
+ public void setServiceStateReady(boolean isReady) {
+ mIsServiceStateReady = isReady;
+ }
+
+ @Override
+ boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
+ IllegalArgumentException {
+ if (mIsServiceStateReady != null) {
+ return mIsServiceStateReady;
+ }
+ return super.isServiceStateReady(subId);
+ }
+
+ public void setIsEnabledByUser(boolean enabled) {
+ mIsEnabledByUser = enabled;
+ }
+
+ @Override
+ boolean isEnabledByUser(int subId) {
+ if (mIsEnabledByUser != null) {
+ return mIsEnabledByUser;
+ }
+ return super.isEnabledByUser(subId);
+ }
+
+}
diff --git a/tests/unit/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java b/tests/unit/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
index 2b812c7..2c6a8c6 100644
--- a/tests/unit/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
@@ -237,14 +237,15 @@
final Intent intent = new Intent(action);
intent.setClass(mContext, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
- PendingIntent.FLAG_NO_CREATE);
+ PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE);
}
private PendingIntent getActivityIntent(String action) {
final Intent intent = new Intent(action);
intent.setPackage(SETTINGS_PACKAGE_NAME);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
}
private void assertTitle(List<SliceItem> sliceItems, String title) {
diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java
new file mode 100644
index 0000000..a4fc745
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java
@@ -0,0 +1,264 @@
+/*
+ * 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.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Uri;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyDisplayInfo;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.wifitrackerlib.WifiEntry;
+import com.android.wifitrackerlib.WifiPickerTracker;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+public class NetworkProviderWorkerTest {
+ private Context mContext;
+ private MockNetworkProviderWorker mMockNetworkProviderWorker;
+
+ @Mock
+ WifiPickerTracker mMockWifiPickerTracker;
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
+
+ mMockNetworkProviderWorker = new MockNetworkProviderWorker(mContext,
+ PROVIDER_MODEL_SLICE_URI);
+ mMockNetworkProviderWorker.setWifiPickerTracker(mMockWifiPickerTracker);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onConstructor_shouldBeInCreatedState() {
+ assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
+ .isEqualTo(Lifecycle.State.CREATED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSlicePinned_shouldBeInResumedState() {
+ mMockNetworkProviderWorker.onSlicePinned();
+
+ assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
+ .isEqualTo(Lifecycle.State.RESUMED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSliceUnpinned_shouldBeInCreatedState() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.onSliceUnpinned();
+
+ assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
+ .isEqualTo(Lifecycle.State.CREATED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void close_shouldBeInDestroyedState() {
+ mMockNetworkProviderWorker.close();
+
+ assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
+ .isEqualTo(Lifecycle.State.DESTROYED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getWifiEntry_connectedWifiKey_shouldGetConnectedWifi() {
+ final String key = "key";
+ final WifiEntry connectedWifiEntry = mock(WifiEntry.class);
+ when(connectedWifiEntry.getKey()).thenReturn(key);
+ when(mMockWifiPickerTracker.getConnectedWifiEntry()).thenReturn(connectedWifiEntry);
+
+ assertThat(mMockNetworkProviderWorker.getWifiEntry(key)).isEqualTo(connectedWifiEntry);
+ }
+
+ @Test
+ @UiThreadTest
+ public void getWifiEntry_reachableWifiKey_shouldGetReachableWifi() {
+ final String key = "key";
+ final WifiEntry reachableWifiEntry = mock(WifiEntry.class);
+ when(reachableWifiEntry.getKey()).thenReturn(key);
+ when(mMockWifiPickerTracker.getWifiEntries()).thenReturn(Arrays.asList(reachableWifiEntry));
+
+ assertThat(mMockNetworkProviderWorker.getWifiEntry(key)).isEqualTo(reachableWifiEntry);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSubscriptionsChanged_notifySubscriptionChanged_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.onSubscriptionsChanged();
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onAirplaneModeChanged_airplaneModeOn_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.onAirplaneModeChanged(false);
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onAirplaneModeChanged_airplaneModeOff_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.onAirplaneModeChanged(true);
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onSignalStrengthChanged_notifySignalStrengthChanged_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.onSignalStrengthChanged();
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onMobileDataEnabledChange_notifyMobileDataEnabledChanged_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.onMobileDataEnabledChange();
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onDataConnectivityChange_notifyDataConnectivityChanged_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.onDataConnectivityChange();
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onServiceStateChanged_notifyPhoneStateListener_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.mPhoneStateListener.onServiceStateChanged(new ServiceState());
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onActiveDataSubscriptionIdChanged_notifyPhoneStateListener_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.mPhoneStateListener.onActiveDataSubscriptionIdChanged(1);
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onDisplayInfoChanged_notifyPhoneStateListener_callUpdateSlice() {
+ mMockNetworkProviderWorker.onSlicePinned();
+ mMockNetworkProviderWorker.receiveNotification(false);
+
+ mMockNetworkProviderWorker.mPhoneStateListener.onDisplayInfoChanged(
+ new TelephonyDisplayInfo(14, 0));
+
+ assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
+ }
+
+ public class MockNetworkProviderWorker extends NetworkProviderWorker {
+ private boolean mHasNotification = false;
+
+ MockNetworkProviderWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ public void receiveNotification(boolean inputValue) {
+ mHasNotification = inputValue;
+ }
+
+ public boolean hasNotification() {
+ return mHasNotification;
+ }
+
+ @Override
+ public void updateSlice() {
+ super.updateSlice();
+ receiveNotification(true);
+ }
+
+ public void setWifiPickerTracker(WifiPickerTracker wifiPickerTracker) {
+ mWifiPickerTracker = wifiPickerTracker;
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/nfc/NfcDetectionPointControllerTest.java b/tests/unit/src/com/android/settings/nfc/NfcDetectionPointControllerTest.java
similarity index 84%
rename from tests/robotests/src/com/android/settings/nfc/NfcDetectionPointControllerTest.java
rename to tests/unit/src/com/android/settings/nfc/NfcDetectionPointControllerTest.java
index 31ac7d6..3b9df6d 100644
--- a/tests/robotests/src/com/android/settings/nfc/NfcDetectionPointControllerTest.java
+++ b/tests/unit/src/com/android/settings/nfc/NfcDetectionPointControllerTest.java
@@ -18,20 +18,22 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class NfcDetectionPointControllerTest {
private NfcDetectionPointController mController;
@Before
public void setUp() {
- mController = new NfcDetectionPointController(RuntimeEnvironment.application, "fakeKey");
+ mController = new NfcDetectionPointController(ApplicationProvider.getApplicationContext(),
+ "fakeKey");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/nfc/SecureNfcPreferenceControllerTest.java b/tests/unit/src/com/android/settings/nfc/SecureNfcPreferenceControllerTest.java
similarity index 81%
rename from tests/robotests/src/com/android/settings/nfc/SecureNfcPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/nfc/SecureNfcPreferenceControllerTest.java
index 56f012a..c05e208 100644
--- a/tests/robotests/src/com/android/settings/nfc/SecureNfcPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/nfc/SecureNfcPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -20,13 +20,14 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SecureNfcPreferenceControllerTest {
private Context mContext;
@@ -34,7 +35,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new SecureNfcPreferenceController(mContext, "nfc_secure_settings");
}
diff --git a/tests/unit/src/com/android/settings/notification/zen/ZenRuleCustomPrefContrTestBase.java b/tests/unit/src/com/android/settings/notification/zen/ZenRuleCustomPrefContrTestBase.java
new file mode 100644
index 0000000..53ad7c5
--- /dev/null
+++ b/tests/unit/src/com/android/settings/notification/zen/ZenRuleCustomPrefContrTestBase.java
@@ -0,0 +1,40 @@
+/*
+ * 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.notification.zen;
+
+import android.app.AutomaticZenRule;
+import android.app.NotificationManager;
+import android.service.notification.ZenPolicy;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+abstract class ZenRuleCustomPrefContrTestBase {
+ public static final String RULE_ID = "test_rule_id";
+ public static final String PREF_KEY = "main_pref";
+
+ AutomaticZenRule mRule = new AutomaticZenRule("test", null, null, null, null,
+ NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
+
+ abstract AbstractZenCustomRulePreferenceController getController();
+
+ void updateControllerZenPolicy(ZenPolicy policy) {
+ mRule.setZenPolicy(policy);
+ getController().onResume(mRule, RULE_ID);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/panel/FakePanelContent.java b/tests/unit/src/com/android/settings/panel/FakePanelContent.java
new file mode 100644
index 0000000..f64d2f2
--- /dev/null
+++ b/tests/unit/src/com/android/settings/panel/FakePanelContent.java
@@ -0,0 +1,119 @@
+/*
+ * 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.panel;
+
+import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
+
+import android.app.settings.SettingsEnums;
+import android.content.Intent;
+import android.net.Uri;
+
+import androidx.core.graphics.drawable.IconCompat;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Fake PanelContent for testing.
+ */
+public class FakePanelContent implements PanelContent {
+
+ public static final String FAKE_ACTION = "fake_action";
+
+ public static final CharSequence TITLE = "title";
+
+ public static final List<Uri> SLICE_URIS = Arrays.asList(
+ WIFI_SLICE_URI
+ );
+
+ public static final Intent INTENT = new Intent();
+
+ private CharSequence mTitle = TITLE;
+ private CharSequence mSubTitle;
+ private IconCompat mIcon;
+ private int mViewType;
+ private boolean mIsCustomizedButtonUsed = false;
+ private CharSequence mCustomizedButtonTitle;
+
+ @Override
+ public IconCompat getIcon() {
+ return mIcon;
+ }
+
+ public void setIcon(IconCompat icon) {
+ mIcon = icon;
+ }
+
+ @Override
+ public CharSequence getSubTitle() {
+ return mSubTitle;
+ }
+
+ public void setSubTitle(CharSequence subTitle) {
+ mSubTitle = subTitle;
+ }
+
+ @Override
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ public void setTitle(CharSequence title) {
+ mTitle = title;
+ }
+
+ @Override
+ public List<Uri> getSlices() {
+ return SLICE_URIS;
+ }
+
+ @Override
+ public Intent getSeeMoreIntent() {
+ return INTENT;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.TESTING;
+ }
+
+ public void setViewType(int viewType) {
+ mViewType = viewType;
+ }
+
+ @Override
+ public int getViewType() {
+ return mViewType;
+ }
+
+ @Override
+ public boolean isCustomizedButtonUsed() {
+ return mIsCustomizedButtonUsed;
+ }
+
+ public void setIsCustomizedButtonUsed(boolean isUsed) {
+ mIsCustomizedButtonUsed = isUsed;
+ }
+
+ @Override
+ public CharSequence getCustomizedButtonTitle() {
+ return mCustomizedButtonTitle;
+ }
+
+ public void setCustomizedButtonTitle(CharSequence title) {
+ mCustomizedButtonTitle = title;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/panel/FakeSettingsPanelActivity.java b/tests/unit/src/com/android/settings/panel/FakeSettingsPanelActivity.java
new file mode 100644
index 0000000..7e1275e
--- /dev/null
+++ b/tests/unit/src/com/android/settings/panel/FakeSettingsPanelActivity.java
@@ -0,0 +1,33 @@
+/*
+ * 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.panel;
+
+import android.content.ComponentName;
+import android.content.Intent;
+
+public class FakeSettingsPanelActivity extends SettingsPanelActivity {
+ @Override
+ public ComponentName getCallingActivity() {
+ return new ComponentName("fake-package", "fake-class");
+ }
+
+ @Override
+ public Intent getIntent() {
+ final Intent intent = new Intent(FakePanelContent.FAKE_ACTION);
+ return intent;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/panel/NfcPanelTest.java b/tests/unit/src/com/android/settings/panel/NfcPanelTest.java
similarity index 82%
rename from tests/robotests/src/com/android/settings/panel/NfcPanelTest.java
rename to tests/unit/src/com/android/settings/panel/NfcPanelTest.java
index 1de2c5a..60adfdd 100644
--- a/tests/robotests/src/com/android/settings/panel/NfcPanelTest.java
+++ b/tests/unit/src/com/android/settings/panel/NfcPanelTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -20,25 +20,25 @@
import android.net.Uri;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.slices.CustomSliceRegistry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
import java.util.List;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class NfcPanelTest {
private NfcPanel mPanel;
@Before
public void setUp() {
- mPanel = NfcPanel.create(RuntimeEnvironment.application);
+ mPanel = NfcPanel.create(ApplicationProvider.getApplicationContext());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/panel/PanelFeatureProviderImplTest.java b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
similarity index 88%
rename from tests/robotests/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
rename to tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
index f924d7a..3b61a73 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
+++ b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -12,9 +12,7 @@
* 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.panel;
import static com.android.settings.panel.SettingsPanelActivity.KEY_MEDIA_PACKAGE_NAME;
@@ -26,13 +24,14 @@
import android.os.Bundle;
import android.provider.Settings;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class PanelFeatureProviderImplTest {
private static final String TEST_PACKAGENAME = "com.test.packagename";
@@ -43,7 +42,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mProvider = new PanelFeatureProviderImpl();
mBundle = new Bundle();
mBundle.putString(KEY_MEDIA_PACKAGE_NAME, TEST_PACKAGENAME);
diff --git a/tests/robotests/src/com/android/settings/panel/PanelSlicesLoaderCountdownLatchTest.java b/tests/unit/src/com/android/settings/panel/PanelSlicesLoaderCountdownLatchTest.java
similarity index 90%
rename from tests/robotests/src/com/android/settings/panel/PanelSlicesLoaderCountdownLatchTest.java
rename to tests/unit/src/com/android/settings/panel/PanelSlicesLoaderCountdownLatchTest.java
index dd8a91f..3794e00 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelSlicesLoaderCountdownLatchTest.java
+++ b/tests/unit/src/com/android/settings/panel/PanelSlicesLoaderCountdownLatchTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -22,14 +22,14 @@
import android.content.Context;
import android.net.Uri;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class PanelSlicesLoaderCountdownLatchTest {
private Context mContext;
@@ -43,7 +43,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mSliceCountdownLatch = new PanelSlicesLoaderCountdownLatch(URIS.length);
}
@@ -89,4 +89,4 @@
// Verify the second call returns false without external state change
assertThat(mSliceCountdownLatch.isPanelReadyToLoad()).isFalse();
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/panel/WifiPanelTest.java b/tests/unit/src/com/android/settings/panel/WifiPanelTest.java
similarity index 82%
rename from tests/robotests/src/com/android/settings/panel/WifiPanelTest.java
rename to tests/unit/src/com/android/settings/panel/WifiPanelTest.java
index 08db23e..b03075e 100644
--- a/tests/robotests/src/com/android/settings/panel/WifiPanelTest.java
+++ b/tests/unit/src/com/android/settings/panel/WifiPanelTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * 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.
@@ -20,24 +20,25 @@
import android.net.Uri;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.slices.CustomSliceRegistry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.List;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class WifiPanelTest {
private WifiPanel mPanel;
@Before
public void setUp() {
- mPanel = WifiPanel.create(RuntimeEnvironment.application);
+ mPanel = WifiPanel.create(ApplicationProvider.getApplicationContext());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/password/ScreenLockTypeTest.java b/tests/unit/src/com/android/settings/password/ScreenLockTypeTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/password/ScreenLockTypeTest.java
rename to tests/unit/src/com/android/settings/password/ScreenLockTypeTest.java
index 05c3f64..f05e576 100644
--- a/tests/robotests/src/com/android/settings/password/ScreenLockTypeTest.java
+++ b/tests/unit/src/com/android/settings/password/ScreenLockTypeTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -11,20 +11,20 @@
* 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
+ * limitations under the License.
*/
-
package com.android.settings.password;
import static com.google.common.truth.Truth.assertThat;
import android.app.admin.DevicePolicyManager;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class ScreenLockTypeTest {
@Test
diff --git a/tests/robotests/src/com/android/settings/search/CustomSiteMapRegistryTest.java b/tests/unit/src/com/android/settings/search/CustomSiteMapRegistryTest.java
similarity index 97%
rename from tests/robotests/src/com/android/settings/search/CustomSiteMapRegistryTest.java
rename to tests/unit/src/com/android/settings/search/CustomSiteMapRegistryTest.java
index 181821b..1a4737b 100644
--- a/tests/robotests/src/com/android/settings/search/CustomSiteMapRegistryTest.java
+++ b/tests/unit/src/com/android/settings/search/CustomSiteMapRegistryTest.java
@@ -18,6 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.DisplaySettings;
import com.android.settings.backup.UserBackupSettingsActivity;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
@@ -39,9 +41,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class CustomSiteMapRegistryTest {
@Test
diff --git a/tests/unit/src/com/android/settings/search/DatabaseIndexingUtils.java b/tests/unit/src/com/android/settings/search/DatabaseIndexingUtils.java
new file mode 100644
index 0000000..42eb45b
--- /dev/null
+++ b/tests/unit/src/com/android/settings/search/DatabaseIndexingUtils.java
@@ -0,0 +1,53 @@
+/*
+ * 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.search;
+
+import android.util.Log;
+
+import com.android.settingslib.search.Indexable;
+
+import java.lang.reflect.Field;
+
+/**
+ * Utility class for {@like DatabaseIndexingManager} to handle the mapping between Payloads
+ * and Preference controllers, and managing indexable classes.
+ */
+public class DatabaseIndexingUtils {
+
+ private static final String TAG = "IndexingUtil";
+
+ public static final String FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER =
+ "SEARCH_INDEX_DATA_PROVIDER";
+
+ public static Indexable.SearchIndexProvider getSearchIndexProvider(final Class<?> clazz) {
+ try {
+ final Field f = clazz.getField(FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER);
+ return (Indexable.SearchIndexProvider) f.get(null);
+ } catch (NoSuchFieldException e) {
+ Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+ } catch (SecurityException se) {
+ Log.d(TAG,
+ "Security exception for field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+ } catch (IllegalAccessException e) {
+ Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+ } catch (IllegalArgumentException e) {
+ Log.d(TAG, "Illegal argument when accessing field '"
+ + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+ }
+ return null;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/search/FakeSettingsFragment.java b/tests/unit/src/com/android/settings/search/FakeSettingsFragment.java
new file mode 100644
index 0000000..6dbb7fb
--- /dev/null
+++ b/tests/unit/src/com/android/settings/search/FakeSettingsFragment.java
@@ -0,0 +1,117 @@
+/*
+ * 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.search;
+
+import android.content.Context;
+import android.provider.SearchIndexableResource;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.search.SearchIndexableRaw;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test class for Settings Search Indexing.
+ * If you change this class, please run robotests to make sure they still pass.
+ */
+public class FakeSettingsFragment extends DashboardFragment {
+
+ public static final String TITLE = "raw title";
+ public static final String SUMMARY_ON = "raw summary on";
+ public static final String SUMMARY_OFF = "raw summary off";
+ public static final String ENTRIES = "rawentries";
+ public static final String KEYWORDS = "keywords, keywordss, keywordsss";
+ public static final String SPACE_KEYWORDS = "keywords keywordss keywordsss";
+ public static final String SCREEN_TITLE = "raw screen title";
+ public static final String CLASS_NAME = FakeSettingsFragment.class.getName();
+ public static final int ICON = 0xff;
+ public static final String INTENT_ACTION = "raw action";
+ public static final String PACKAGE_NAME = "raw target package";
+ public static final String TARGET_CLASS = "raw target class";
+ public static final String TARGET_PACKAGE = "raw package name";
+ public static final String KEY = "raw key";
+ public static final boolean ENABLED = true;
+
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.DISPLAY;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return "";
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return com.android.settings.R.xml.display_settings;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return null;
+ }
+
+ /** Index provider used to expose this fragment in search. */
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableRaw> getRawDataToIndex(Context context,
+ boolean enabled) {
+ final SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.title = TITLE;
+ data.summaryOn = SUMMARY_ON;
+ data.summaryOff = SUMMARY_OFF;
+ data.entries = ENTRIES;
+ data.keywords = KEYWORDS;
+ data.screenTitle = SCREEN_TITLE;
+ data.packageName = PACKAGE_NAME;
+ data.intentAction = INTENT_ACTION;
+ data.intentTargetClass = TARGET_CLASS;
+ data.intentTargetPackage = TARGET_PACKAGE;
+ data.key = KEY;
+ data.iconResId = ICON;
+ data.enabled = ENABLED;
+
+ final List<SearchIndexableRaw> result = new ArrayList<>(1);
+ result.add(data);
+ return result;
+ }
+
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ final ArrayList<SearchIndexableResource> result = new ArrayList<>();
+
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = com.android.settings.R.xml.display_settings;
+ result.add(sir);
+ return result;
+ }
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add("pref_key_1");
+ keys.add("pref_key_3");
+ return keys;
+ }
+ };
+}
diff --git a/tests/unit/src/com/android/settings/search/SearchIndexProviderCodeInspector.java b/tests/unit/src/com/android/settings/search/SearchIndexProviderCodeInspector.java
new file mode 100644
index 0000000..bc5b41f
--- /dev/null
+++ b/tests/unit/src/com/android/settings/search/SearchIndexProviderCodeInspector.java
@@ -0,0 +1,204 @@
+/*
+ * 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.search;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.provider.SearchIndexableResource;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.core.codeinspection.CodeInspector;
+import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector;
+import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
+import com.android.settingslib.search.SearchIndexableResources;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * {@link CodeInspector} to ensure fragments implement search components correctly.
+ */
+public class SearchIndexProviderCodeInspector extends CodeInspector {
+ private static final String TAG = "SearchCodeInspector";
+
+ private static final String NOT_CONTAINING_PROVIDER_OBJECT_ERROR =
+ "Indexable should have public field "
+ + DatabaseIndexingUtils.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER
+ + " but these are not:\n";
+ private static final String NOT_SHARING_PREF_CONTROLLERS_BETWEEN_FRAG_AND_PROVIDER =
+ "DashboardFragment should share pref controllers with its SearchIndexProvider, but "
+ + " these are not: \n";
+ private static final String NOT_IN_INDEXABLE_PROVIDER_REGISTRY =
+ "Class containing " + DatabaseIndexingUtils.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER
+ + " must be added to " + SearchIndexableResources.class.getName()
+ + " but these are not: \n";
+ private static final String NOT_PROVIDING_VALID_RESOURCE_ERROR =
+ "SearchIndexableProvider must either provide no resource to index, or valid ones. "
+ + "But the followings contain resource with xml id = 0\n";
+
+ private final List<String> mNotImplementingIndexProviderExemptList;
+ private final List<String> mNotInSearchIndexableRegistryExemptList;
+ private final List<String> mNotSharingPrefControllersExemptList;
+
+ public SearchIndexProviderCodeInspector(List<Class<?>> classes) {
+ super(classes);
+ mNotImplementingIndexProviderExemptList = new ArrayList<>();
+ mNotInSearchIndexableRegistryExemptList = new ArrayList<>();
+ mNotSharingPrefControllersExemptList = new ArrayList<>();
+ initializeExemptList(mNotImplementingIndexProviderExemptList,
+ "exempt_not_implementing_index_provider");
+ initializeExemptList(mNotInSearchIndexableRegistryExemptList,
+ "exempt_not_in_search_index_provider_registry");
+ initializeExemptList(mNotSharingPrefControllersExemptList,
+ "exempt_not_sharing_pref_controllers_with_search_provider");
+ }
+
+ @Override
+ public void run() {
+ final Set<String> notImplementingIndexProvider = new ArraySet<>();
+ final Set<String> notInSearchProviderRegistry = new ArraySet<>();
+ final Set<String> notSharingPreferenceControllers = new ArraySet<>();
+ final Set<String> notProvidingValidResource = new ArraySet<>();
+ final Set<Class> providerClasses = new ArraySet<>();
+
+ final SearchFeatureProvider provider = new SearchFeatureProviderImpl();
+ for (SearchIndexableData bundle :
+ provider.getSearchIndexableResources().getProviderValues()) {
+ providerClasses.add(bundle.getTargetClass());
+ }
+
+ for (Class clazz : mClasses) {
+ if (!isConcreteSettingsClass(clazz)) {
+ continue;
+ }
+ final String className = clazz.getName();
+ // Skip fragments if it's not SettingsPreferenceFragment.
+ if (!SettingsPreferenceFragment.class.isAssignableFrom(clazz)) {
+ continue;
+ }
+ final boolean hasSearchIndexProvider = hasSearchIndexProvider(clazz);
+ // If it implements Indexable, it must also implement the index provider field.
+ if (!hasSearchIndexProvider) {
+ if (!mNotImplementingIndexProviderExemptList.remove(className)) {
+ notImplementingIndexProvider.add(className);
+ }
+ continue;
+ }
+ // If it implements index provider field AND it's a DashboardFragment, its fragment and
+ // search provider must share the same set of PreferenceControllers.
+ final boolean isSharingPrefControllers = DashboardFragmentSearchIndexProviderInspector
+ .isSharingPreferenceControllers(clazz);
+ if (!isSharingPrefControllers) {
+ if (!mNotSharingPrefControllersExemptList.remove(className)) {
+ notSharingPreferenceControllers.add(className);
+ }
+ continue;
+ }
+ // Must be in SearchProviderRegistry
+ if (!providerClasses.contains(clazz)) {
+ if (!mNotInSearchIndexableRegistryExemptList.remove(className)) {
+ notInSearchProviderRegistry.add(className);
+ }
+ }
+ // Search provider must either don't provider resource xml, or provide valid ones.
+ if (!hasValidResourceFromProvider(clazz)) {
+ notProvidingValidResource.add(className);
+ }
+ }
+
+ // Build error messages
+ final String indexProviderError = buildErrorMessage(NOT_CONTAINING_PROVIDER_OBJECT_ERROR,
+ notImplementingIndexProvider);
+ final String notSharingPrefControllerError = buildErrorMessage(
+ NOT_SHARING_PREF_CONTROLLERS_BETWEEN_FRAG_AND_PROVIDER,
+ notSharingPreferenceControllers);
+ final String notInProviderRegistryError =
+ buildErrorMessage(NOT_IN_INDEXABLE_PROVIDER_REGISTRY, notInSearchProviderRegistry);
+ final String notProvidingValidResourceError = buildErrorMessage(
+ NOT_PROVIDING_VALID_RESOURCE_ERROR, notProvidingValidResource);
+ assertWithMessage(indexProviderError)
+ .that(notImplementingIndexProvider)
+ .isEmpty();
+ assertWithMessage(notSharingPrefControllerError)
+ .that(notSharingPreferenceControllers)
+ .isEmpty();
+ assertWithMessage(notInProviderRegistryError)
+ .that(notInSearchProviderRegistry)
+ .isEmpty();
+ assertWithMessage(notProvidingValidResourceError)
+ .that(notProvidingValidResource)
+ .isEmpty();
+ assertNoObsoleteInExemptList("exempt_not_implementing_index_provider",
+ mNotImplementingIndexProviderExemptList);
+ assertNoObsoleteInExemptList("exempt_not_in_search_index_provider_registry",
+ mNotInSearchIndexableRegistryExemptList);
+ assertNoObsoleteInExemptList(
+ "exempt_not_sharing_pref_controllers_with_search_provider",
+ mNotSharingPrefControllersExemptList);
+ }
+
+ private boolean hasSearchIndexProvider(Class clazz) {
+ try {
+ final Field f = clazz.getField(
+ DatabaseIndexingUtils.FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER);
+ return f != null;
+ } catch (NoClassDefFoundError e) {
+ // Cannot find class def, ignore
+ return true;
+ } catch (NoSuchFieldException e) {
+ Log.e(TAG, "error fetching search provider from class " + clazz.getName());
+ return false;
+ }
+ }
+
+ private boolean hasValidResourceFromProvider(Class clazz) {
+ try {
+ final Indexable.SearchIndexProvider provider =
+ DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+ final List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(
+ ApplicationProvider.getApplicationContext(), true /* enabled */);
+ if (resources == null) {
+ // No resource, that's fine.
+ return true;
+ }
+ for (SearchIndexableResource res : resources) {
+ if (res.xmlResId == 0) {
+ // Invalid resource
+ return false;
+ }
+ }
+ } catch (Exception e) {
+ // Ignore.
+ }
+ return true;
+ }
+
+ private String buildErrorMessage(String errorSummary, Set<String> errorClasses) {
+ final StringBuilder error = new StringBuilder(errorSummary);
+ for (String c : errorClasses) {
+ error.append(c).append("\n");
+ }
+ return error.toString();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java b/tests/unit/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
similarity index 88%
rename from tests/robotests/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
rename to tests/unit/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
index ecc2f2d..bbe9e35 100644
--- a/tests/robotests/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
+++ b/tests/unit/src/com/android/settings/security/CredentialManagementAppButtonsControllerTest.java
@@ -20,15 +20,16 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class CredentialManagementAppButtonsControllerTest {
private Context mContext;
@@ -38,7 +39,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new CredentialManagementAppButtonsController(
mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
}
diff --git a/tests/robotests/src/com/android/settings/security/CredentialManagementAppHeaderControllerTest.java b/tests/unit/src/com/android/settings/security/CredentialManagementAppHeaderControllerTest.java
similarity index 88%
rename from tests/robotests/src/com/android/settings/security/CredentialManagementAppHeaderControllerTest.java
rename to tests/unit/src/com/android/settings/security/CredentialManagementAppHeaderControllerTest.java
index e77e4c1..35470a7 100644
--- a/tests/robotests/src/com/android/settings/security/CredentialManagementAppHeaderControllerTest.java
+++ b/tests/unit/src/com/android/settings/security/CredentialManagementAppHeaderControllerTest.java
@@ -20,15 +20,16 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class CredentialManagementAppHeaderControllerTest {
private Context mContext;
@@ -38,7 +39,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new CredentialManagementAppHeaderController(
mContext, PREF_KEY_CREDENTIAL_MANAGEMENT_APP);
}
diff --git a/tests/unit/src/com/android/settings/slices/FakeContextOnlyPreferenceController.java b/tests/unit/src/com/android/settings/slices/FakeContextOnlyPreferenceController.java
new file mode 100644
index 0000000..78587a0
--- /dev/null
+++ b/tests/unit/src/com/android/settings/slices/FakeContextOnlyPreferenceController.java
@@ -0,0 +1,34 @@
+/*
+ * 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.slices;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class FakeContextOnlyPreferenceController extends BasePreferenceController {
+
+ public static final String KEY = "fakeController2";
+
+ public FakeContextOnlyPreferenceController(Context context) {
+ super(context, KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/slices/FakePreferenceController.java b/tests/unit/src/com/android/settings/slices/FakePreferenceController.java
new file mode 100644
index 0000000..f543893
--- /dev/null
+++ b/tests/unit/src/com/android/settings/slices/FakePreferenceController.java
@@ -0,0 +1,53 @@
+/*
+ * 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.slices;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class FakePreferenceController extends BasePreferenceController {
+
+ public FakePreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public int getSliceType() {
+ return SliceData.SliceType.SLIDER;
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return true;
+ }
+
+ @Override
+ public boolean isPublicSlice() {
+ return true;
+ }
+
+ @Override
+ public boolean useDynamicSliceSummary() {
+ return true;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/slices/SliceControllerInXmlCodeInspector.java b/tests/unit/src/com/android/settings/slices/SliceControllerInXmlCodeInspector.java
new file mode 100644
index 0000000..ce8338c
--- /dev/null
+++ b/tests/unit/src/com/android/settings/slices/SliceControllerInXmlCodeInspector.java
@@ -0,0 +1,174 @@
+/*
+ * 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.slices;
+
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.SearchIndexableResource;
+import android.text.TextUtils;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.PreferenceXmlParserUtils;
+import com.android.settings.core.SliderPreferenceController;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.core.codeinspection.CodeInspector;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.search.SearchFeatureProvider;
+import com.android.settings.search.SearchFeatureProviderImpl;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.search.Indexable;
+import com.android.settingslib.search.SearchIndexableData;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+public class SliceControllerInXmlCodeInspector extends CodeInspector {
+
+ private static final List<Class> sSliceControllerClasses = Arrays.asList(
+ TogglePreferenceController.class,
+ SliderPreferenceController.class
+ );
+
+ private final List<String> mXmlDeclaredControllers = new ArrayList<>();
+ private final List<String> mExemptedClasses = new ArrayList<>();
+
+ private static final String ERROR_MISSING_CONTROLLER =
+ "The following controllers were expected to be declared by "
+ + "'settings:controller=Controller_Class_Name' in their corresponding Xml. "
+ + "If it should not appear in XML, add the controller's classname to "
+ + "exempt_slice_controller_not_in_xml. Controllers:\n";
+
+ private final Context mContext;
+ private final SearchFeatureProvider mSearchProvider;
+ private final FakeFeatureFactory mFakeFeatureFactory;
+
+ public SliceControllerInXmlCodeInspector(List<Class<?>> classes) throws Exception {
+ super(classes);
+ mContext = ApplicationProvider.getApplicationContext();
+ mSearchProvider = new SearchFeatureProviderImpl();
+ mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
+ mFakeFeatureFactory.searchFeatureProvider = mSearchProvider;
+
+ CodeInspector.initializeExemptList(mExemptedClasses,
+ "exempt_slice_controller_not_in_xml");
+ initDeclaredControllers();
+ }
+
+ private void initDeclaredControllers() throws IOException, XmlPullParserException {
+ final List<Integer> xmlResources = getIndexableXml();
+ for (int xmlResId : xmlResources) {
+ final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+ xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
+ for (Bundle bundle : metadata) {
+ final String controllerClassName = bundle.getString(METADATA_CONTROLLER);
+ if (TextUtils.isEmpty(controllerClassName)) {
+ continue;
+ }
+ mXmlDeclaredControllers.add(controllerClassName);
+ }
+ }
+ // We definitely have some controllers in xml, so assert not-empty here as a proxy to
+ // make sure the parser didn't fail
+ assertThat(mXmlDeclaredControllers).isNotEmpty();
+ }
+
+ @Override
+ public void run() {
+ final List<String> missingControllersInXml = new ArrayList<>();
+
+ for (Class<?> clazz : mClasses) {
+ if (!isConcreteSettingsClass(clazz)) {
+ // Only care about non-abstract classes.
+ continue;
+ }
+ if (!isInlineSliceClass(clazz)) {
+ // Only care about inline-slice controller classes.
+ continue;
+ }
+
+ if (!mXmlDeclaredControllers.contains(clazz.getName())) {
+ // Class clazz should have been declared in XML (unless allowlisted).
+ missingControllersInXml.add(clazz.getName());
+ }
+ }
+
+ // Removed allowlisted classes
+ missingControllersInXml.removeAll(mExemptedClasses);
+
+ final String missingControllerError =
+ buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml);
+
+ assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty();
+ }
+
+ private boolean isInlineSliceClass(Class clazz) {
+ while (clazz != null) {
+ clazz = clazz.getSuperclass();
+ if (sSliceControllerClasses.contains(clazz)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private String buildErrorMessage(String errorSummary, List<String> errorClasses) {
+ final StringBuilder error = new StringBuilder(errorSummary);
+ for (String c : errorClasses) {
+ error.append(c).append("\n");
+ }
+ return error.toString();
+ }
+
+ private List<Integer> getIndexableXml() {
+ final List<Integer> xmlResSet = new ArrayList<>();
+
+ final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(
+ mContext).getSearchFeatureProvider().getSearchIndexableResources()
+ .getProviderValues();
+
+ for (SearchIndexableData bundle : bundles) {
+ Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
+
+ if (provider == null) {
+ continue;
+ }
+
+ List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(mContext,
+ true);
+
+ if (resources == null) {
+ continue;
+ }
+
+ for (SearchIndexableResource resource : resources) {
+ // Add '0's anyway. It won't break the test.
+ xmlResSet.add(resource.xmlResId);
+ }
+ }
+ return xmlResSet;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java b/tests/unit/src/com/android/settings/slices/SliceDataTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/slices/SliceDataTest.java
rename to tests/unit/src/com/android/settings/slices/SliceDataTest.java
index fa3f8b9..4d18544 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java
+++ b/tests/unit/src/com/android/settings/slices/SliceDataTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -20,24 +20,25 @@
import android.net.Uri;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SliceDataTest {
- private final String KEY = "KEY";
- private final String TITLE = "title";
- private final String SUMMARY = "summary";
- private final String SCREEN_TITLE = "screen title";
- private final String KEYWORDS = "a, b, c";
- private final String FRAGMENT_NAME = "fragment name";
- private final int ICON = 1234; // I declare a thumb war
- private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
- private final String PREF_CONTROLLER = "com.android.settings.slices.tester";
- private final int SLICE_TYPE = SliceData.SliceType.SWITCH;
- private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
+ private static final String KEY = "KEY";
+ private static final String TITLE = "title";
+ private static final String SUMMARY = "summary";
+ private static final String SCREEN_TITLE = "screen title";
+ private static final String KEYWORDS = "a, b, c";
+ private static final String FRAGMENT_NAME = "fragment name";
+ private static final int ICON = 1234; // I declare a thumb war
+ private static final Uri URI = Uri.parse("content://com.android.settings.slices/test");
+ private static final String PREF_CONTROLLER = "com.android.settings.slices.tester";
+ private static final int SLICE_TYPE = SliceData.SliceType.SWITCH;
+ private static final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice";
@Test
public void testBuilder_buildsMatchingObject() {
diff --git a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
new file mode 100644
index 0000000..1b035cd
--- /dev/null
+++ b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
@@ -0,0 +1,82 @@
+/*
+ * 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.slices;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.provider.SettingsSlicesContract;
+
+import com.android.settings.testutils.FakeIndexProvider;
+import com.android.settings.testutils.FakeToggleController;
+
+class SliceTestUtils {
+
+ public static final String FAKE_TITLE = "title";
+ public static final String FAKE_SUMMARY = "summary";
+ public static final String FAKE_SCREEN_TITLE = "screen_title";
+ public static final String FAKE_KEYWORDS = "a, b, c";
+ public static final int FAKE_ICON = 1234;
+ public static final String FAKE_FRAGMENT_NAME = FakeIndexProvider.class.getName();
+ public static final String FAKE_CONTROLLER_NAME = FakeToggleController.class.getName();
+
+
+ public static void insertSliceToDb(Context context, String key) {
+ insertSliceToDb(context, key, true /* isPlatformSlice */);
+ }
+
+ public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice) {
+ insertSliceToDb(context, key, isPlatformSlice, null /*customizedUnavailableSliceSubtitle*/);
+ }
+
+ public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice,
+ String customizedUnavailableSliceSubtitle) {
+ insertSliceToDb(context, key, isPlatformSlice, customizedUnavailableSliceSubtitle, false);
+ }
+
+ public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice,
+ String customizedUnavailableSliceSubtitle, boolean isPublicSlice) {
+ final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(context).getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(SlicesDatabaseHelper.IndexColumns.KEY, key);
+ values.put(SlicesDatabaseHelper.IndexColumns.SLICE_URI,
+ new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(isPlatformSlice
+ ? SettingsSlicesContract.AUTHORITY
+ : SettingsSliceProvider.SLICE_AUTHORITY)
+ .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
+ .appendPath(key)
+ .build().toSafeString());
+ values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE);
+ values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, FAKE_SUMMARY);
+ values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, FAKE_SCREEN_TITLE);
+ values.put(SlicesDatabaseHelper.IndexColumns.KEYWORDS, FAKE_KEYWORDS);
+ values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, FAKE_ICON);
+ values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, FAKE_FRAGMENT_NAME);
+ values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, FAKE_CONTROLLER_NAME);
+ values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT);
+ values.put(SlicesDatabaseHelper.IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
+ customizedUnavailableSliceSubtitle);
+ values.put(SlicesDatabaseHelper.IndexColumns.PUBLIC_SLICE, isPublicSlice);
+
+ db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
+ db.close();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
similarity index 88%
rename from tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
rename to tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
index d483f9e..4fcbd15 100644
--- a/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
+++ b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -12,9 +12,7 @@
* 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.slices;
import static com.google.common.truth.Truth.assertThat;
@@ -27,24 +25,24 @@
import android.provider.SettingsSlicesContract;
import androidx.slice.Slice;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class SpecialCaseSliceManagerTest {
- private final String FAKE_PARAMETER_KEY = "fake_parameter_key";
- private final String FAKE_PARAMETER_VALUE = "fake_value";
+ private static final String FAKE_PARAMETER_KEY = "fake_parameter_key";
+ private static final String FAKE_PARAMETER_VALUE = "fake_value";
private Context mContext;
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
CustomSliceRegistry.sUriToSlice.clear();
CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class);
}
@@ -113,7 +111,7 @@
static final Slice SLICE = new Slice.Builder(URI).build();
- static boolean backingData = false;
+ static boolean sBackingData = false;
final Context mContext;
@@ -133,7 +131,7 @@
@Override
public void onNotifyChange(Intent intent) {
- backingData = !backingData;
+ sBackingData = !sBackingData;
}
@Override
diff --git a/tests/robotests/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java
index f281e25..510928d 100644
--- a/tests/robotests/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java
@@ -26,14 +26,15 @@
import android.content.Context;
import android.provider.Settings;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class MediaControlsPreferenceControllerTest {
private static final String KEY = "media_controls_resume_switch";
@@ -46,7 +47,7 @@
@Before
public void setUp() {
- mContext = spy(RuntimeEnvironment.application);
+ mContext = spy(ApplicationProvider.getApplicationContext());
mContentResolver = mContext.getContentResolver();
mOriginalQs = Settings.Global.getInt(mContentResolver,
Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1);
diff --git a/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java b/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java
new file mode 100644
index 0000000..545f6ad
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java
@@ -0,0 +1,76 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Log;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.rules.ExternalResource;
+
+/** A test rule that is used to manager the Airplane Mode resource for testing. */
+public final class AirplaneModeRule extends ExternalResource {
+
+ private static final String TAG = "AirplaneModeRule";
+
+ private Context mContext;
+ private boolean mBackupValue;
+ private boolean mShouldRestore;
+
+ @Override
+ protected void before() throws Throwable {
+ mContext = ApplicationProvider.getApplicationContext();
+ }
+
+ @Override
+ protected void after() {
+ if (mShouldRestore) {
+ Log.d(TAG, "Restore Airplane Mode value:" + mBackupValue);
+ setAirplaneMode(mContext, mBackupValue);
+ }
+ }
+
+ public void setAirplaneMode(boolean enable) {
+ if (!mShouldRestore && isAirplaneModeOn() != enable) {
+ mShouldRestore = true;
+ mBackupValue = isAirplaneModeOn();
+ Log.d(TAG, "Backup Airplane Mode value:" + mBackupValue);
+ }
+ Log.d(TAG, "Set Airplane Mode enable:" + enable);
+ setAirplaneMode(mContext, enable);
+ }
+
+ public boolean isAirplaneModeOn() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
+ }
+
+ private static void setAirplaneMode(Context context, boolean enable) {
+ // Change the system setting
+ Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
+ enable ? 1 : 0);
+
+ // Post the intent
+ final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intent.putExtra("state", enable);
+ context.sendBroadcastAsUser(intent, UserHandle.ALL);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/ApplicationTestUtils.java b/tests/unit/src/com/android/settings/testutils/ApplicationTestUtils.java
new file mode 100644
index 0000000..91f296f
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/ApplicationTestUtils.java
@@ -0,0 +1,45 @@
+/*
+ * 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.testutils;
+
+import android.content.pm.ApplicationInfo;
+
+/**
+ * Helper for mocking installed applications.
+ */
+public class ApplicationTestUtils {
+ /**
+ * Create and populate an {@link android.content.pm.ApplicationInfo} object that describes an
+ * installed app.
+ *
+ * @param uid The app's uid
+ * @param packageName The app's package name.
+ * @param flags Flags describing the app. See {@link android.content.pm.ApplicationInfo#flags}
+ * for possible values.
+ * @param targetSdkVersion The app's target SDK version
+ *
+ * @see android.content.pm.ApplicationInfo
+ */
+ public static ApplicationInfo buildInfo(int uid, String packageName, int flags,
+ int targetSdkVersion) {
+ final ApplicationInfo info = new ApplicationInfo();
+ info.uid = uid;
+ info.packageName = packageName;
+ info.flags = flags;
+ info.targetSdkVersion = targetSdkVersion;
+ return info;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/unit/src/com/android/settings/testutils/BatteryTestUtils.java
new file mode 100644
index 0000000..57bd3f5
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -0,0 +1,49 @@
+/*
+ * 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.testutils;
+
+import android.content.Intent;
+import android.os.BatteryManager;
+
+public class BatteryTestUtils {
+
+ public static Intent getChargingIntent() {
+ return getCustomBatteryIntent(
+ BatteryManager.BATTERY_PLUGGED_AC,
+ 50 /* level */,
+ 100 /* scale */,
+ BatteryManager.BATTERY_STATUS_CHARGING);
+ }
+
+ public static Intent getDischargingIntent() {
+ return getCustomBatteryIntent(
+ 0 /* plugged */,
+ 10 /* level */,
+ 100 /* scale */,
+ BatteryManager.BATTERY_STATUS_DISCHARGING);
+ }
+
+ private static Intent getCustomBatteryIntent(int plugged, int level, int scale, int status) {
+ Intent intent = new Intent();
+ intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);
+ intent.putExtra(BatteryManager.EXTRA_LEVEL, level);
+ intent.putExtra(BatteryManager.EXTRA_SCALE, scale);
+ intent.putExtra(BatteryManager.EXTRA_STATUS, status);
+
+ return intent;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/CustomActivity.java b/tests/unit/src/com/android/settings/testutils/CustomActivity.java
new file mode 100644
index 0000000..89cdcfc
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/CustomActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.testutils;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.UserHandle;
+
+public class CustomActivity extends Activity {
+ @Override
+ public void startActivityAsUser(Intent intent, UserHandle user) {}
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeCopyableController.java b/tests/unit/src/com/android/settings/testutils/FakeCopyableController.java
new file mode 100644
index 0000000..3bdbb54
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/FakeCopyableController.java
@@ -0,0 +1,43 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class FakeCopyableController extends BasePreferenceController {
+
+ public FakeCopyableController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return true;
+ }
+
+ @Override
+ public boolean isCopyableSlice() {
+ return true;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index 47851b9..d20fc12 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -41,6 +41,7 @@
import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.slices.SlicesFeatureProvider;
import com.android.settings.users.UserFeatureProvider;
+import com.android.settings.wifi.WifiTrackerLibProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
@@ -72,6 +73,8 @@
public SearchFeatureProvider searchFeatureProvider;
public ContextualCardFeatureProvider mContextualCardFeatureProvider;
+ public WifiTrackerLibProvider wifiTrackerLibProvider;
+
/**
* Call this in {@code @Before} method of the test class to use fake factory.
*/
@@ -106,6 +109,7 @@
mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
mAwareFeatureProvider = mock(AwareFeatureProvider.class);
mFaceFeatureProvider = mock(FaceFeatureProvider.class);
+ wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
}
@Override
@@ -217,4 +221,9 @@
public FaceFeatureProvider getFaceFeatureProvider() {
return mFaceFeatureProvider;
}
+
+ @Override
+ public WifiTrackerLibProvider getWifiTrackerLibProvider() {
+ return wifiTrackerLibProvider;
+ }
}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeIndexProvider.java b/tests/unit/src/com/android/settings/testutils/FakeIndexProvider.java
new file mode 100644
index 0000000..5cbfb54
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/FakeIndexProvider.java
@@ -0,0 +1,46 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.Indexable;
+
+import java.util.List;
+
+public class FakeIndexProvider implements Indexable {
+
+ public static final String KEY = "TestKey";
+
+ /**
+ * The fake SearchIndexProvider. Note that the use of location_settings below implies that tests
+ * using this should be using the res/xml-mcc999/location_settings.xml or
+ * res/xml-mcc998/location_settings.xml. Annotate tests with
+ * {@code @Config(qualifiers = "mcc999")}.
+ */
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.location_settings) {
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> result = super.getNonIndexableKeys(context);
+ result.add(KEY);
+ return result;
+ }
+ };
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeInvalidSliderController.java b/tests/unit/src/com/android/settings/testutils/FakeInvalidSliderController.java
new file mode 100644
index 0000000..15d214d
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/FakeInvalidSliderController.java
@@ -0,0 +1,31 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+
+public class FakeInvalidSliderController extends FakeSliderController {
+
+ public FakeInvalidSliderController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public int getMax() {
+ // Return 0 to make it invalid
+ return 0;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeSliderController.java b/tests/unit/src/com/android/settings/testutils/FakeSliderController.java
new file mode 100644
index 0000000..f8685fc
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/FakeSliderController.java
@@ -0,0 +1,64 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.core.SliderPreferenceController;
+
+public class FakeSliderController extends SliderPreferenceController {
+
+ public static final String AVAILABILITY_KEY = "fake_slider_availability_key";
+
+ public static final int MAX_VALUE = 9;
+
+ private static final String SETTING_KEY = "fake_slider_key";
+
+ public FakeSliderController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public int getSliderPosition() {
+ return Settings.System.getInt(mContext.getContentResolver(), SETTING_KEY, 0);
+ }
+
+ @Override
+ public boolean setSliderPosition(int position) {
+ return Settings.System.putInt(mContext.getContentResolver(), SETTING_KEY, position);
+ }
+
+ @Override
+ public int getMax() {
+ return MAX_VALUE;
+ }
+
+ @Override
+ public int getMin() {
+ return 0;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return Settings.Global.getInt(mContext.getContentResolver(), AVAILABILITY_KEY, AVAILABLE);
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return true;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeToggleController.java b/tests/unit/src/com/android/settings/testutils/FakeToggleController.java
new file mode 100644
index 0000000..9eda8b6
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/FakeToggleController.java
@@ -0,0 +1,105 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.provider.Settings;
+
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.slices.SliceBackgroundWorker;
+
+public class FakeToggleController extends TogglePreferenceController {
+
+ public static final String AVAILABILITY_KEY = "fake_toggle_availability_key";
+
+ public static final IntentFilter INTENT_FILTER = new IntentFilter(
+ WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+
+ private static final String SETTING_KEY = "toggle_key";
+
+ private static final int ON = 1;
+ private static final int OFF = 0;
+
+ private boolean mIsAsyncUpdate = false;
+
+ public FakeToggleController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public boolean isChecked() {
+ return Settings.System.getInt(mContext.getContentResolver(),
+ SETTING_KEY, OFF) == ON;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ return Settings.System.putInt(mContext.getContentResolver(), SETTING_KEY,
+ isChecked ? ON : OFF);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ AVAILABILITY_KEY, AVAILABLE);
+ }
+
+ @Override
+ public IntentFilter getIntentFilter() {
+ return INTENT_FILTER;
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return true;
+ }
+
+ @Override
+ public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() {
+ return TestWorker.class;
+ }
+
+ @Override
+ public boolean hasAsyncUpdate() {
+ return mIsAsyncUpdate;
+ }
+
+ public void setAsyncUpdate(boolean isAsyncUpdate) {
+ mIsAsyncUpdate = isAsyncUpdate;
+ }
+
+ public static class TestWorker extends SliceBackgroundWorker<Void> {
+
+ public TestWorker(Context context, Uri uri) {
+ super(context, uri);
+ }
+
+ @Override
+ protected void onSlicePinned() {
+ }
+
+ @Override
+ protected void onSliceUnpinned() {
+ }
+
+ @Override
+ public void close() {
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeUnavailablePreferenceController.java b/tests/unit/src/com/android/settings/testutils/FakeUnavailablePreferenceController.java
new file mode 100644
index 0000000..97379e3
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/FakeUnavailablePreferenceController.java
@@ -0,0 +1,40 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class FakeUnavailablePreferenceController extends BasePreferenceController {
+
+ public static final String AVAILABILITY_KEY = "fake_availability_key";
+
+ public FakeUnavailablePreferenceController(Context context) {
+ super(context, "key");
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return Settings.Global.getInt(mContext.getContentResolver(), AVAILABILITY_KEY, 0);
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return true;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/ResolveInfoBuilder.java b/tests/unit/src/com/android/settings/testutils/ResolveInfoBuilder.java
new file mode 100644
index 0000000..5eaf2a4
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/ResolveInfoBuilder.java
@@ -0,0 +1,71 @@
+/*
+ * 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.testutils;
+
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Helper for building {@link ResolveInfo}s to be used in Robolectric tests.
+ *
+ * <p>The resulting {@link PackageInfo}s should typically be added to {@link
+ * org.robolectric.shadows.ShadowPackageManager#addResolveInfoForIntent(Intent, ResolveInfo)}.
+ */
+public final class ResolveInfoBuilder {
+
+ private final String mPackageName;
+ private ActivityInfo mActivityInfo;
+ private ProviderInfo mProviderInfo;
+
+ public ResolveInfoBuilder(String packageName) {
+ this.mPackageName = Preconditions.checkNotNull(packageName);
+ }
+
+ public ResolveInfoBuilder setActivity(String packageName, String className) {
+ mActivityInfo = new ActivityInfo();
+ mActivityInfo.packageName = packageName;
+ mActivityInfo.name = className;
+ return this;
+ }
+
+ public ResolveInfoBuilder setProvider(
+ String packageName, String className, String authority, boolean isSystemApp) {
+ mProviderInfo = new ProviderInfo();
+ mProviderInfo.authority = authority;
+ mProviderInfo.applicationInfo = new ApplicationInfo();
+ if (isSystemApp) {
+ mProviderInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+ }
+ mProviderInfo.packageName = mPackageName;
+ mProviderInfo.applicationInfo.packageName = mPackageName;
+ mProviderInfo.name = className;
+ return this;
+ }
+
+ public ResolveInfo build() {
+ ResolveInfo info = new ResolveInfo();
+ info.activityInfo = mActivityInfo;
+ info.resolvePackageName = mPackageName;
+ info.providerInfo = mProviderInfo;
+ return info;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/ResourcesUtils.java b/tests/unit/src/com/android/settings/testutils/ResourcesUtils.java
index 636954d..8ef310d 100644
--- a/tests/unit/src/com/android/settings/testutils/ResourcesUtils.java
+++ b/tests/unit/src/com/android/settings/testutils/ResourcesUtils.java
@@ -17,16 +17,44 @@
import android.content.Context;
+/**
+ * Test util to provide the correct resources.
+ */
public final class ResourcesUtils {
+ /**
+ * Return a resource identifier for the given resource name.
+ * @param context Context to use.
+ * @param type Optional default resource type to find, if "type/" is not included in the name.
+ * Can be null to require an explicit type.
+ * @param name The name of the desired resource.
+ * @return The associated resource identifier. Returns 0 if no such resource was found.
+ * (0 is not a valid resource ID.)
+ */
public static int getResourcesId(Context context, String type, String name) {
return context.getResources().getIdentifier(name, type, context.getPackageName());
}
+ /**
+ * Returns a localized string from the application's package's default string table.
+ * @param context Context to use.
+ * @param name The name of the desired resource.
+ * @return The string data associated with the resource, stripped of styled text information.
+ */
public static String getResourcesString(Context context, String name) {
return context.getResources().getString(getResourcesId(context, "string", name));
}
- public static String getResourcesString(Context context, String name, Object value) {
+ /**
+ * Return the string value associated with a particular neame of resource,
+ * substituting the format arguments as defined in {@link java.util.Formatter}
+ * and {@link java.lang.String#format}. It will be stripped of any styled text
+ * information.
+ * @param context Context to use.
+ * @param name The name of the desired resource.
+ * @param value The format arguments that will be used for substitution.
+ * @return The string data associated with the resource, stripped of styled text information.
+ */
+ public static String getResourcesString(Context context, String name, Object... value) {
return context.getResources().getString(getResourcesId(context, "string", name), value);
}
}
diff --git a/tests/unit/src/com/android/settings/testutils/SliceTester.java b/tests/unit/src/com/android/settings/testutils/SliceTester.java
new file mode 100644
index 0000000..be13e13
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/SliceTester.java
@@ -0,0 +1,324 @@
+/*
+ * 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.testutils;
+
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.Slice.SUBTYPE_COLOR;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.slice.Slice;
+import androidx.slice.SliceItem;
+import androidx.slice.SliceMetadata;
+import androidx.slice.builders.ListBuilder;
+import androidx.slice.core.SliceAction;
+import androidx.slice.core.SliceQuery;
+import androidx.slice.widget.EventInfo;
+
+import com.android.settings.Utils;
+import com.android.settings.slices.SettingsSliceProvider;
+import com.android.settings.slices.SliceBuilderUtils;
+import com.android.settings.slices.SliceData;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Testing utility class to verify the contents of the different Settings Slices.
+ *
+ * TODO (77712944) check Summary, range (metadata.getRange()), toggle icons.
+ */
+public class SliceTester {
+
+ /**
+ * Test the contents of an intent based slice, including:
+ * - No toggles
+ * - Correct intent
+ * - Correct title
+ * - Correct keywords
+ * - TTL
+ * - Color
+ */
+ public static void testSettingsIntentSlice(Context context, Slice slice, SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final long sliceTTL = metadata.getExpiry();
+ assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
+
+ final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+ final int color = colorItem.getInt();
+ assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
+
+ final List<SliceAction> toggles = metadata.getToggles();
+ assertThat(toggles).isEmpty();
+
+ final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentPendingIntent(context, sliceData));
+
+ assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
+
+ assertKeywords(metadata, sliceData);
+ }
+
+ /**
+ * Test the contents of an toggle based slice, including:
+ * - Contains one toggle
+ * - Correct toggle intent
+ * - Correct content intent
+ * - Correct title
+ * - Correct keywords
+ * - TTL
+ * - Color
+ */
+ public static void testSettingsToggleSlice(Context context, Slice slice, SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+ final int color = colorItem.getInt();
+ assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
+
+ final List<SliceAction> toggles = metadata.getToggles();
+ assertThat(toggles).hasSize(1);
+
+ final long sliceTTL = metadata.getExpiry();
+ assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
+
+ final SliceAction mainToggleAction = toggles.get(0);
+
+ assertThat(mainToggleAction.getIcon()).isNull();
+
+ // Check intent in Toggle Action
+ final PendingIntent togglePendingIntent = mainToggleAction.getAction();
+ assertThat(togglePendingIntent).isEqualTo(SliceBuilderUtils.getActionIntent(context,
+ SettingsSliceProvider.ACTION_TOGGLE_CHANGED, sliceData));
+
+ // Check primary intent
+ final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentPendingIntent(context, sliceData));
+
+ assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
+
+ assertKeywords(metadata, sliceData);
+ }
+
+ /**
+ * Test the contents of an slider based slice, including:
+ * - No intent
+ * - Correct title
+ * - Correct keywords
+ * - TTL
+ * - Color
+ */
+ public static void testSettingsSliderSlice(Context context, Slice slice, SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+ final SliceAction primaryAction = metadata.getPrimaryAction();
+
+ final IconCompat icon = primaryAction.getIcon();
+ if (icon == null) {
+ final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+ final int color = colorItem.getInt();
+ assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
+
+ } else {
+ final IconCompat expectedIcon = IconCompat.createWithResource(context,
+ sliceData.getIconResource());
+ assertThat(expectedIcon.toString()).isEqualTo(icon.toString());
+ }
+
+ final long sliceTTL = metadata.getExpiry();
+ assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
+
+ final int headerType = metadata.getHeaderType();
+ assertThat(headerType).isEqualTo(EventInfo.ROW_TYPE_SLIDER);
+
+ // Check primary intent
+ final PendingIntent primaryPendingIntent = primaryAction.getAction();
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentPendingIntent(context, sliceData));
+
+ assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
+
+ assertKeywords(metadata, sliceData);
+ }
+
+ /**
+ * Test the copyable slice, including:
+ * - No intent
+ * - Correct title
+ * - Correct intent
+ * - Correct keywords
+ * - TTL
+ * - Color
+ */
+ public static void testSettingsCopyableSlice(Context context, Slice slice,
+ SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+ final int color = colorItem.getInt();
+ assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
+
+ final SliceAction primaryAction = metadata.getPrimaryAction();
+
+ final IconCompat expectedIcon = IconCompat.createWithResource(context,
+ sliceData.getIconResource());
+ assertThat(expectedIcon.toString()).isEqualTo(primaryAction.getIcon().toString());
+
+ final long sliceTTL = metadata.getExpiry();
+ assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
+
+ // Check primary intent
+ final PendingIntent primaryPendingIntent = primaryAction.getAction();
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentPendingIntent(context, sliceData));
+
+ assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
+
+ assertKeywords(metadata, sliceData);
+ }
+
+ /**
+ * Test the contents of an unavailable slice, including:
+ * - No toggles
+ * - Correct title
+ * - Correct intent
+ * - Correct keywords
+ * - Color
+ * - TTL
+ */
+ public static void testSettingsUnavailableSlice(Context context, Slice slice,
+ SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final long sliceTTL = metadata.getExpiry();
+ assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
+
+ final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+ final int color = colorItem.getInt();
+ assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
+
+ final List<SliceAction> toggles = metadata.getToggles();
+ assertThat(toggles).isEmpty();
+
+ final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
+ assertThat(primaryPendingIntent).isEqualTo(SliceBuilderUtils.getContentPendingIntent(
+ context, sliceData));
+
+ assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
+
+ assertKeywords(metadata, sliceData);
+ }
+
+ /**
+ * Assert any slice item contains title.
+ *
+ * @param sliceItems All slice items of a Slice.
+ * @param title Title for asserting.
+ */
+ public static void assertAnySliceItemContainsTitle(List<SliceItem> sliceItems, String title) {
+ assertThat(hasText(sliceItems, title, HINT_TITLE)).isTrue();
+ }
+
+ /**
+ * Assert any slice item contains subtitle.
+ *
+ * @param sliceItems All slice items of a Slice.
+ * @param subtitle Subtitle for asserting.
+ */
+ public static void assertAnySliceItemContainsSubtitle(List<SliceItem> sliceItems,
+ String subtitle) {
+ // Subtitle has no hints
+ assertThat(hasText(sliceItems, subtitle, null /* hints */)).isTrue();
+ }
+
+ /**
+ * Assert no slice item contains subtitle.
+ *
+ * @param sliceItems All slice items of a Slice.
+ * @param subtitle Subtitle for asserting.
+ */
+ public static void assertNoSliceItemContainsSubtitle(List<SliceItem> sliceItems,
+ String subtitle) {
+ // Subtitle has no hints
+ assertThat(hasText(sliceItems, subtitle, null /* hints */)).isFalse();
+ }
+
+ private static boolean hasText(List<SliceItem> sliceItems, String text, String hints) {
+ boolean hasText = false;
+ for (SliceItem item : sliceItems) {
+ List<SliceItem> textItems = SliceQuery.findAll(item, FORMAT_TEXT, hints,
+ null /* non-hints */);
+ if (textItems == null) {
+ continue;
+ }
+
+ for (SliceItem textItem : textItems) {
+ if (TextUtils.equals(textItem.getText(), text)) {
+ hasText = true;
+ break;
+ }
+ }
+ }
+ return hasText;
+ }
+
+ /**
+ * Assert any slice item contains icon.
+ *
+ * @param sliceItems All slice items of a Slice.
+ * @param icon Icon for asserting.
+ */
+ public static void assertAnySliceItemContainsIcon(List<SliceItem> sliceItems, IconCompat icon) {
+ boolean hasIcon = false;
+ for (SliceItem item : sliceItems) {
+ List<SliceItem> iconItems = SliceQuery.findAll(item, FORMAT_IMAGE,
+ (String) null /* hints */, null /* non-hints */);
+ if (iconItems == null) {
+ continue;
+ }
+
+ for (SliceItem iconItem : iconItems) {
+ if (icon.toString().equals(iconItem.getIcon().toString())) {
+ hasIcon = true;
+ break;
+ }
+ }
+ }
+ assertThat(hasIcon).isTrue();
+ }
+
+ private static void assertKeywords(SliceMetadata metadata, SliceData data) {
+ final List<String> keywords = metadata.getSliceKeywords();
+ final Set<String> expectedKeywords = Arrays.stream(data.getKeywords().split(","))
+ .map(s -> s = s.trim())
+ .collect(Collectors.toSet());
+ expectedKeywords.add(data.getTitle());
+ expectedKeywords.add(data.getScreenTitle().toString());
+ assertThat(keywords).containsExactlyElementsIn(expectedKeywords);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/XmlTestUtils.java b/tests/unit/src/com/android/settings/testutils/XmlTestUtils.java
new file mode 100644
index 0000000..5640bee
--- /dev/null
+++ b/tests/unit/src/com/android/settings/testutils/XmlTestUtils.java
@@ -0,0 +1,64 @@
+/*
+ * 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.testutils;
+
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
+import static com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag
+ .FLAG_INCLUDE_PREF_SCREEN;
+import static com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_KEY;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import com.android.settings.core.PreferenceXmlParserUtils;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Util class for parsing XML
+ */
+public class XmlTestUtils {
+
+ /**
+ * Parses a preference screen's xml, collects and returns all keys used by preferences
+ * on the screen.
+ *
+ * @param context of the preference screen.
+ * @param xmlId of the Preference Xml to be parsed.
+ * @return List of all keys in the preference Xml
+ */
+ public static List<String> getKeysFromPreferenceXml(Context context, int xmlId) {
+ final List<String> keys = new ArrayList<>();
+ try {
+ List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(context, xmlId,
+ FLAG_NEED_KEY | FLAG_INCLUDE_PREF_SCREEN);
+ for (Bundle bundle : metadata) {
+ final String key = bundle.getString(METADATA_KEY);
+ if (!TextUtils.isEmpty(key)) {
+ keys.add(key);
+ }
+ }
+ } catch (java.io.IOException | XmlPullParserException e) {
+ return null;
+ }
+
+ return keys;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/users/MultiUserTopIntroPreferenceControllerTest.java b/tests/unit/src/com/android/settings/users/MultiUserTopIntroPreferenceControllerTest.java
similarity index 86%
rename from tests/robotests/src/com/android/settings/users/MultiUserTopIntroPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/users/MultiUserTopIntroPreferenceControllerTest.java
index bc0b060..624750c 100644
--- a/tests/robotests/src/com/android/settings/users/MultiUserTopIntroPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/users/MultiUserTopIntroPreferenceControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -23,15 +23,15 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
-@Ignore
+@RunWith(AndroidJUnit4.class)
public class MultiUserTopIntroPreferenceControllerTest {
private Context mContext;
@@ -39,10 +39,11 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mController = new MultiUserTopIntroPreferenceController(mContext, "top_info");
}
+ @Ignore
@Test
public void getAvailabilityStatus_multiUserOff_shouldReturnEnabled() {
mController.mUserCaps.mEnabled = true;
@@ -51,6 +52,7 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
}
+ @Ignore
@Test
public void getAvailabilityStatus_multiUserOn_shouldReturnDisabled() {
mController.mUserCaps.mEnabled = true;
diff --git a/tests/robotests/src/com/android/settings/utils/LocalClassLoaderContextThemeWrapperTest.java b/tests/unit/src/com/android/settings/utils/LocalClassLoaderContextThemeWrapperTest.java
similarity index 81%
rename from tests/robotests/src/com/android/settings/utils/LocalClassLoaderContextThemeWrapperTest.java
rename to tests/unit/src/com/android/settings/utils/LocalClassLoaderContextThemeWrapperTest.java
index 5a17622..3bafd50 100644
--- a/tests/robotests/src/com/android/settings/utils/LocalClassLoaderContextThemeWrapperTest.java
+++ b/tests/unit/src/com/android/settings/utils/LocalClassLoaderContextThemeWrapperTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -20,19 +20,20 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class LocalClassLoaderContextThemeWrapperTest {
private LocalClassLoaderContextThemeWrapper mContextThemeWrapper;
@Test
public void getClassLoader_shouldUseLocalClassLoader() {
- final Context context = RuntimeEnvironment.application;
+ final Context context = ApplicationProvider.getApplicationContext();
final Class clazz = LocalClassLoaderContextThemeWrapperTest.class;
mContextThemeWrapper = new LocalClassLoaderContextThemeWrapper(clazz, context, 0);
diff --git a/tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java b/tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java
similarity index 89%
rename from tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java
rename to tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java
index 7856b06..f214764 100644
--- a/tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java
+++ b/tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -23,11 +23,12 @@
import android.net.ConnectivityManager;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public final class VpnUtilsTest {
@Test
public void testIsAlwaysOnVpnSet() {
diff --git a/tests/robotests/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java b/tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java
similarity index 79%
rename from tests/robotests/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java
rename to tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java
index ac95afa..777d984 100644
--- a/tests/robotests/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java
+++ b/tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -18,21 +18,23 @@
import static org.junit.Assert.assertEquals;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class DefaultIndicatorSeekBarTest {
private DefaultIndicatorSeekBar mDefaultIndicatorSeekBar;
@Before
public void setUp() {
- mDefaultIndicatorSeekBar = new DefaultIndicatorSeekBar(RuntimeEnvironment.application);
+ mDefaultIndicatorSeekBar = new DefaultIndicatorSeekBar(
+ ApplicationProvider.getApplicationContext());
mDefaultIndicatorSeekBar.setMax(100);
}
diff --git a/tests/unit/src/com/android/settings/widget/DonutViewTest.java b/tests/unit/src/com/android/settings/widget/DonutViewTest.java
new file mode 100644
index 0000000..ad02d0e
--- /dev/null
+++ b/tests/unit/src/com/android/settings/widget/DonutViewTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.widget;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class DonutViewTest {
+ @Test
+ public void getPercentageStringSpannable_doesntCrashForMissingPercentage() {
+ Context context = ApplicationProvider.getApplicationContext();
+
+ DonutView.getPercentageStringSpannable(context.getResources(), "50%", "h");
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/PreferenceCategoryControllerTest.java b/tests/unit/src/com/android/settings/widget/PreferenceCategoryControllerTest.java
similarity index 89%
rename from tests/robotests/src/com/android/settings/widget/PreferenceCategoryControllerTest.java
rename to tests/unit/src/com/android/settings/widget/PreferenceCategoryControllerTest.java
index 59cd13d..5e730f9 100644
--- a/tests/robotests/src/com/android/settings/widget/PreferenceCategoryControllerTest.java
+++ b/tests/unit/src/com/android/settings/widget/PreferenceCategoryControllerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -23,18 +23,19 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.List;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class PreferenceCategoryControllerTest {
private Context mContext;
@@ -43,7 +44,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mChildren = new ArrayList<>();
mController = new PreferenceCategoryController(mContext, "pref_key").setChildren(mChildren);
}
diff --git a/tests/robotests/src/com/android/settings/widget/RingProgressBarTest.java b/tests/unit/src/com/android/settings/widget/RingProgressBarTest.java
similarity index 87%
rename from tests/robotests/src/com/android/settings/widget/RingProgressBarTest.java
rename to tests/unit/src/com/android/settings/widget/RingProgressBarTest.java
index 1d76f1b..f857e8f 100644
--- a/tests/robotests/src/com/android/settings/widget/RingProgressBarTest.java
+++ b/tests/unit/src/com/android/settings/widget/RingProgressBarTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -22,16 +22,17 @@
import android.content.Context;
import android.view.View.MeasureSpec;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class RingProgressBarTest {
- private Context mContext = RuntimeEnvironment.application;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private RingProgressBar mProgressBar;
diff --git a/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java b/tests/unit/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
rename to tests/unit/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
index 8cb0539..cc53eee 100644
--- a/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
+++ b/tests/unit/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * 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.
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package com.android.settings.widget;
import static com.google.common.truth.Truth.assertThat;
@@ -23,17 +22,17 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.viewpager.widget.PagerAdapter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
import java.util.Locale;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class RtlCompatibleViewPagerTest {
private Locale mLocaleEn;
@@ -42,7 +41,7 @@
@Before
public void setUp() {
- mViewPager = new RtlCompatibleViewPager(RuntimeEnvironment.application);
+ mViewPager = new RtlCompatibleViewPager(ApplicationProvider.getApplicationContext());
mViewPager.setAdapter(new ViewPagerAdapter());
mLocaleEn = new Locale("en");
mLocaleHe = new Locale("he");
diff --git a/tests/unit/src/com/android/settings/wifi/WifiPickerTrackerHelperTest.java b/tests/unit/src/com/android/settings/wifi/WifiPickerTrackerHelperTest.java
new file mode 100644
index 0000000..851b115
--- /dev/null
+++ b/tests/unit/src/com/android/settings/wifi/WifiPickerTrackerHelperTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.HandlerThread;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.wifitrackerlib.MergedCarrierEntry;
+import com.android.wifitrackerlib.WifiEntry;
+import com.android.wifitrackerlib.WifiPickerTracker;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiPickerTrackerHelperTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ public WifiPickerTracker mWifiPickerTracker;
+ @Mock
+ public MergedCarrierEntry mMergedCarrierEntry;
+ @Mock
+ public WifiEntry.ConnectCallback mConnectCallback;
+
+ private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+
+ @Before
+ public void setUp() {
+ mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(mock(Lifecycle.class),
+ ApplicationProvider.getApplicationContext(), null);
+ }
+
+ @Test
+ public void getWifiPickerTracker_returnNonNull() {
+ assertThat(mWifiPickerTrackerHelper.getWifiPickerTracker()).isNotNull();
+ }
+
+ @Test
+ public void onDestroy_workerThreadQuit() {
+ final HandlerThread workerThread = mock(HandlerThread.class);
+ mWifiPickerTrackerHelper.setWorkerThread(workerThread);
+
+ mWifiPickerTrackerHelper.onDestroy();
+
+ verify(workerThread).quit();
+ }
+
+ @Test
+ public void setCarrierNetworkEnabled_returnTrueAndSetEnabled() {
+ mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
+ when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
+
+ assertThat(mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true)).isTrue();
+ verify(mMergedCarrierEntry).setEnabled(true);
+
+ assertThat(mWifiPickerTrackerHelper.setCarrierNetworkEnabled(false)).isTrue();
+ verify(mMergedCarrierEntry).setEnabled(false);
+ }
+
+ @Test
+ public void setCarrierNetworkEnabled_mergedCarrierEntryIsNull_returnFalse() {
+ mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
+ when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);
+
+ assertThat(mWifiPickerTrackerHelper.setCarrierNetworkEnabled(true)).isFalse();
+ assertThat(mWifiPickerTrackerHelper.setCarrierNetworkEnabled(false)).isFalse();
+ }
+
+ @Test
+ public void connectCarrierNetwork_returnTrueAndConnect() {
+ mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
+ when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
+ when(mMergedCarrierEntry.canConnect()).thenReturn(true);
+
+ assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isTrue();
+ verify(mMergedCarrierEntry).connect(mConnectCallback);
+ }
+
+ @Test
+ public void connectCarrierNetwork_mergedCarrierEntryIsNull_returnFalse() {
+ mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
+ when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(null);
+
+ assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isFalse();
+ }
+
+ @Test
+ public void connectCarrierNetwork_canConnectIsFalse_returnFalseAndNeverConnect() {
+ mWifiPickerTrackerHelper.setWifiPickerTracker(mWifiPickerTracker);
+ when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry);
+ when(mMergedCarrierEntry.canConnect()).thenReturn(false);
+
+ assertThat(mWifiPickerTrackerHelper.connectCarrierNetwork(mConnectCallback)).isFalse();
+ verify(mMergedCarrierEntry, never()).connect(mConnectCallback);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java b/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
similarity index 94%
rename from tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java
rename to tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
index 630b319..7a75443 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java
+++ b/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * 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.
@@ -23,13 +23,14 @@
import android.net.wifi.WifiConfiguration;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.wifitrackerlib.WifiEntry;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class WifiUtilsTest {
@Test
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java b/tests/unit/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java
similarity index 90%
rename from tests/robotests/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java
rename to tests/unit/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java
index 18a5b86..d4d724d 100644
--- a/tests/robotests/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java
+++ b/tests/unit/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java
@@ -24,16 +24,17 @@
import android.content.Context;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import com.android.wifitrackerlib.WifiEntry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class WifiSubscriptionDetailPreferenceController2Test {
@Mock
@@ -44,7 +45,7 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mMockWifiEntry = mock(WifiEntry.class);
WifiSubscriptionDetailPreferenceController2 preferenceController =
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiNetworkConfigTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiNetworkConfigTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/wifi/dpp/WifiNetworkConfigTest.java
rename to tests/unit/src/com/android/settings/wifi/dpp/WifiNetworkConfigTest.java
index 1b7c0a8..85cf259 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiNetworkConfigTest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiNetworkConfigTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -20,12 +20,13 @@
import android.content.Intent;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
public class WifiNetworkConfigTest {
private WifiNetworkConfig mWifiConfig;
@@ -43,4 +44,4 @@
String qrcode = mWifiConfig.getQrCode();
assertThat(qrcode).isEqualTo("WIFI:S:Pixel\\:_ABCD\\;;T:WPA;P:\\\\012345678\\,;H:false;;");
}
-}
\ No newline at end of file
+}