Merge "Send bluetooth permission reply intent only to BT package" into main
diff --git a/Android.bp b/Android.bp
index f38ec07..5a1224c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -75,6 +75,7 @@
"android.hardware.dumpstate-V1-java",
"android.hardware.dumpstate-V1.0-java",
"android.hardware.dumpstate-V1.1-java",
+ "android.nfc.flags-aconfig-java",
"net-utils-framework-common",
"notification_flags_lib",
"securebox",
diff --git a/OWNERS b/OWNERS
index 69ae4f9..6698752 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,27 +1,29 @@
+# Bug component: 27091
# Use this reviewer by default.
android-settings-core-eng+gerrit@google.com
-# People who can approve changes for submission
+# Android Settings Core
cantol@google.com
cechkahn@google.com
-chaohuiw@google.com
chiujason@google.com
dswliu@google.com
edgarwang@google.com
-hanxu@google.com
jiannan@google.com
millchen@google.com
-songchenxi@google.com
-songferngwang@google.com
sunnyshao@google.com
+yantingyang@google.com
+
+# Android Settings extended
+chaohuiw@google.com
+songferngwang@google.com
tomhsu@google.com
wengsu@google.com
-yantingyang@google.com
ykhung@google.com
# Emergency only
-wangqi@google.com
-yanglu@google.com
+cipson@google.com
+hanxu@google.com
+yangfan@google.com
# Exempt resource files (because they are in a flat directory and too hard to manage via OWNERS)
per-file res*/**=*
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index 78fba34..eb9a6b4 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -6,15 +6,7 @@
name: "aconfig_settings_flags",
package: "com.android.settings.flags",
srcs: [
- "settings_accessibility_flag_declarations.aconfig",
- "settings_connecteddevice_flag_declarations.aconfig",
- "settings_globalintl_flag_declarations.aconfig",
- "settings_experience_flag_declarations.aconfig",
- "settings_onboarding_experience_flag_declarations.aconfig",
- "settings_telephony_flag_declarations.aconfig",
- "settings_biometrics_integration_declarations.aconfig",
- "settings_voice_activation_apps_flag_declarations.aconfig",
- "settings_biometrics_framework_flag_declarations.aconfig",
+ "*.aconfig",
],
}
diff --git a/aconfig/OWNERS b/aconfig/OWNERS
index 1131545..c26a190 100644
--- a/aconfig/OWNERS
+++ b/aconfig/OWNERS
@@ -1 +1,3 @@
per-file settings_accessibility_flag_declarations.aconfig = file:/src/com/android/settings/accessibility/OWNERS
+per-file settings_biometrics_integration_declarations.aconfig = file:platform/vendor/unbundled_google/packages/SettingsGoogle:/future/biometrics/OWNERS
+
diff --git a/aconfig/settings_development_flag_declarations.aconfig b/aconfig/settings_development_flag_declarations.aconfig
new file mode 100644
index 0000000..c23a38f
--- /dev/null
+++ b/aconfig/settings_development_flag_declarations.aconfig
@@ -0,0 +1,13 @@
+package: "com.android.settings.flags"
+
+# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
+
+# NOTE: All Settings flags share the same Flags class, so prefix our
+# flags with 'development' to prevent naming collision.
+
+flag {
+ name: "development_hdr_sdr_ratio"
+ namespace: "core_graphics"
+ description: "Shows hdr/sdr dev opton on the development options page from aconfig"
+ bug: "291863102"
+}
diff --git a/aconfig/settings_notification_flag_declarations.aconfig b/aconfig/settings_notification_flag_declarations.aconfig
new file mode 100644
index 0000000..f2bf1c8
--- /dev/null
+++ b/aconfig/settings_notification_flag_declarations.aconfig
@@ -0,0 +1,9 @@
+package: "com.android.settings.flags"
+
+flag {
+ name: "dedupe_dnd_settings_channels"
+ namespace: "systemui"
+ description: "Controls adding group names to channel names in the DND>Apps settings page"
+ bug: "294333850"
+}
+
diff --git a/aconfig/settings_panel_flag_declarations.aconfig b/aconfig/settings_panel_flag_declarations.aconfig
new file mode 100644
index 0000000..10eb655
--- /dev/null
+++ b/aconfig/settings_panel_flag_declarations.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.settings.flags"
+
+flag {
+ name: "enable_volume_plus_quick_settings"
+ namespace: "pixel_cross_device_control"
+ description: "Gates whether to enable VolumePlus quick settings panel."
+ bug: "309052662"
+}
diff --git a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
index dccc805..d98bc52 100644
--- a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
+++ b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
@@ -1,8 +1,8 @@
package: "com.android.settings.flags"
flag {
- name: "enable_voice_activation_apps_special_app_access"
- namespace: "voice_activation_apps"
- description: "Enable voice activation apps in Special app access"
+ name: "enable_voice_activation_apps_in_settings"
+ namespace: "permissions"
+ description: "Enable voice activation apps in Settings"
bug: "303727896"
}
\ No newline at end of file
diff --git a/protos/fuelgauge_log.proto b/protos/fuelgauge_log.proto
index e75ca48..36126a5 100644
--- a/protos/fuelgauge_log.proto
+++ b/protos/fuelgauge_log.proto
@@ -43,6 +43,7 @@
RECHECK_JOB = 3;
FETCH_USAGE_DATA = 4;
INSERT_USAGE_DATA = 5;
+ TIME_UPDATED = 6;
}
optional int64 timestamp = 1;
diff --git a/res/drawable/ic_error_red.xml b/res/drawable/ic_error_red.xml
new file mode 100644
index 0000000..d17c85b
--- /dev/null
+++ b/res/drawable/ic_error_red.xml
@@ -0,0 +1,26 @@
+<!--
+ ~ Copyright (C) 2023 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="960"
+ android:viewportHeight="960"
+ android:tint="?android:attr/colorError">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M480,680Q497,680 508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM440,520L520,520L520,280L440,280L440,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
+</vector>
diff --git a/res/drawable/ic_settings_force_stop.xml b/res/drawable/ic_settings_force_stop.xml
index eda6079..4385b3e 100644
--- a/res/drawable/ic_settings_force_stop.xml
+++ b/res/drawable/ic_settings_force_stop.xml
@@ -1,5 +1,5 @@
<!--
- Copyright (C) 2018 The Android Open Source Project
+ Copyright (C) 2023 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.
@@ -17,15 +17,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
+ android:viewportWidth="960"
+ android:viewportHeight="960">
<path
android:fillColor="#FF000000"
- android:pathData="M12,5.99L19.53,19H4.47L12,5.99M12,2L1,21h22L12,2L12,2z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M13,16l-2,0l0,2l2,0l0,-2z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M13,10l-2,0l0,4l2,0l0,-4z"/>
+ android:pathData="M480,680Q497,680 508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM440,520L520,520L520,280L440,280L440,520ZM330,840L120,630L120,330L330,120L630,120L840,330L840,630L630,840L330,840ZM364,760L596,760L760,596L760,364L596,200L364,200L200,364L200,596L364,760ZM480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480Z" />
</vector>
diff --git a/res/layout/audio_sharing_device_item.xml b/res/layout/audio_sharing_device_item.xml
new file mode 100644
index 0000000..f8e7454
--- /dev/null
+++ b/res/layout/audio_sharing_device_item.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/device_button"
+ android:overScrollMode="never"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAlignment="center"
+ android:text=""/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/dialog_audio_sharing.xml b/res/layout/dialog_audio_sharing.xml
new file mode 100644
index 0000000..5f26f74
--- /dev/null
+++ b/res/layout/dialog_audio_sharing.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 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:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="24dp"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/DeviceAudioSharingText"
+ android:id="@+id/share_audio_subtitle1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAlignment="center"
+ android:layout_gravity="center"/>
+
+ <TextView
+ style="@style/DeviceAudioSharingText"
+ android:id="@+id/share_audio_subtitle2"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAlignment="center"
+ android:layout_gravity="center"/>
+
+ <com.android.internal.widget.RecyclerView
+ android:visibility="visible"
+ android:id="@+id/btn_list"
+ android:nestedScrollingEnabled="false"
+ android:overScrollMode="never"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/dialog_eid_status.xml b/res/layout/dialog_eid_status.xml
index 77d6494..3297dac 100644
--- a/res/layout/dialog_eid_status.xml
+++ b/res/layout/dialog_eid_status.xml
@@ -27,8 +27,7 @@
style="@style/device_info_dialog_value"
android:id="@+id/esim_id_value"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textIsSelectable="true" />
+ android:layout_height="wrap_content" />
<ImageView
android:id="@+id/esim_id_qrcode"
diff --git a/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml b/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
new file mode 100644
index 0000000..0b087d2
--- /dev/null
+++ b/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<com.google.android.setupdesign.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ style="?attr/fingerprint_layout_theme"
+ android:id="@+id/setup_wizard_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SudContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <com.google.android.setupdesign.view.FillContentLayout
+ android:layout_width="@dimen/fingerprint_progress_bar_max_size"
+ android:layout_height="@dimen/fingerprint_progress_bar_max_size"
+ android:layout_marginVertical="24dp"
+ android:paddingTop="0dp"
+ android:paddingBottom="0dp">
+
+ <com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.RFPSProgressBar
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fingerprint_progress_bar"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/fp_illustration"
+ android:minHeight="@dimen/fingerprint_progress_bar_min_size"
+ android:progress="0" />
+
+ </com.google.android.setupdesign.view.FillContentLayout>
+
+ <TextView
+ android:id="@+id/text"
+ style="@style/TextAppearance.ErrorText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal|bottom"
+ android:accessibilityLiveRegion="polite"
+ android:gravity="center"
+ android:visibility="invisible" />
+
+ </LinearLayout>
+
+</LinearLayout>
+
+</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/preference_widget_qrcode.xml b/res/layout/preference_widget_qrcode.xml
new file mode 100644
index 0000000..7994fe1
--- /dev/null
+++ b/res/layout/preference_widget_qrcode.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/button_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="@dimen/two_target_min_width"
+ android:minHeight="@dimen/min_tap_target_size"
+ android:layout_gravity="center"
+ android:background="?android:attr/selectableItemBackground"/>
\ No newline at end of file
diff --git a/res/layout/privatespace_account_login_error.xml b/res/layout/privatespace_account_login_error.xml
new file mode 100644
index 0000000..a38dd50
--- /dev/null
+++ b/res/layout/privatespace_account_login_error.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<com.google.android.setupdesign.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/ps_error_page_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:filterTouchesWhenObscured="true"
+ app:sucHeaderText="@string/privatespace_retry_signin_title"
+ app:sudDescriptionText="@string/privatespace_retry_summary"
+ android:icon="@drawable/ic_error_red">
+</com.google.android.setupdesign.GlifLayout>
diff --git a/res/navigation/privatespace_main_context_nav.xml b/res/navigation/privatespace_main_context_nav.xml
index 5b2552a..ffc63ec 100644
--- a/res/navigation/privatespace_main_context_nav.xml
+++ b/res/navigation/privatespace_main_context_nav.xml
@@ -33,8 +33,8 @@
android:id="@+id/action_advance_profile_error"
app:destination="@id/ps_profile_error_fragment"/>
<action
- android:id="@+id/action_advance_to_success"
- app:destination="@id/ps_profile_success_fragment"/>
+ android:id="@+id/action_advance_login_error"
+ app:destination="@id/ps_account_error_fragment"/>
</fragment>
<fragment android:id="@+id/ps_profile_error_fragment"
android:name="com.android.settings.privatespace.PrivateProfileCreationError"
@@ -46,4 +46,18 @@
<fragment android:id="@+id/ps_profile_success_fragment"
android:name="com.android.settings.privatespace.SetupSuccessFragment"
android:label="fragment_ps_success"/>
-</navigation>
\ No newline at end of file
+ <fragment android:id="@+id/ps_account_error_fragment"
+ android:name="com.android.settings.privatespace.PrivateSpaceAccountLoginError"
+ android:label="fragment_account_error">
+ <action
+ android:id="@+id/action_advance_login_error"
+ app:destination="@id/ps_account_error_fragment"/>
+ </fragment>
+ <fragment android:id="@+id/ps_profile_lock_fragment"
+ android:name="com.android.settings.privatespace.PrivateSpaceSetLockFragment"
+ android:label="fragment_ps_lock"/>
+ <action android:id="@+id/action_success_fragment"
+ app:destination="@id/ps_profile_success_fragment"/>
+ <action android:id="@+id/action_set_lock_fragment"
+ app:destination="@id/ps_profile_lock_fragment"/>
+</navigation>
diff --git a/res/navigation/privatespace_private_context_nav.xml b/res/navigation/privatespace_private_context_nav.xml
deleted file mode 100644
index 3df8fa5..0000000
--- a/res/navigation/privatespace_private_context_nav.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
- ~ Copyright (C) 2023 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.
- -->
-
-<navigation xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/private_space_navigation"
- app:startDestination="@id/ps_profile_lock_fragment">
- <fragment android:id="@+id/ps_profile_lock_fragment"
- android:name="com.android.settings.privatespace.PrivateSpaceSetLockFragment"
- android:label="fragment_ps_lock"/>
-</navigation>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index fe8b90f..4212a8c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Deaktiveer Bluetooth LE-oudio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Deaktiveer Bluetooth LE oudio-kenmerk as die toestel LE oudiohardewarevermoëns ondersteun."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Wys LE-oudiowisselaar in Toestelbesonderhede"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omseil Bluetooth LE-oudiotoelaatlys"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Gebruik LE-oudio by verstek, selfs as LE-oudio se randtoestel nie geverifieer is vir voldoening aan toelaatlyskriteria nie."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Mediatoestelle"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Oproeptoestelle"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Ander toestelle"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Gestoorde toestelle"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Word met rekening geassosieer"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Voorheen met rekening gebruik"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth sal aangeskakel word om saam te bind"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Verbindingvoorkeure"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Voorheen gekoppel"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Skryf in teksvelde"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignoreer alle stilusknoppiedrukke"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stilus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Oudiodeling"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Deel oudio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Oproepe en alarms"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Datum en tyd"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Instaanbediener"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Maak skoon"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privaat ruimte"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Versteek apps in ’n privaat vouer"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Ontsluit met skermslot"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Wys privaat ruimte"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Versteek as dit gesluit is"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Versteek Privaat Ruimte as dit gesluit is"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Jy kan Privaat Ruimte op jou appslys versteek as jy nie wil hê ander mense moet weet dis op jou toestel nie"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Kry toegang tot Privaat Ruimte wanneer dit versteek is"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Soek na “Privaat Ruimte” in die soekbalk"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tik op die Privaat Ruimte-teël"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Ontsluit jou Privaat Ruimte"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Af"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Aan"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Stelsel"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Skep privaat ruimte"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Vee privaat ruimte uit"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Kon nie privaat ruimte skep nie"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privaat ruimte is suksesvol uitgevee"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Kon nie privaat ruimte uitvee nie"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Stel ’n skermslot"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Stel ’n skermslot op dié toestel om Privaat Ruimte te gebruik."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Stel skermslot"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Kanselleer"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Kanselleer"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Stel op"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Stel Privaat Ruimte op"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Versteek privaat apps in ’n veilige ruimte waartoe net jy toegang het"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Hoe dit werk"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Jy kan van die onderkant van jou appslys af toegang tot Privaat Ruimte kry"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Privaat Ruimte word deur ’n slot beskerm"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Kennisgewings vanaf apps in Privaat Ruimte word versteek as dit gesluit is"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Privaat Ruimte-apps sal nie in toestemmingbestuurder, privaatheidkontroleskerm en ander instellings verskyn wanneer Privaat Ruimte gesluit is nie"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Stel tans Privaat Ruimte op …"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privaat Ruimte word deur ’n slot beskerm"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Gebruiksinligting vir Privaat Ruimte-apps is versteek wanneer dit gesluit is"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Verkry toegang tot Privaat Ruimte vanaf jou applysinskrywing"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Kon nie Privaat Ruimte opstel nie"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Probeer nou weer, of kom later terug"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Probeer weer"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Wil jy skermslot gebruik om te ontsluit?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Jy kan Privaat Ruimte ontsluit net soos jy jou toestel ontsluit, of ’n ander slot kies"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Gebruik skermslot"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Kies nuwe slot"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Gereed!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Swiep van die onderkant van jou tuisskerm af op, en rollees dan af om toegang tot Privaat Ruimte te kry"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Klaar"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Rollees af om toegang to Privaat Ruimte te kry"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Jy kan tot <xliff:g id="COUNT">%d</xliff:g> vingerafdrukke byvoeg"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Jy het die maksimum aantal vingerafdrukke bygevoeg"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Kan nie nog vingerafdrukke byvoeg nie"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Hou aan om apps te gebruik wanneer gevou"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Gladde Vertoning"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Verhoog die herlaaikoers vir sommige inhoud outomaties van 60 tot <xliff:g id="ID_1">%1$s</xliff:g> Hz. Verhoog batterygebruik."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Verhoog die herlaaitempo vir sommige inhoud outomaties na <xliff:g id="ID_1">%1$d</xliff:g> Hz. Verhoog batterygebruik."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Dwing na hoogste herlaaikoers"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Hoogste herlaaikoers vir verbeterde raaksensitiwiteit en animasiegehalte. Verhoog batterygebruik."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Skermaandag"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Gemeenskaplike instellings"</string>
<string name="apn_settings" msgid="4295467389400441299">"Toegangspuntname"</string>
<string name="apn_edit" msgid="2003683641840248741">"Redigeer toegangspunt"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nie gestel nie"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nie gestel nie"</string>
<string name="apn_name" msgid="6677695784108157953">"Naam"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Gebruik toeganklikheidknoppie om oop te maak"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hou volumesleutels om oop te maak"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Tripeltik op skerm om oop te maak"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Tweevinger- tripeltik op skerm om oop te maak"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Gebruik gebaar om oop te maak"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Gebruik toeganklikheidsgebaar"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Tik op die toeganklikheidknoppie <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> onderaan jou skerm om hierdie kenmerk te gebruik.\n\nRaak en hou die toeganklikheidknoppie om tussen kenmerke te wissel."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Tik op die toeganklikheidknoppie op jou skerm om hierdie kenmerke te gebruik."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Druk en hou albei volumesleutels om hierdie kenmerk te gebruik."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Tripeltik enige plek op jou skerm om vergroting te begin en te stop."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Tripeltik met twee vingers enige plek op jou skerm om vergroting te begin en te stop."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Swiep met 2 vingers van die onderkant van die skerm af op om hierdie kenmerk te gebruik.\n\nSwiep met 2 vingers op en hou om tussen kenmerke te wissel."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Swiep met 3 vingers van die onderkant van die skerm af op om hierdie kenmerk te gebruik.\n\nSwiep met 3 vingers op en hou om tussen kenmerke te wissel."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Swiep met 2 vingers van die onderkant van die skerm af op om \'n toeganklikheidkenmerk te gebruik.\n\nSwiep met 2 vingers op en hou om tussen kenmerke te wissel."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hou volumesleutels in"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hou volumesleutels"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Druk en hou albei volumesleutels"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Tweevinger- tripeltik op skerm"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"tweevinger- tripeltik op skerm"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Tik vinnig {0,number,integer} keer op die skerm met twee vingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tik 3 keer op skerm"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tripeltik op skerm"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Tik {0,number,integer} keer vinnig op skerm. Hierdie kortpad kan jou toestel stadiger maak"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Gebruik vibrasie en fisiese terugvoer"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Wekkervibrasie"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Mediavibrasie"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Sleutelbordvibrasie"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Luivibrasie"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Kennisgewingvibrasie"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Raakterugvoer"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"As jy agtergrondaktiwiteit vir \'n program beperk, kan dit verkeerd werk"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Hierdie program is nie gestel om batterykrag te optimeer nie en daarom kan jy dit nie beperk nie.\n\nOm die program te beperk, moet jy eers batterykrag-optimering aanskakel."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Bestuur batterygebruik"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Onbeperk"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Geoptimeer"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Beperk"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"teksgrootte, grootdruk, groot lettertipe, groot teks, swak sig, maak teks groter, teksvergroter, lettertipevergroting"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"altyd-aan-stemmingsaansig, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, merker, leser"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"sleutelbord, tasbare terugvoer, vibreer,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibrasie, Moenie Steur Nie"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Mediavolume"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Uitsaaivolume"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Laat toegang toe om alle lêers te bestuur"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Laat hierdie program toe om alle lêers op hierdie toestel of enige gekoppelde bergingvolumes te lees, te wysig en uit te vee. Indien toestemming verleen word, kan die program sonder jou uitdruklike medewete by lêers ingaan."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Kan by alle lêers ingaan"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Volskermkennisgewings"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Laat volskermkennisgewings van hierdie app af toe"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Laat hierdie app toe om kennisgewings te wys wat die volle skerm beslaan wanneer die toestel gesluit is. Apps kan dit gebruik om wekkers, inkomende oproepe en ander dringende kennisgewings uit te lig."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Gaan appaktiwiteit na vir uitvissing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Gebruik skandering"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Gebruik skandering vir werkapps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Skandering word privaat direk op jou toestel gedoen en gaan appaktiwiteit na vir uitvissing of ander misleidende optrede. As dit bespeur word, word sekere inligting na Google Play Beskerming toe gestuur om die bedreiging te bevestig en appgebruikers te waarsku."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Dit is ’n beskermde sekuriteitskenmerk. Geen toestel of persoonlike inligting word met Google gedeel nie. \n\nUitvissing is ’n poging om aanmeldeiebewyse of ander persoonlike inligting te steel."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 6711951..a28293c 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"የብሉቱዝ LE ኦዲዮን ያሰናክሉ"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"መሣሪያው የLE ኦዲዮ ሃርድዌር ችሎታዎችን የሚደግፍ ከሆነ የብሉቱዝ ኦዲዮ ባህሪን ያሰናክላል።"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"በመሣሪያ ዝርዝሮች ውስጥ LE ኦዲዮ መቀያየሪያን አሳይ"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"የብሉቱዝ LE ኦዲዮ የተፈቀዱ ዝርዝርን እለፍ"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE ኦዲዮ ተቀጥላ የተፈቀዱ ዝርዝር መስፈርቶችን እንደሚያሟላ ባይረጋገጥም እንኳን LE ኦዲዮን በነባሪ መጠቀም።"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"የማህደረ መረጃ መሣሪያዎች"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ወደ መሣሪያዎች ደውል"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ሌሎች መሣሪያዎች"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"የተቀመጡ መሣሪያዎች"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ከመለያ ጋር የተጎዳኘ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ቀደም ብሎ በመለያ ጥቅም ላይ ውሏል"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ብሉቱዝ ለማጣመር ይበራል"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"የግንኙነት ምርጫዎች"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ከዚህ ቀደም የተገናኘ"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"በጽሑፍ መስኮች ውስጥ ይፃፉ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ሁሉንም የብሮስፌ አዝራር መጫኖችን ችላ ይበሉ"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ብሮስፌ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ኦዲዮ ማጋራት"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ኦዲዮ ያጋሩ"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ጥሪዎች እና ማንቂያ ደወሎች"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"ከLE ኦዲዮ ዥረት ጋር ያገናኙ"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"በአቅራቢያ ያሉ ኦዲዮ ዥረቶች"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ኦዲዮ ዥረቶች"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR ኮድ በመጠቀም ከኦዲዮ ዥረት ጋር ያገናኙ"</string>
<string name="date_and_time" msgid="1788358029823431692">"ቀን እና ሰዓት"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ተኪ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"አጽዳ"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"የግል ቦታ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"በግል አቃፊ ውስጥ መተግበሪያዎችን ይደብቁ"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ማያ ገጽ መቆለፊያን በመጠቀም ክፈት"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"የግል ቦታን አሳይ"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"በሚቆለፍበት ጊዜ ደብቅ"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"በሚቆለፍበት ጊዜ የግል ቦታን ይደብቁ"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ሌሎች ሰዎች የግል ቦታ መሣሪያዎ ላይ እንደበራ ማወቃቸውን ለማቆም ከመተግበሪያዎ ዝርዝር ሊደብቁት ይችላሉ"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"በሚደበቅበት ጊዜ የግል ቦታን ይድረሱ"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"በፍለጋ አሞሌው ውስጥ «የግል ቦታ» ብለው ይፈልጉ"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"የግል ቦታ ሰቁን መታ ያድርጉ"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"የግል ቦታዎን ይክፈቱ"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ጠፍቷል"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"በርቷል"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ሥርዓት"</string>
<string name="private_space_create_title" msgid="47273568884806726">"የግል ቦታን ፍጠር"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"የግል ቦታን ሰርዝ"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"የግል ቦታ መፈጠር አልቻለም"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"የግል ቦታ በተሳካ ሁኔታ ተሰርዟል"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"የግል ቦታ መሰረዝ አልቻለም"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ማያ ገፅ መቆለፊያን ያቀናብሩ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"የግል ቦታን ለመጠቀም በዚህ መሣሪያ ላይ ማያ ገፅ መቆለፊያን ያቀናብሩ።"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ማያ ገፅ መቆለፊያን አቀናብር"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ይቅር"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ይቅር"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"አዋቅር"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"የግል ቦታን ያዋቅሩ"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"የግል መተግበሪያዎችን እርስዎ ብቻ መደረስ የሚችሉበት ደህንነቱ የተጠበቀ ቦታ ውስጥ ይደብቁ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"እንዴት እንደሚሠራ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ከመተግበሪያዎ ዝርዝር የታችኛው ክፍል ላይ የግል ቦታን መድረስ ይችላሉ"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"በግል ቦታ ውስጥ ያሉ መተግበሪያዎች በቁልፍ ጥበቃ ይደረግላቸዋል"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"በሚቆለፍበት ጊዜ የግል ቦታ ውስጥ ካሉ መተግበሪያዎች የሚመጡ ማሳወቂያዎች ይደበቃሉ"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"የግል ቦታ በሚቆለፍበት ጊዜ የግል ቦታ መተግበሪያዎች በፈቃድ አስተዳዳሪ፣ የግላዊነት ዳሽቦርድ እና ሌሎች ቅንብሮች ውስጥ አይታዩም"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"የግል ቦታን በማዋቀር ላይ…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"የግል ቦታ በቁልፍ ይጠበቃል"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ሲቆለፍ የአጠቃቀም መረጃ ለግል ቦታ መተግበሪያዎች የተደበቀ ነው"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ከእርስዎ የመተግበሪያዎች ዝርዝር የግል ቦታን ይድረሱ"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"የግል ቦታን ማዋቀር አልተቻለም"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"አሁን እንደገና ይሞክሩ ወይም በኋላ ተመልሰው ይምጡ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"እንደገና ይሞክሩ"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ለመክፈት ማያ ገፅ መቆለፊያን ይጠቀሙ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"የግል ቦታ መሣሪያዎን በሚቆልፉበት ተመሳሳይ መንገድ መክፈት ወይም የተለየ ቁልፍ መምረጥ ይችላሉ"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ማያ ገፅ መቆለፊያን ይጠቀሙ"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"አዲስ ቁልፍ ይምረጡ"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"ሁሉም ዝግጁ!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"የግል ቦታን ለመድረስ ከመነሻ ማያ ገፅዎ ግርጌ ወደላይ ያንሸራትቱ፣ ከዚያም ወደታች ያሸብልሉ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ተከናውኗል"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"የግል ቦታን ለመድረስ ወደ ታች ያሸብልሉ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"እስከ <xliff:g id="COUNT">%d</xliff:g> የሚደርሱ የጣት አሻራዎችን ማከል ይችላሉ"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"የሚፈቀደውን ከፍተኛ የጣት አሻራ ብዛት አክለዋል"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"ተጨማሪ የጣት አሻራዎችን ማከል አይቻልም"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"መተግበሪያዎችን በእጠፍ ላይ መጠቀም ቀጥል"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"ለስላሳ ማሳያ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"ለአንዳንድ ይዘት የማደሻ ፍጥነቱን በራስ-ሰር ከ60 ወደ <xliff:g id="ID_1">%1$s</xliff:g> ኸርዝ ያሳድገዋል። የባትሪ አጠቃቀምን ይጨምራል።"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"ለአንዳንድ ይዘት የዕድሳት ፍጥነቱን በራስ-ሰር እስከ <xliff:g id="ID_1">%1$d</xliff:g> ኸርዝ ድረስ ያሳድገዋል። የባትሪ አጠቃቀምን ይጨምራል።"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ከፍተኛ የእድሳት ፍጥነትን አስገድድ"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"ለተሻሻለ የንክኪ አጸፋ እና የእነማ ጥራት በጣም ከፍተኛው ዕድሳት ፍጥነት የባትሪ ፍጆታን ይጨምራል።"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"የማያ ገፅ ትኩረት"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"የጋራ ቅንብሮች"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"የመዳረሻ ነጥብ አርትዕ"</string>
+ <string name="apn_add" msgid="9069613192201630934">"የመዳረሻ ነጥብ ያክሉ"</string>
<string name="apn_not_set" msgid="8246646433109750293">"አልተዘጋጀም"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"አልተቀናበረም"</string>
<string name="apn_name" msgid="6677695784108157953">"ስም"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ለመክፈት የተደራሽነት አዝራር ይጠቀሙ"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"ለመክፈት የድምጽ ቁልፎችን ይያዙ"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ለመክፈት ማያ ገጹን ሦስት ጊዜ መታ ያድርጉ"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ለመክፈት ማያ ገፅን በሁለት ጣት ሦስት ጊዜ መታ ያድርጉ"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ለመክፈት የጣት ምልክትን ይጠቀሙ"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"የተደራሽነት እጅ ምልክትን ይጠቀሙ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ይህን ባህሪ ለመጠቀም በማያ ገጽዎ ግርጌ ላይ ያለውን የተደራሽነት አዝራሩን <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> መታ ያድርጉ።\n\nባህሪያት መካከል ለመቀያየር የተደራሽነት አዝራሩን ነክተው ይያዙ።"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ይህን ባህሪ ለመጠቀም በማያ ገጽዎ ላይ ያለውን የተደራሽነት አዝራር መታ ያድርጉ።"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ይህን ባህሪ ለመጠቀም ሁለቱንም የድምጽ ቁልፎች ተጭነው ይያዙ።"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ማጉላትን ለመጀመር እና ለማቆም በማያ ገጽዎ ላይ ማንኛውም ቦታ ላይ ሦስት ጊዜ መታ ያድርጉ።"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ማጉላት ለመጀመር እና ለማቆም በማያ ገፅዎ ማንኛውም ቦታ ላይ በሁለት ጣቶች ሦስት ጊዜ መታ ያድርጉ።"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ይህን ባህሪ ለመጠቀም በ2 ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ።\n\nበባሕሪያት መካከል ለመቀያየር በ2 ጣቶች ወደ ላይ ጠርገው ይያዙ።"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ይህን ባህሪ ለመጠቀም በ3 ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ።\n\nበባሕሪያት መካከል ለመቀያየር በ3 ጣቶች ወደ ላይ ጠርገው ይያዙ።"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"የተደራሽነት ባሕሪን ለመጠቀም በ2 ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ።\n\nበባሕሪያት መካከል ለመቀያየር በ2 ጣቶች ወደ ላይ ጠርገው ይያዙ።"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"የድምፅ አዝራሮችን ይያዙ"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"የድምጽ አዝራሮችን ይያዙ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ሁለቱንም የድምፅ ቁልፎች ተጭነው ይያዙ"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ማያ ገፅን በሁለት ጣት ሦስት ጊዜ መታ ያድርጉ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ማያ ገፅን በሁለት ጣት ሦስት ጊዜ መታ ያድርጉ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ማያ ገፅን {0፣ቁጥር፣ኢንቲጀር} ጊዜያት በሁለት ጣቶች በፍጥነት መታ ያድርጉ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ማያ ገጽን ሦስቴ መታ ያድርጉ"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ማያ ገጽን ሦስቴ መታ ያድርጉ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ማያ ገጹን በፍጥነት {0,number,integer} ጊዜዎችን መታ ያድርጉ። ይህ አቋራጭ መሣሪያዎን ሊያንቀራፍፈው ይችላል።"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ንዝረት እና ረቂቅ ንዝረትን ይጠቀሙ"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"የማንቂያ ንዝረት"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"የሚዲያ ንዝረት"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"የቁልፍ ሰሌዳ ንዝረት"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"የጥሪ ንዝረት"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"የማሳወቂያ ንዝረት"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"የንክኪ ግብረመልስ"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"የአንድ መተግበሪያ የጀርባ እንቅስቃሴን ከገደቡ ያልተገባ ባህሪ ሊያሳይ ይችላል"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ይህ መተግበሪያ ባትሪን ለማላቅ አልተቀናበረም፣ ሊገድቡት አይችሉም።\n\nመተግበሪያውን ለመገደብ፣ የባትሪ ማላቅን በመጀመሪያ ያብሩ።"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"የባትሪ አጠቃቀምን ያስተዳድሩ"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"የዳራ አጠቃቀምን ይፍቀዱ"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"ለእውነተኛ ጊዜ ዝማኔዎች ያንቁ፣ ባትሪን ለመቆጠብ ያሰናክሉ"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ያልተገደበ"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"እንዲተባ ተደርጓል"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ተገድቧል"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"የጽሁፍ መጠን፣ ትልቅ ህትመት፣ ትልቅ ቅርጸ-ቁምፊ፣ ትልቅ ጽሁፍ፣ ዝቅተኛ-ዕይታ፣ ጽሁፍን ያተልቁ መጠን፣ ትልቅ ህትመት፣ ትልቅ ቅርጸ-ቁምፊ፣ ትልቅ ጽሁፍ፣ ዝቅተኛ-ዕይታ፣ ጽሁፍን ያተልቁ፣ ቅርጸ-ቁምፊ ማተለቂያ፣ ቅርጸ-ቁምፊ ማተለቅ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ሁልጊዜ የበራ የድባብ ማሳያ፣ AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"የኤንኤፍሲ፣ መለያ፣ አንባቢ"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"የቁልፍ ሰሌዳ፣ ረቂቅ ንዝረት፣ ንዝረት፣"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ድምፅ፣ ንዝረት፣ አትረብሽ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"የማህደረመረጃ ክፍልፍል"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ድምፅን Cast አድርግ"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ሁሉንም ፋይሎች ለማስተዳደር መዳረሻ ፍቀድ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ይህ መተግበሪያ በዚህ መሣሪያ ላይ ወይም በማናቸውም የተገናኙ የማከማቻ መጠኖች ላይ ሁሉንም ፋይሎች እንዲያነብ፣ እንዲያሻሽል እና እንዲሰርዝ ይፍቀዱ። ፈቃድ ከተሰጠ፣ መተግበሪያ ያለ የእርስዎ ግልፅ የሆነ ዕውቀት ፋይሎችን መድረስ ይችላል።"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ሁሉንም ፋይሎች መድረስ ይችላል"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"የሙሉ ገጽ ዕይታ ማሳወቂያዎች"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ከዚህ መተግበሪያ የሙሉ ገጽ ዕይታ ማሳወቂያዎችን ይፍቀዱ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ይህ መተግበሪያ መሣሪያው በሚቆለፍበት ጊዜ ሙሉ ገጽ ዕይታውን የሚይዙ ማሳወቂያዎችን እንዲያሳይ ይፍቀዱለት። መተግበሪያዎች ማንቂያዎችን፣ ገቢ ጥሪዎችን ወይም ሌሎች አስቸኳይ ማሳወቂያዎችን ለማድመቅ እነዚህን ሊጠቀሙ ይችላሉ።"</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"የመሣሪያዎ ስም በጫኗቸው መተግበሪያዎች ላይ ይታያል። እንዲሁም ከብሉቱዝ መሣሪያዎች ጋር ሲገናኙ፣ ከWi-Fi አውታረ መረብ ሲገናኙ ወይም የWi-Fi መገናኛ ነጥብን ሲያዋቅሩ በሌሎች ሰዎች ሊታይ ይችላል።"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"ሰዋሰዋዊ ጾታ"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"ሰዋሰዋዊ ጾታ ይምረጡ"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"አታላይ የሆኑ መተግበሪያዎችን በመቃኘት ላይ"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"ማስገርን በተመለከተ የመተግበሪያ እንቅስቃሴን ይፈትሹ"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"መቃኘትን ተጠቀም"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ለሥራ መተግበሪያዎች መቃኘትን ተጠቀም"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 66d4be9..655dcdd 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"إيقاف ميزة Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"يؤدي هذا الخيار إلى إيقاف ميزة Bluetooth LE audio إذا كان الجهاز متوافقًا مع إمكانيات جهاز الصوت المنخفض الطاقة."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"إظهار خيار تفعيل LE Audio أو إيقافه في تفاصيل الجهاز"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"استبعاد القائمة المسموح بها لتطبيق Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"استخدِم تطبيق LE Audio تلقائيًا حتى إذا لم يتم التأكّد من توافق الجهاز الملحق مع معايير القائمة المسموح بها."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"أجهزة الوسائط"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"أجهزة الاتصال"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"أجهزة أخرى"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"الأجهزة المحفوظة"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"الأجهزة المرتبطة بالحساب"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"الأجهزة التي سبق استخدام الحساب عليها"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"سيتم تفعيل البلوتوث للإقران."</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"إعدادات الاتصال المفضّلة"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"الأجهزة المتصلة سابقًا"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"الكتابة بخط اليد في الحقول النصية"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"تجاهل كل الأزرار التي تم الضغط عليها باستخدام قلم الشاشة"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"قلم الشاشة"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"مشاركة الصوت"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"مشاركة الصوت"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"المكالمات والمنبّهات"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"التاريخ والوقت"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"الخادم الوكيل"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"محو"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"مساحة خاصة"</string>
<string name="private_space_summary" msgid="8237652417163408001">"إخفاء التطبيقات في مجلّد خاص"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"فتح القفل باستخدام قفل الشاشة"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"عرض المساحة الخاصة"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"الإخفاء بعد القفل"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"إخفاء المساحة الخاصة إذا كانت مقفلة"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"يمكنك إخفاء المساحة الخاصة من قائمة التطبيقات على جهازك لمنع وصول الآخرين إليها."</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"الوصول إلى المساحة الخاصة بعد إخفائها"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ابحث عن \"المساحة الخاصة\" في شريط البحث."</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"انقر على مربّع \"المساحة الخاصة\"."</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"افتح قفل المساحة الخاصة."</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"غير مفعَّل"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"مفعَّل"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"النظام"</string>
<string name="private_space_create_title" msgid="47273568884806726">"إنشاء مساحة خاصة"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"حذف المساحة الخاصة"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"تعذَّر إنشاء مساحة خاصة."</string>
<string name="private_space_deleted" msgid="7825768516955610897">"تم حذف المساحة الخاصة بنجاح."</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"تعذَّر حذف المساحة الخاصة."</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ضبط قفل شاشة"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"لاستخدام \"مساحة خاصة\"، يجب ضبط قفل شاشة على هذا الجهاز."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ضبط قفل الشاشة"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"إلغاء"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"إلغاء"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"إعداد"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"بدء إعداد المساحة الخاصة"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"يمكنك إخفاء التطبيقات الخاصة في مكان آمن لا يمكن لأحد غيرك الوصول إليه."</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"طريقة العمل"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"يمكنك الوصول إلى المساحة الخاصة من أسفل قائمة التطبيقات."</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"تتم حماية التطبيقات في المساحة الخاصة بقفل."</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"يتم إخفاء الإشعارات الواردة من تطبيقات المساحة الخاصة إذا كانت المساحة مقفلة."</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"لن تظهر تطبيقات المساحة الخاصة في \"إدارة الأذونات\" أو \"لوحة بيانات الخصوصية\" أو الإعدادات الأخرى إذا كانت المساحة الخاصة مقفلة."</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"جارٍ إعداد المساحة الخاصة…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"المساحة الخاصة محمية بقفل"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"معلومات الاستخدام المتعلّقة بتطبيقات المساحة الخاصة لا تظهر عندما تكون المساحة مقفلة"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"الوصول إلى المساحة الخاصة من قائمة التطبيقات"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"تعذُّر إعداد المساحة الخاصة"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"يُرجى إعادة المحاولة الآن أو إعدادها لاحقًا."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"إعادة المحاولة"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"أتريد استخدام قفل الشاشة لفتح قفل المساحة الخاصة؟"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"يمكنك فتح قفل المساحة الخاصة بالطريقة نفسها المستخدَمة لفتح قفل هاتفك، أو اختيار طريقة أخرى."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"استخدام قفل الشاشة"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"اختيار قفل جديد"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"اكتملت عملية الإعداد"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"للوصول إلى المساحة الخاصة، مرِّر سريعًا من أسفل الشاشة الرئيسية إلى أعلاها ثم انتقِل للأسفل."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"تم"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"انتقِل للأسفل للوصول إلى المساحة الخاصة."</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"يمكنك إضافة ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> بصمات إصبع"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"لقد أضفت الحد الأقصى لعدد بصمات الإصبع"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"يتعذر إضافة مزيد من بصمات الإصبع"</string>
@@ -975,9 +1021,9 @@
<string name="wifi_hotspot_speed_2g_summary" msgid="6930273933810520155">"السرعات الأبطأ: متوافقة مع معظم الأجهزة"</string>
<string name="wifi_hotspot_speed_5g" msgid="4058116867148848395">"5 غيغاهرتز"</string>
<string name="wifi_hotspot_speed_5g_summary" msgid="562987935924535694">"السرعات العالية: متوافقة مع أجهزة كثرة"</string>
- <string name="wifi_hotspot_speed_2g_5g" msgid="9192756255938408285">"2.4 و5 غيغاهرتز"</string>
+ <string name="wifi_hotspot_speed_2g_5g" msgid="9192756255938408285">"٢.٤ و٥ غيغاهرتز"</string>
<string name="wifi_hotspot_speed_2g_5g_summary" msgid="8104575293617700173">"السرعات العالية: نقطة الاتصال المزدوجة النطاق هذه متوافقة مع معظم الأجهزة."</string>
- <string name="wifi_hotspot_speed_6g" msgid="3787697484862730500">"6 غيغاهرتز"</string>
+ <string name="wifi_hotspot_speed_6g" msgid="3787697484862730500">"٦ غيغاهرتز"</string>
<string name="wifi_hotspot_speed_6g_summary" msgid="8675262219242174548">"السرعات الأعلى: متوافقة مع أجهزة قليلة"</string>
<string name="wifi_hotspot_speed_summary_unavailable" msgid="7276080644693388756">"لا تتوفّر هذه السرعة في بلدك أو منطقتك."</string>
<string name="wifi_hotspot_speed_footer" msgid="8846939503916795002">"إذا كان معدّل التردد المفضّل لديك غير متاح، قد تستخدم نقطة الاتصال معدّل تردد مختلف. قد تتغير إعدادات أمان نقطة الاتصال في حال تغيير معدّل التردد."</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"مواصلة استخدام التطبيقات أثناء طيّ الهاتف"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"العرض السلس"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"تعمل هذه الميزة على رفع معدل التحديث تلقائيًا من 60 إلى <xliff:g id="ID_1">%1$s</xliff:g> هرتز لبعض أنواع المحتوى. يؤدي هذا إلى زيادة استخدام البطارية."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"تعمل هذه الميزة على رفع معدّل التحديث في الشاشة إلى <xliff:g id="ID_1">%1$d</xliff:g> هرتز لبعض أنواع المحتوى، علمًا بأنّ ذلك يؤدي زيادة استخدام البطارية."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"فرض معدل إعادة التحميل الأقصى"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"أعلى معدل إعادة تحميل لتحسين استجابة اللمس وجودة الصور المتحركة. يؤدي هذا إلى زيادة استخدام البطارية."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"استعراض الشاشة"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"الإعدادات المشتركة"</string>
<string name="apn_settings" msgid="4295467389400441299">"أسماء نقاط الوصول"</string>
<string name="apn_edit" msgid="2003683641840248741">"تعديل نقطة الوصول"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"لم يتم الضبط."</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"لم يتم ضبط أي قيمة."</string>
<string name="apn_name" msgid="6677695784108157953">"الاسم"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"الفتح باستخدام زر \"أدوات تسهيل الاستخدام\""</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"اضغط مع الاستمرار على مفتاحَي مستوى الصوت لتفعيل الميزة"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"انقر على الشاشة ثلاث مرات لتفعيل الميزة"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"النقر ثلاث مرّات بإصبعين لفتح الشاشة"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"استخدام إيماءة للفتح"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"استخدام إيماءة تسهيل الاستخدام"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"لاستخدام هذه الميزة، انقر على زر أدوات تمكين الوصول <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> في أسفل الشاشة.\n\nللتبديل بين الميزات، انقر مع الاستمرار على زر أدوات تمكين الوصول."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"لاستخدام هذه الميزة، انقر على زر أدوات تسهيل الاستخدام في شاشتك."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"لاستخدام هذه الميزة، اضغط مع الاستمرار على كلا مفتاحَي مستوى الصوت."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"لبدء استخدام ميزة التكبير أو إيقافها، انقر ثلاث مرات في أي مكان على الشاشة."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"لبدء استخدام ميزة التكبير أو إيقافها، انقر ثلاث مرّات في أي مكان على الشاشة باستخدام إصبعين."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"لاستخدام هذه الميزة، مرِّر سريعًا من أسفل الشاشة للأعلى بإصبعين.\n\nللتبديل بين الميزات، مرِّر سريعًا للأعلى بإصبعين مع تثبيتهما."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"لاستخدام إحدى ميزات إمكانية الوصول، مرّر سريعًا من أسفل الشاشة للأعلى بثلاثة أصابع.\n\nللتبديل بين الميزات، مرّر سريعًا للأعلى بثلاثة أصابع مع تثبيتها."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"لاستخدام إحدى ميزات إمكانية الوصول، مرّر سريعًا من أسفل الشاشة للأعلى بإصبعين.\n\nللتبديل بين الميزات، مرّر سريعًا للأعلى بإصبعين مع تثبيتهما."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"الضغط مع الاستمرار على مفتاحَي التحكم في مستوى الصوت"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"الضغط مع الاستمرار على مفتاحَي التحكّم في مستوى الصوت"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"اضغط مع الاستمرار على مفتاحَي مستوى الصوت."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"النقر ثلاث مرّات على الشاشة بإصبعين"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"النقر ثلاث مرّات على الشاشة بإصبعين"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"انقر سريعًا على الشاشة {0,number,integer} مرّات باستخدام إصبعين."</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"النقر ثلاث مرات على الشاشة"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"النقر ثلاث مرات على الشاشة"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"انقر على الشاشة {0,number,integer} مرة. يمكن أن يؤدي استخدام هذا الاختصار إلى إبطاء الجهاز."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"استخدام الاهتزاز واللمس"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"اهتزاز المنبّه"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"اهتزاز الوسائط"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"اهتزاز لوحة المفاتيح"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"الاهتزاز عند الرنين"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"الاهتزاز عند تلقّي إشعارات"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"الاهتزاز عند لمس الشاشة"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"قد يتأثر أداء أحد التطبيقات سلبًا في حالة وضع حد لنشاطه في الخلفية"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"نظرًا لعدم تعيين هذا التطبيق للعمل على تحسين البطارية، فلا يمكنك تقييده.\n\nلتقييد التطبيق، فعِّل ميزة تحسين البطارية أولاً."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"إدارة استخدام البطارية"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"الاستخدام غير المحدّد بقيود"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"الاستخدام المحسَّن"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"الاستخدام المحدّد بقيود"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"حجم النص، طباعة كبيرة، خط كبير، نص كبير، ضعف في النظر، تكبير النص، أداة تكبير الخط، تكبير الخط"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"عرض دائم لشاشة الاستراحة، AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"قارئ، علامة، nfc"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"لوحة المفاتيح، تقنية اللمس، الاهتزاز،"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"مستوى الصوت والاهتزاز ووضع\"عدم الإزعاج\""</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"مستوى صوت الوسائط"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"مستوى صوت الإرسال"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"السماح بالوصول إلى كل الملفات لإدارتها"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"يسمح هذا الإعداد لهذا التطبيق بقراءة كل الملفات وتعديلها وحذفها من هذا الجهاز أو أي وحدات تخزين متصلة. في حال تفعيله، يمكن أن يصل التطبيق إلى الملفات بدون إعلامك بذلك."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"يمكن الوصول إلى كل الملفات"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"الإشعارات بملء الشاشة"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"السماح بعرض الإشعارات من هذا التطبيق بملء الشاشة"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"يتم السماح لهذا التطبيق بعرض إشعارات بملء الشاشة عندما يكون الجهاز مُقفَلاً. قد تستخدم التطبيقات هذا الإذن لإبراز المنبّهات أو المكالمات الواردة أو غيرها من الإشعارات العاجلة."</string>
@@ -4888,6 +4949,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"التحقُّق من النشاط على التطبيقات بحثًا عن محاولات التصيّد الاحتيالي"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"استخدام الفحص"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"استخدام الفحص مع تطبيقات العمل"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"تُجرى عمليات الفحص بخصوصية تامة على جهازك مباشرةً للتحقُّق من النشاط على التطبيقات بحثًا عن محاولات التصيّد الاحتيالي أو السلوكيات المخادعة الأخرى. وفي حال رصد سلوك مريب بأحد التطبيقات، تُرسَل بيانات هذا التطبيق إلى ميزة \"Google Play للحماية\" من أجل تأكيد التهديد وتحذير مستخدمي ذلك التطبيق."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"هذه ميزة أمان محمية. لا تتم مشاركة أي معلومات شخصية أو معلومات حول الجهاز مع Google. \n\nالتصيّد الاحتيالي هو محاولة للاستيلاء على بيانات اعتماد تسجيل الدخول أو غيرها من المعلومات الشخصية."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index b0b14ad..74222d1 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -25,8 +25,8 @@
<string name="device_info_default" msgid="1406619232867343310">"অজ্ঞাত"</string>
<string name="device_info_protected_single_press" msgid="3810785480060743677">"তথ্য দেখুৱাবলৈ টিপক"</string>
<string name="show_dev_countdown" msgid="2936506773086395069">"{count,plural, =1{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে।}one{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে।}other{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে।}}"</string>
- <string name="show_dev_on" msgid="2840850085134853754">"এতিয়া আপুনি এজন বিকাশকৰ্তা!"</string>
- <string name="show_dev_already" msgid="7041756429707644630">"কোনো প্ৰয়োজন নাই, আপুনি ইতিমধ্যে এজন ডেভেলপাৰ।"</string>
+ <string name="show_dev_on" msgid="2840850085134853754">"এতিয়া আপুনি এগৰাকী বিকাশকৰ্তা!"</string>
+ <string name="show_dev_already" msgid="7041756429707644630">"কোনো প্ৰয়োজন নাই, আপুনি ইতিমধ্যে এগৰাকী ডেভেলপাৰ।"</string>
<string name="dev_settings_disabled_warning" msgid="6971867026249671244">"অনুগ্ৰহ কৰি প্ৰথমে বিকাশকৰ্তাৰ বিকল্পসমূহ সক্ষম কৰক।"</string>
<string name="header_category_system" msgid="1665516346845259058">"ছিষ্টেম"</string>
<string name="radioInfo_service_in" msgid="9088637745836646271">"সেৱাত আছে"</string>
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ব্লুটুথ LE অডিঅ’ অক্ষম কৰক"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ডিভাইচটোৱে LE অডিঅ’ হাৰ্ডৱেৰ ক্ষমতাসমূহ সমৰ্থন কৰিলে ই ব্লুটুথ LE অডিঅ’ সুবিধাসমূহ অক্ষম কৰে।"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ডিভাইচৰ সবিশেষত LE অডিঅ’ৰ ট’গল দেখুৱাওক"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ব্লুটুথ LE অডিঅ’ৰ অনুমতি দিয়া সূচী বাইপাছ কৰক"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE অডিঅ’ৰ পৰিধীয় ডিভাইচে অনুমতি দিয়া সূচীৰ যোগ্যতাৰ মাপকাঠী মানি চলিছে বুলি সত্যাপন নকৰিলেও ডিফ’ল্ট হিচাপে LE অডিঅ’ ব্যৱহাৰ কৰক।"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"মিডিয়া ডিভাইচসমূহ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"কল ডিভাইচসমূহ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"অন্য ডিভাইচসমূহ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"ছেভ কৰি থোৱা ডিভাইচসমূহ"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"একাউণ্টৰ সৈতে সম্পৰ্কিত"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"পূৰ্বতে একাউণ্টৰ সৈতে ব্যৱহাৰ কৰা হৈছে"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"পেয়াৰ কৰিবলৈ ব্লুটুথ অন হ’ব"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"সংযোগৰ অগ্ৰাধিকাৰসমূহ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"আগতে সংযোগ কৰা"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"পাঠৰ ক্ষেত্ৰসমূহত লিখক"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ষ্টাইলাছ বুটামত দিয়া আটাইবোৰ টিপা উপেক্ষা কৰক"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ষ্টাইলাছ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"অডিঅ’ শ্বেয়াৰ কৰা"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"অডিঅ’ শ্বেয়াৰ কৰক"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"কল আৰু এলাৰ্ম"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"তাৰিখ আৰু সময়"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"প্ৰক্সি"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"মচক"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ব্যক্তিগত স্পে’চ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"এপ্সমূহ এটা ব্যক্তিগত ফ’ল্ডাৰত লুকুৱাওক"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"স্ক্ৰীন লক ব্যৱহাৰ কৰি আনলক কৰক"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ব্যক্তিগত স্পে’চ দেখুৱাওক"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"লক হৈ থকাৰ সময়ত লুকুৱাওক"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"লক কৰি থোৱা অৱস্থাত ব্যক্তিগত স্পে’চ লুকুৱাওক"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"আপোনাৰ ডিভাইচত ব্যক্তিগত স্পে’চ অন হৈ থকাৰ বিষয়ে অন্য লোকে জনাটো বন্ধ কৰিবলৈ, আপুনি এইটো আপোনাৰ এপৰ সূচীৰ পৰা লুকুৱাব পাৰে"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"লুকুৱাই ৰখা অৱস্থাত ব্যক্তিগত স্পে’চ এক্সেছ কৰক"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"সন্ধানৰ বাৰত \'ব্যক্তিগত স্পে’চ\' সন্ধান কৰক"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ব্যক্তিগত স্পে’চ টাইলত টিপক"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ব্যক্তিগত স্পে’চ আনলক কৰক"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"অফ আছে"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"অন আছে"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ছিষ্টেম"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ব্যক্তিগত স্পে’চ সৃষ্টি কৰক"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ব্যক্তিগত স্পে’চ মচক"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ব্যক্তিগত স্পে’চ সৃষ্টি কৰিব পৰা নগ’ল"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ব্যক্তিগত স্পে’চ সফলতাৰে মচা হৈছে"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ব্যক্তিগত স্পে’চ মচিব পৰা নগ’ল"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"এটা স্ক্ৰীন লক ছেট কৰক"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ব্যক্তিগত স্পে’চ ব্যৱহাৰ কৰিবলৈ ডিভাইচত স্ক্ৰীন লক ছেট কৰক।"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"স্ক্ৰীন লক ছেট কৰক"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"বাতিল কৰক"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"বাতিল কৰক"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"ছেট আপ কৰক"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ব্যক্তিগত স্পে’চ ছেট আপ কৰক"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"কেৱল আপুনি এক্সেছ কৰিব পৰা এটা সুৰক্ষিত স্পে\'চত ব্যক্তিগত এপ্ লুকুৱাওক"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"এইটোৱে কেনেকৈ কাম কৰে"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"আপুনি আপোনাৰ এপৰ সূচীখনৰ একেবাৰে তলৰ পৰা ব্যক্তিগত স্পে’চ এক্সেছ কৰিব পাৰে"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ব্যক্তিগত স্পে’চত থকা এপ্ এটা লকেৰে সুৰক্ষিত কৰা হয়"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"ব্যক্তিগত স্পে’চ লক হৈ থাকিলে তাত থকা এপৰ জাননী লুকুওৱা হয়"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"ব্যক্তিগত স্পে’চ লক হৈ থাকিলে ব্যক্তিগত স্পে’চত থকা এপ্সমূহ অনুমতিৰ পৰিচালক, গোপনীয়তাৰ ডেশ্বব’ৰ্ড আৰু অন্য ছেটিঙত প্ৰদৰ্শিত নহ’ব"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"ব্যক্তিগত স্পে’চ ছেট আপ কৰি থকা হৈছে…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"ব্যক্তিগত স্পে’চ এটা লকৰ দ্বাৰা সুৰক্ষিত কৰা হয়"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ব্যক্তিগত স্পে’চত থকা এপৰ ব্যৱহাৰৰ তথ্য লুকুওৱা হয়, যদিহে এইটো লক হৈ থাকে"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"আপোনাৰ এপৰ সূচীৰ পৰা ব্যক্তিগত স্পে’চ এক্সেছ কৰক"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ব্যক্তিগত স্পে’চ ছেট আপ কৰিব পৰা নগ’ল"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"এতিয়াই পুনৰ চেষ্টা কৰক অথবা পাছত উভতি আহক"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"পুনৰ চেষ্টা কৰক"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"আনলক কৰিবলৈ স্ক্ৰীন লক ব্যৱহাৰ কৰিবনে?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"আপুনি আপোনাৰ ডিভাইচটো আনলক কৰিবলৈ ব্যৱহাৰ কৰা একেটা পদ্ধতি ব্যৱহাৰ কৰি ব্যক্তিগত স্পে’চ আনলক কৰিব পাৰে অথবা অন্য কোনো লক বাছনি কৰিব পাৰে"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"নতুন লক বাছনি কৰক"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"সকলো সাজু!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ব্যক্তিগত স্পে’চ এক্সেছ কৰিবলৈ, আপোনাৰ গৃহ স্ক্ৰীনৰ একেবাৰে তলৰ পৰা ওপৰলৈ ছোৱাইপ কৰক, তাৰ পাছত তললৈ স্ক্ৰ’ল কৰক"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"কৰা হ’ল"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"ব্যক্তিগত স্পে’চ এক্সেছ কৰিবলৈ তললৈ স্ক্ৰ’ল কৰক"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"আপুনি <xliff:g id="COUNT">%d</xliff:g> টালৈকে ফিংগাৰপ্ৰিণ্ট যোগ কৰিব পাৰে"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"আপুনি সৰ্বাধিক সংখ্যক ফিংগাৰপ্ৰিণ্টবোৰ যোগ কৰিছে"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"আৰু অধিক ফিংগাৰপ্ৰিণ্ট যোগ কৰিব নোৱাৰি"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"জপাই থোৱা অৱস্থাত এপ্ ব্যৱহাৰ কৰি থাকক"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"মসৃণ ডিছপ্লে’"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"কিছুমান সমলৰ বাবে ৰিফ্ৰেশ্বৰ হাৰ স্বয়ংক্ৰিয়ভাৱে ৬০ৰ পৰা <xliff:g id="ID_1">%1$s</xliff:g> হাৰ্টজলৈ বঢ়ায়। বেটাৰীৰ ব্যৱহাৰ বৃদ্ধি কৰে।"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"কিছুমান সমলৰ বাবে ৰিফ্ৰেশ্বৰ হাৰ স্বয়ংক্ৰিয়ভাৱে <xliff:g id="ID_1">%1$d</xliff:g> হাৰ্টজলৈ বঢ়ায়। বেটাৰীৰ ব্যৱহাৰ বৃদ্ধি কৰে।"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"সৰ্বাধিক ৰিফ্ৰেশ্বৰ হাৰ বলপূৰ্বকভাৱে প্ৰয়োগ কৰক"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"স্পৰ্শৰ উন্নত সংবেদনশীলতা আৰু এনিমেশ্বনৰ গুণগত মানৰ বাবে সৰ্বোচ্চ ৰিফ্ৰেশ্বৰ হাৰ। বেটাৰীৰ ব্যৱহাৰ বৃদ্ধি কৰে।"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"স্ক্ৰীনৰ সতর্কতা"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"সম্প্ৰদায়ৰ সৈতে জড়িত ছেটিং"</string>
<string name="apn_settings" msgid="4295467389400441299">"এপিএনসমূহ"</string>
<string name="apn_edit" msgid="2003683641840248741">"এক্সেছ পইণ্ট সম্পাদনা কৰক"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"ছেট কৰা হোৱা নাই"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"ছেট কৰা হোৱা নাই"</string>
<string name="apn_name" msgid="6677695784108157953">"নাম"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"খুলিবলৈ সাধ্য সুবিধাৰ বুটাম ব্যৱহাৰ কৰক"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"খুলিবলৈ ভলিউম কীসমূহ টিপি ধৰি থাকক"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"খুলিবলৈ স্ক্ৰীনখনত তিনিবাৰ টিপক"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"খুলিবলৈ দুটা আঙুলিৰে স্ক্ৰীনত তিনিবাৰ টিপা"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"খুলিবলৈ ভংগিমা ব্যৱহাৰ কৰক"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"সাধ্য সুবিধাৰ নিৰ্দেশ ব্যৱহাৰ কৰক"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ, আপোনাৰ স্ক্রীনখনৰ একেবাৰে তলৰ অংশত থকা সাধ্য-সুবিধাৰ বুটামটোত <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> টিপক।\n\nসুবিধাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ সাধ্য-সুবিধাৰ বুটামটো স্পৰ্শ কৰি ধৰি ৰাখক।"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ আপোনাৰ স্ক্ৰীনত থকা সাধ্য-সুবিধাৰ বুটামটোত টিপক।"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ, দুয়োটা ভলিউম কী টিপি ধৰি ৰাখক।"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"বিবৰ্ধন আৰম্ভ কৰিবলৈ আৰু বন্ধ কৰিবলৈ আপোনাৰ স্ক্ৰীনখনৰ যিকোনো অংশত তিনিবাৰ টিপক।"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"বিবৰ্ধন আৰম্ভ কৰিবলৈ আৰু বন্ধ কৰিবলৈ আপোনাৰ স্ক্ৰীনখনৰ যিকোনো অংশত দুটা আঙুলিৰে তিনিবাৰ টিপক।"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ, স্ক্রীনখনৰ একেবাৰে তলৰ পৰা ওপৰলৈ ২ টা আঙুলিৰে ছোৱাইপ কৰক।\n\nসুবিধাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ ২ টা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ, স্ক্রীনখনৰ একেবাৰে তলৰ পৰা ওপৰলৈ ৩ টা আঙুলিৰে ছোৱাইপ কৰক।\n\nসুবিধাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ ৩ টা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"কোনো এটা সাধ্য-সুবিধা ব্যৱহাৰ কৰিবলৈ, স্ক্রীনখনৰ একেবাৰে তলৰ পৰা ওপৰলৈ ২ টা আঙুলিৰে ছোৱাইপ কৰক।\n\nসুবিধাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ ২ টা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ভলিউম কীসমূহ ধৰি ৰাখক"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ভলিউম কীসমূহ হেঁচি ধৰি ৰাখক"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"দুয়োটা ভলিউম কী টিপক আৰু হেঁচি ৰাখক"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"দুটা আঙুলিৰে স্ক্ৰীনত তিনিবাৰ টিপা"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"দুটা আঙুলিৰে স্ক্ৰীনত তিনিবাৰ টিপা"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"দুটা আঙুলিৰে স্ক্ৰীনখনত খৰতকীয়াকৈ {0,number,integer} বাৰ টিপক"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"স্ক্রীনখনত তিনিবাৰ টিপক"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"স্ক্রীনখনত তিনিবাৰ টিপক"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"স্ক্ৰীনখনত ক্ষিপ্ৰতাৰে {0,number,integer} বাৰ টিপক। এই শ্বৰ্টকাটটোৱে আপোনাৰ ডিভাইচটো লেহেমীয়া কৰিব পাৰে"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"কম্পন আৰু হেপ্টিক ব্যৱহাৰ কৰক"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"এলাৰ্মৰ কম্পন"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"মিডিয়াৰ কম্পন"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"কীব’ৰ্ডৰ কম্পন"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ৰিং কম্পন"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"জাননীৰ কম্পন"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"স্পৰ্শৰ প্ৰতিক্ৰিয়া"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"আপুনি এটা এপৰ নেপথ্য কাৰ্যকলাপ সীমিত কৰিলে ই অস্বাভাৱিক আচৰণ কৰিব পাৰে"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"যিহেতু এই এপ্টো বেটাৰী অপ্টিমাইজ কৰিবলৈ ছেট কৰি থোৱা হোৱা নাই, সেয়ে ইয়াক আপুনি সীমিত কৰিব নোৱাৰে।\n\nএপ্টো সীমিত কৰিবলৈ প্ৰথমে বেটাৰী অপ্টিমাইজেশ্বন অন কৰক।"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"বেটাৰীৰ ব্যৱহাৰ পৰিচালনা কৰক"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"বাধাহীন"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"অপ্টিমাইজ কৰা"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"সীমিত"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"পাঠৰ আকাৰ, ডাঙৰ প্ৰিণ্ট, ডাঙৰ ফণ্ট, ডাঙৰ পাঠ, কম দৃষ্টিশক্তি, পাঠৰ আকাৰ ডাঙৰ কৰক, ফণ্ট প্ৰসাৰিত কৰোঁতা, ফণ্টৰ প্ৰসাৰণ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"এম্বিয়েণ্ট ডিছপ্লে’ সদায় অন কৰি ৰাখক, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, টেগ, ৰীডাৰ"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"কীব’ৰ্ড, হেপ্টিক্স, কম্পন কৰক,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ভলিউম, কম্পন, অসুবিধা নিদিব"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"মিডিয়াৰ ভলিউম"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ভলিউম কাষ্ট কৰক"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"আটাইবোৰ ফাইল পৰিচালনা কৰিবলৈ এক্সেছ দিয়ক"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"এই এপ্টোক এই ডিভাইচটোত অথবা অন্য যিকোনো সংযুক্ত ষ্ট’ৰেজৰ ভলিউমসমূহত আটাইবোৰ ফাইল পঢ়িবলৈ, সংশোধন কৰিবলৈ আৰু মচিবলৈ অনুমতি দিয়ক। যদি অনুমতি দিয়ে, আপোনাৰ নিশ্চিত জ্ঞানৰ অবিহনে এপে ফাইলবোৰ এক্সেছ কৰিব পাৰে।"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"আটাইবোৰ ফাইল এক্সেছ কৰিব পাৰে"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"সম্পূৰ্ণ স্ক্ৰীনৰ জাননী"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"এই এপ্টোৰ পৰা সম্পূৰ্ণ স্ক্ৰীনৰ জাননীৰ অনুমতি দিয়ক"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"এই এপ্টোক ডিভাইচ লক হৈ থাকোঁতে পূৰ্ণ স্ক্ৰীনত ওলোৱা জাননীসমূহ দেখুওৱাৰ অনুমতি দিয়ক। এপ্সমূহে এইবোৰ এলাৰ্ম, অন্তৰ্গামী কল অথবা অন্য জৰুৰী জাননীসমূহ হাইলাইট কৰিবলৈ ব্যৱহাৰ কৰিব পাৰে।"</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ফিশ্বিঙৰ বাবে এপৰ কাৰ্যকলাপ পৰীক্ষা কৰক"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"স্কেন কৰাৰ সুবিধা ব্যৱহাৰ কৰক"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"কাম সম্পর্কীয় এপৰ বাবে স্কেন কৰাৰ সুবিধা ব্যৱহাৰ কৰক"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"ফিশ্বিং বা অন্য প্ৰতাৰণামূলক আচৰণৰ বাবে এপৰ কাৰ্যকলাপ পৰীক্ষা কৰি থাকিবলৈ আপোনাৰ ডিভাইচত ব্যক্তিগতভাৱে স্কেনিং চলি থাকে। যদি এইটো ধৰা পৰে, ভাবুকিটো নিশ্চিত কৰিবলৈ আৰু এপৰ ব্যৱহাৰকাৰীসকলক সতৰ্ক কৰিবলৈ কিছুমান এপৰ তথ্য Google Play Protectলৈ প্ৰেৰণ কৰা হয়।"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"এইটো হৈছে এটা সুৰক্ষিত সুৰক্ষা সম্পৰ্কীয় সুবিধা। কোনো ডিভাইচ বা ব্যক্তিগত তথ্য Googleৰ সৈতে শ্বেয়াৰ কৰা নহয়। \n\nফিশ্বিং হৈছে ছাইন-ইন ক্ৰিডেনশ্বিয়েলসমূহ বা অন্য ব্যক্তিগত তথ্য চুৰি কৰাৰ এটা প্ৰয়াস।"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 1b21657..0a9ceb0 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE audionu deaktiv edin"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Cihaz LE audio avadanlıq imkanlarını dəstəkləyirsə, Bluetooth LE audio funksiyasını deaktiv edir."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE audio açarı görünsün: Cihaz detalları"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio üzrə icazə verilənlər siyahısına qoşulmayın"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio periferik cihazının icazə verilənlər siyahısı üzrə meyarlara cavab verdiyi doğrulanmasa da, defolt olaraq LE Audio istifadə edin."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Media cihazları"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Zəng cihazları"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Digər cihazlar"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Yadda saxlanmış cihazlar"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Hesab ilə əlaqələndirilib"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Əvvəllər hesab ilə istifadə edilib"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth qoşulmaq üçün aktiv ediləcək"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Bağlantı tərcihləri"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Öncə qoşulmuş cihazlar"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Mətn sahələrinə yazın"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Qələmlə düymə basılmalarını nəzərə almayın"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Qələm"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio paylaşımı"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Audio paylaşın"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Zəng və zəngli saatlar"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Vaxt və tarix"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proksi"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Təmizlə"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Şəxsi yer"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Tətbiqləri şəxsi qovluqda gizlədin"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Ekran kilidi ilə kiliddən çıxarın"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Şəxsi yeri göstərin"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Kilidli olduqda gizlədin"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Kilidli olduqda Private Space-i gizlədin"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Tətbiqlər siyahısında Private Space-i digərlərindən gizlədin"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Gizli olduqda Private Space-ə giriş"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Axtarış panelində \"Private Space\" axtarın"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Private Space mozaikinə toxunun"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Private Space-i kiliddən çıxarın"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Deaktiv"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Aktiv"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Şəxsi yer yaradın"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Şəxsi yeri silin"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Şəxsi yer yaradılmadı"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Şəxsi yer silindi"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Şəxsi yer silinmədi"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ekran kilidi quraşdırın"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Cihazda ekran kilidi quraşdırmaqla Məxfi Yeri istifadə edin."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ekran kilidi quraşdırın"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Ləğv edin"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Ləğv edin"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Ayarlayın"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Private Space ayarlayın"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Şəxsi tətbiqləri yalnız sizin daxil ola biləcəyiniz təhlükəsiz yerdə gizlədin"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Haqqında"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Tətbiq siyahısının aşağısından Private Space-ə daxil ola bilərsiniz"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Private Space-də tətbiqlər kilid ilə qorunur"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Şəxsi məkan kilidlənəndə tətbiq bildirişləri gizlədilir"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Şəxsi məkan kilidlənəndə Şəxsi məkan tətbiqləri icazə meneceri, məxfilik paneli və digər ayarlarda görünməyəcək"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Şəxsi məkan ayarlanır…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Şəxsi məkan kilid ilə qorunur"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Şəxsi məkan kilidlənəndə tətbiq istifadəsi məlumatları gizlədilir"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Şəxsi məkana tətbiq siyahınızdan daxil olun"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Şəxsi məkanı ayarlamaq olmadı"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Yenidən cəhd edin, yaxud sonra qayıdın"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Yenidən sınayın"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Kilidi açmaq üçün ekran kilidi istifadə edilsin?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Şəxsi məkanı cihaz kilidi ilə kiliddən çıxara və ya fərqli kilid seçə bilərsiniz"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Ekran kilidi istifadə edin"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Yeni kilid seçin"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Hər şey hazırdır!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Şəxsi məkana daxil olmaq üçün əsas ekranın aşağısından yuxarı sürüşdürüb, sonra aşağı sürüşdürün"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Hazırdır"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Şəxsi məkana giriş üçün aşağı sürüşdürün"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"<xliff:g id="COUNT">%d</xliff:g> ədədə qədər barmaq izi əlavə edə bilərsiniz"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Maksimum sayda barmaq izi əlavə etmisiniz"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Daha artıq barmaq izi əlavə edilə bilməz"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Qatlandıqda tətbiqlərdən istifadəyə davam edin"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Rahat Displey"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Bəzi kontent üçün 60-<xliff:g id="ID_1">%1$s</xliff:g> Hs yeniləmə dərəcəsini avtomatik artırır. Batareya istifadəsini artırır."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Bəzi kontentlər üçün yeniləmə dərəcəsini <xliff:g id="ID_1">%1$d</xliff:g> Hs-ə qədər avtomatik yüksəldir. Batareya istifadəsini artırır."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Pik yeniləmə dərəcəsini məcburi tətbiq edin"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Təzələnmə tezliyini artıraraq sensor həssaslığını və animasiya axıcılığını artırır. Enerji sərfiyyatını artırır."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Ekran həssaslığı"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Kommunal ayarlar"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-lər"</string>
<string name="apn_edit" msgid="2003683641840248741">"Giriş nöqtəsinə düzəliş edin"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Təyin edilməyib"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ayarlanmayıb"</string>
<string name="apn_name" msgid="6677695784108157953">"Ad"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Xüsusi imkanlar düyməsini istifadə edin"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Açmaq üçün səs düymələrini basıb saxlayın"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Açmaq üçün ekrana üç dəfə toxunun"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Açmaq üçün ekrana iki barmaqla üç dəfə toxunma"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Açmaq üçün jestdən istifadə edin"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Əlçatımlılıq jestindən istifadə edin"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Bu funksiyanı işlətmək üçün ekranın altındakı xüsusi imkanlar düyməsinə <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> toxunun.\n\nFunksiyadan funksiyaya keçmək üçün xüsusi imkanlar düyməsinə toxunub saxlayın."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Bu funksiyanı işlətmək üçün xüsusi imkanlar düyməsinə toxunun."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Bu funksiyanı istifadə etmək üçün hər iki səs düyməsini basıb saxlayın."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Böyütməni başlatmaq və dayandırmaq üçün ekranda istənilən yerə üç dəfə toxunun."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Böyütməni başlatmaq və dayandırmaq üçün ekrana iki barmaqla üç dəfə toxunun."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Bu funksiyanı istifadə etmək üçün 2 barmaq ilə ekranın aşağısından yuxarıya doğru sürüşdürün.\n\nFunksiyalar arasında keçid etmək üçün 2 barmaq ilə yuxarıya sürüşdürüb saxlayın."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Bu funksiyanı istifadə etmək üçün 3 barmaq ilə ekranın aşağısından yuxarıya doğru sürüşdürün.\n\nFunksiyalar arasında keçid etmək üçün 3 barmaq ilə yuxarıya sürüşdürüb saxlayın."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Əlçatımlılıq funksiyasını istifadə etmək üçün 2 barmaq ilə ekranın aşağısından yuxarıya doğru sürüşdürün.\n\nFunksiyalar arasında keçid etmək üçün 2 barmaq ilə yuxarıya sürüşdürüb saxlayın."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Səs düymələrinə basıb saxlayın"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"səs düymələrinə basıb saxlayın"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Hər iki səs düyməsini basıb saxlayın"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"İki barmaqla ekrana üç dəfə toxunma"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"iki barmaqla ekrana üç dəfə toxunma"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Ekrana iki barmaqla {0,number,integer} dəfə cəld toxunun"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ekrana üç dəfə toxunun"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ekrana üç dəfə toxunun"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ekrana {0,number,integer} dəfə cəld toxunun. Bu qısayol cihazınızı yavaşlada bilər"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Vibrasiya və taktil əks-əlaqədən istifadə edin"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Siqnal vibrasiyası"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Media vibrasiyası"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Klaviatura vibrasiyası"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Zəng vibrasiyası"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Bildiriş vibrasiyası"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Toxunuş vibrasiyası"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Tətbiqin arxa fon fəaliyyətini məhdudlaşdırsanız, o səhv işləyə bilər"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Bu tətbiq üçün enerji qənaəti aktiv deyil.\n\nMəhdudiyyət tətbiq etmək üçün onu aktivləşdirin."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Batareya istifadəsini idarə edin"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Məhdudiyyətsiz"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimal"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Məhdud"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"mətn ölçüsü, böyük çap, böyük şrift, böyük mətn, zəif görmə, mətni daha böyük et, şrift böyüdücü, şrift böyütmə"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"həmişə aktiv ambient displey, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, teq, oxuyucu"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klaviatura, taktil funksiyalar, vibrasiya,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Səs, vibrasiya, \"Narahat etməyin\" rejimi"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Media səsi"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Yayım həcmi"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Bütün faylları idarə etmək üçün giriş icazəsi verin"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Bu tətbiqə bu cihazda və ya qoşulmuş cihazların yaddaşındakı bütün faylları oxumaq, dəyişmək və silmək icazəsi verin. İcazə verilsə, tətbiq xəbəriniz olmadan fayllara daxil ola bilər."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Bütün fayllara daxil ola bilər"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Tam ekran bildirişləri"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Bu tətbiqin tam ekran bildirişlərinə icazə verin"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Bu tətbiqə cihaz kilidli olduqda tam ekranı tutan bildirişlər göstərmək icazəsi verin. Bunlar zəngli saat, gələn zəng və ya digər təcili bildirişlər üçündür."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Cihaz adı quraşdırdığınız tətbiqlərə görünür. Bluetooth cihazlarına, Wi-Fi şəbəkəsinə qoşulduqda və ya Wi-Fi hotspotu ayarladıqda digər şəxslər də onu görə bilər."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Cins (qrammatika)"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Cins (qrammatika) seçin"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Aldadıcı tətbiqlərin skanlanması"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Tətbiq fəaliyyətində fişinqin yoxlanması"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Skandan istifadə"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"İş tətbiqləri üçün skandan istifadə"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index c62b590..8b50ca1 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Onemogući Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Onemogućava funkciju Bluetooth LE audio ako uređaj podržava mogućnosti LE audio hardvera."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE Audio prekidač u detaljima o uređaju"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Zaobiđi Bluetooth LE Audio listu dozvoljenih"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Podrazumevano koristi LE Audio čak i ako nije potvrđeno da LE Audio periferni uređaj zadovoljava kriterijume liste dozvoljenih."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medijski uređaji"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Uređaji za pozivanje"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Drugi uređaji"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Sačuvani uređaji"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Povezano sa nalogom"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Prethodno korišćeno sa nalogom"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth će se uključiti radi uparivanja"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Podešavanja povezivanja"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Prethodno povezani"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Pišite u poljima za tekst"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignoriši sva pritiskanja dugmeta pomoću pisaljke"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Pisaljka"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Deljenje zvuka"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Deli zvuk"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Pozivi i alarmi"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Povežite se sa LE audio strimom"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Audio strimovi u blizini"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audio strimovi"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Povežite se sa audio strimom pomoću QR koda"</string>
<string name="date_and_time" msgid="1788358029823431692">"Datum i vreme"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proksi"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Obriši"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privatni prostor"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Sakrij aplikacije u privatnom folderu"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Otključaj pomoću otključavanja ekrana"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Sakrij privatni prostor"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Sakrij kad je zaključan"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Sakrijte privatni prostor kad je zaključan"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Privatni prostor možete da sakrijete sa liste aplikacija"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Pristupite privatnom prostoru kad je sakriven"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Potražite Privatni prostor na traci za pretragu"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Dodirnite pločicu Privatni prostor"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Otključajte privatni prostor"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Isključeno"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Uključeno"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Napravi privatni prostor"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Izbriši privatni prostor"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Pravljenje privatnog prostora nije uspelo"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privatni prostor je izbrisan"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Brisanje privatnog prostora nije uspelo"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Podesite zaključavanje ekrana"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Za privatni prostor podesite zaključavanje ekrana na uređaju."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Podesi zaključavanje ekrana"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Otkaži"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Otkaži"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Podesi"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Podesite privatni prostor"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Sakrijte privatne aplikacije u bezbednom prostoru kom samo vi možete da pristupite"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Princip rada"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Privatnom prostoru možete da pristupite sa dna liste aplikacija"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikacije u privatnom prostoru su zaključane"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Obaveštenja iz aplikacija privatnog prostora su skrivena kad je on zaključan"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikacije privatnog prostora neće se pojaviti u menadžeru dozvola, na kontrolnoj tabli za privatnost i u drugim podešavanjima kad je privatni prostor zaključan"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Podešava se privatni prostor…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privatni prostor je zaštićen zaključavanjem"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Informacije o korišćenju za aplikacije iz privatnog prostora su skrivene kada je zaključan"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Pristupajte privatnom prostoru sa liste aplikacija"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Podešavanje privatnog prostora nije uspelo"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Probajte ponovo sada ili se vratite kasnije"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Probaj ponovo"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Želite da otključate pomoću otključavanja ekrana?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Možete da otključavate privatni prostor isto kao što otključavate uređaj ili da odaberete drugačiji tip otključavanja"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Koristi otključavanje ekrana"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Odaberi novi tip zaključavanja"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Gotovo!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Da biste pristupali privatnom prostoru, prevucite nagore od dna početnog ekrana, pa skrolujte nadole"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Gotovo"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Skrolujte nadole da biste pristupali privatnom prostoru"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Možete da ih dodate do <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Dodali ste maksimalan broj otisaka prstiju"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Ne možete da dodate još otisaka prstiju"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Nastavi sa korišćenjem aplikacija pri preklapanju"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Tečan prikaz"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatski podiže učestalost osvežavanja sa 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz za određeni sadržaj. Povećava potrošnju baterije."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatski podiže učestalost osvežavanja do <xliff:g id="ID_1">%1$d</xliff:g> Hz za određeni sadržaj. Povećava potrošnju baterije."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Nametni maksimalnu učestalost osvežavanja"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Najveća učestalost osvežavanja za poboljšan odziv na dodir i kvalitet animacije. Povećava potrošnju baterije."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Pažnja ekrana"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Zajednička podešavanja"</string>
<string name="apn_settings" msgid="4295467389400441299">"Nazivi pristupnih tačaka"</string>
<string name="apn_edit" msgid="2003683641840248741">"Izmena pristupne tačke"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Dodajte pristupnu tačku"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Nije podešeno"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nije podešeno"</string>
<string name="apn_name" msgid="6677695784108157953">"Naziv"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Otvarajte pomoću dugmeta za pristupačnost"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Zadržite tastere za jačinu zvuka da biste otvorili"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triput dodirnite ekran da biste otvorili"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Dodirnite ekran tri puta pomoću dva prsta da biste otvorili"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Otvarajte pomoću pokreta"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Koristite pokret za pristupačnost"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Da biste koristili ovu funkciju, dodirnite dugme Pristupačnost <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> u dnu ekrana.\n\nDa biste prelazili sa jedne funkcije na drugu, dodirnite i zadržite dugme Pristupačnost."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Da biste koristili ovu funkciju, dodirnite dugme Pristupačnost na ekranu."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Da biste koristili ovu funkciju, pritisnite i zadržite oba tastera za jačinu zvuka."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Da biste pokrenuli i zaustavili uvećanje, triput dodirnite bilo gde na ekranu."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Da biste pokrenuli i zaustavili uvećanje, dodirnite tri puta bilo gde na ekranu pomoću dva prsta."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Da biste koristili ovu funkciju, prevucite nagore od dna ekrana pomoću 2 prsta.\n\nDa biste prelazili sa jedne funkcije na drugu, prevucite nagore pomoću 2 prsta i zadržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Da biste koristili ovu funkciju, prevucite nagore od dna ekrana pomoću 3 prsta.\n\nDa biste prelazili sa jedne funkcije na drugu, prevucite nagore pomoću 3 prsta i zadržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Da biste koristili funkciju pristupačnosti, prevucite nagore od dna ekrana pomoću 2 prsta.\n\nDa biste prelazili sa jedne funkcije na drugu, prevucite nagore pomoću 2 prsta i zadržite."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Zadržite tastere za jačinu zvuka"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"zadržite tastere za jačinu zvuka"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Pritisnite i zadržite oba tastera za jačinu zvuka"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Dodirnite ekran tri puta pomoću dva prsta"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"dodirnite ekran tri puta pomoću dva prsta"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Brzo dodirnite ekran {0,number,integer} puta pomoću dva prsta"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Dodirnite ekran triput"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"dodirnite ekran triput"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Brzo dodirnite ekran {0,number,integer} puta. Ova prečica može da uspori uređaj"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Koristi vibriranje i haptiku"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibriranje alarma"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibriranje medija"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibracija tastature"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibriranje zvona"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibriranje obaveštenja"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Taktilni odziv"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ako ograničite aktivnosti aplikacije u pozadini, možda će se ponašati neočekivano."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Apl. nije podešena za optimizaciju baterije, pa ne možete da je ograničite. \n\nZa ogr. apl. uključite optimizaciju baterije."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Upravljajte potrošnjom baterije"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Dozvoli korišćenje u pozadini"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Omogućite za ažuriranja u realnom vremenu, onemogućite da biste uštedeli bateriju"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neograničeno"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizovano"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ograničeno"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"veličina teksta, velika slova, velik font, velik tekst, slabovidost, povećanje teksta, uvećavanje fonta, povećanje fonta"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"zvek uključen ambijentalni prikaz, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, oznaka, čitač"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastatura, haptika, vibracija,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Jačina zvuka, vibracija, Ne uznemiravaj"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Jačina zvuka medija"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Jačina zvuka za prebacivanje"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Dozvoli pristup za upravljanje svim datotekama"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Dozvolite da ova aplikacija čita, menja i briše sve datoteke na ovom uređaju ili svim povezanim uređajima za skladištenje. Ako to dozvolite, aplikacija može da pristupa datotekama bez vašeg znanja."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Može da pristupa svim datotekama"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Obaveštenja preko celog ekrana"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Dozvolite obaveštenja preko celog ekrana od ove aplikacije"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Dozvolite ovoj aplikaciji da prikazuje obaveštenja preko celog ekrana kada je uređaj zaključan. Aplikacije mogu da ih koriste radi isticanja alarma, dolaznih poziva ili drugih hitnih obaveštenja."</string>
@@ -4885,6 +4939,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Proverite aktivnosti u aplikacijama radi otkrivanja „pecanja“"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Koristi proveru"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Koristi proveru za poslovne aplikacije"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Provera se obavlja privatno i direktno na uređaju, a njome se proveravaju aktivnosti u aplikacijama radi otkrivanja „pecanja“ ili drugog obmanjujućeg ponašanja. Ako se to otkrije, neki podaci o aplikaciji se šalju Google Play zaštiti da bi se potvrdila pretnja i upozorili korisnici."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Ovo je zaštićena bezbednosna funkcija. Sa Google-om se ne dele podaci o uređaju ni lični podaci. \n\n„Pecanje“ je pokušaj krađe akreditiva za prijavljivanje ili drugih ličnih podataka."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 1643792..e736769 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Адключыць Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Адключае функцыю Bluetooth LE audio, калі прылада падтрымлівае апаратнае забеспячэнне LE audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Паказ пераключальніка LE audio у Звестках пра прыладу"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Абыходзіць белы спіс Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Выкарыстоўваць LE Audio стандартна, нават калі перыферыйная прылада LE Audio не адпавядае крытэрыям белага спіса."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Носьбіты даных"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Выклікаць прылады"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Іншыя прылады"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Захаваныя прылады"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Звязана з уліковым запісам"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Раней выкарыстоўваліся з уліковым запісам"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth уключыцца, каб выканаць спалучэнне"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Параметры падключэння"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Раней падключаныя"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Увод тэксту ў тэкставыя палі"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ігнараваць націсканні кнопак стілусам"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Стылус"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Абагульванне аўдыя"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Абагульваць аўдыя"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Выклікі і будзільнікі"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Дата і час"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Проксі-сервер"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Ачысціць"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Прыватная вобласць"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Праграмы можна хаваць у прыватнай папцы"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Атрымліваць доступ з дапамогай сродку разблакіроўкі экрана"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Паказаць прыватную вобласць"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Хаваць, калі доступ заблакіраваны"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Хаваць прыватную вобласць, калі доступ да яе заблакіраваны"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Прыватную вобласць можна не паказваць у спісе праграм"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Доступ да прыватнай вобласці, калі яна схавана"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"У радку пошуку набярыце \"Прыватная вобласць\""</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Націсніце на плітку \"Прыватная вобласць\""</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Разблакіраваць прыватную вобласць"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Выключана"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Уключана"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Сістэма"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Стварыць прыватную вобласць"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Выдаліць прыватную вобласць"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Не ўдалося стварыць прыватную вобласць"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Прыватная вобласць выдалена"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Не ўдалося выдаліць прыватную вобласць"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Наладзьце блакіроўку экрана"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Каб выкарыстоўваць прыватную вобласць, на прыладзе неабходна наладзіць блакіроўку экрана."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Наладзіць блакіроўку экрана"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Скасаваць"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Скасаваць"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Наладзіць"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Наладжванне прыватнай вобласці"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Калі вы хочаце, каб некаторыя праграмы былі прыватнымі, схавайце іх, дадаўшы ў прыватную вобласць, да якой маеце доступ толькі вы"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Як гэта працуе"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Вы можаце атрымаць доступ да прыватнай вобласці ў ніжняй частцы спіса праграм"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Доступ да праграм у прыватнай вобласці можна заблакіраваць"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Калі доступ да прыватнай вобласці заблакіраваны, апавяшчэнні з дададзеных у яе праграм не паказваюцца"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Калі доступ да прыватнай вобласці заблакіраваны, праграмы з яе не паказваюцца ў менеджары дазволаў і на панэлі кіравання доступам, а таксама ў іншых наладах"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Наладжваецца прыватная вобласць…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Прыватную вобласць можна заблакіраваць"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Звесткі аб выкарыстанні прыватнай вобласці схаваны, калі яна заблакіравана"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Уваходзьце ў прыватную вобласць са спіса праграм"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Не ўдаецца наладзіць прыватную вобласць"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Паўтарыце спробу зараз або вярніцеся пазней"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Паўтарыць спробу"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Ужываць блакіроўку экрана для разблакіроўкі?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Прыватную вобласць можна разблакіраваць тым жа спосабам, што і пры блакіроўцы прылады, або выбраць іншы спосаб блакіроўкі"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Выкарыстоўваць блакіроўку экрана"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Выбраць новы спосаб блакіроўкі"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Гатова!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Каб увайсці ў прыватную вобласць, правядзіце знізу галоўнага экрана ўверх, а потым прагартайце ўніз"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Гатова"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Каб увайсці ў прыватную вобласць, прагартайце ўніз"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Вы можаце дадаць да <xliff:g id="COUNT">%d</xliff:g> адбіткаў пальца"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Вы дадалі максімальную колькасць адбіткаў пальцаў"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Немагчыма дадаць больш адбіткаў пальцаў"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Працягваць выкарыстоўваць праграмы, калі прылада складзена"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Плаўны паказ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Аўтаматычна павялічвае частату абнаўлення пэўнага змесціва з 60 да <xliff:g id="ID_1">%1$s</xliff:g> Гц. Павышае выкарыстанне зараду акумулятара."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Аўтаматычна павялічвае частату абнаўлення пэўнага змесціва да <xliff:g id="ID_1">%1$d</xliff:g> Гц. Павышае выкарыстанне зараду акумулятара."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Прымусовая пікавая частата абнаўлення"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Найвышэйшая частата абнаўлення для лепшага рэагавання на дотыкі і вышэйшай якасці анімацыі. Павышае выкарыстанне зараду акумулятара."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Адаптыўны рэжым"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Супольныя налады"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Змяніць пункт доступу"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Не зададзена"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Не зададзена"</string>
<string name="apn_name" msgid="6677695784108157953">"Назва"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Адкрывайце кнопкай спецыяльных магчымасцей"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Каб адкрыць, утрымлівайце клавішы гучнасці"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Каб адкрыць, тройчы націсніце на экран"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Каб адкрыць, тройчы націсніце на экран двума пальцамі"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Адкрывайце жэстам"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Скарыстаць жэст спецыяльных магчымасцей"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Каб скарыстаць гэту функцыю, націсніце кнопку спецыяльных магчымасцей <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> унізе экрана.\n\nКаб пераключыцца на іншую функцыю, утрымлівайце кнопку спецыяльных магчымасцей націснутай."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Каб выкарыстоўваць гэту функцыю, націсніце на экране кнопку спецыяльных магчымасцей."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Каб скарыстаць гэту функцыю, націсніце і ўтрымлівайце абедзве клавішы гучнасці."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Каб запусціць і спыніць функцыю павелічэння, тройчы націсніце ў любым месцы экрана."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Каб запусціць і спыніць функцыю павелічэння, тройчы націсніце ў любым месцы экрана двума пальцамі."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Каб скарыстаць гэту функцыю, правядзіце па экране двума пальцамі знізу ўверх.\n\nКаб пераключыцца на іншую функцыю, правядзіце двума пальцамі ўверх і ўтрымлівайце іх на экране."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Каб скарыстаць гэту функцыю, правядзіце па экране трыма пальцамі знізу ўверх.\n\nКаб пераключыцца на іншую функцыю, правядзіце трыма пальцамі ўверх і ўтрымлівайце іх на экране."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Каб скарыстаць спецыяльную магчымасць, правядзіце па экране двума пальцамі знізу ўверх.\n\nКаб пераключыцца на іншую функцыю, правядзіце двума пальцамі ўверх і ўтрымлівайце іх на экране."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Утрымліваць клавішы гучнасці націснутымі"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"утрыманне клавіш гучнасці націснутымі"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Націсніце і ўтрымлівайце абедзве клавішы гучнасці"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Тройчы націсніце на экран двума пальцамі"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"тройчы націсніце на экран двума пальцамі"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Хутка націсніце на экран {0,number,integer} разы двума пальцамі"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Тройчы націснуць на экран"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"трайное націсканне на экран"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Хутка націсніце на экран некалькі разоў ({0,number,integer}). Выкарыстанне гэтай каманды можа запаволіць працу прылады"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Выкарыстоўваць вібрацыю і тактыльны водгук"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Вібрацыя падчас сігналаў"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Вібрацыя ў час прайгравання мультымедыя"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Вібрацыя клавіятуры"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Вібрацыя пры выкліку"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Вібрацыя пры апавяшчэнні"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Вібрацыя тактыльнага водгуку"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Абмежаванне фонавай дзейнасці праграмы можа прывесці да збояў"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Паколькі ў гэтай праграме не наладжана аптымізацыя выкарыстання зараду акумулятара, вы не можаце абмежаваць яе працу. \n\n Для гэтага спачатку ўключыце аптымізацыю акумулятара."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Кіраваць выкарыстаннем зараду"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Без абмежаванняў"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Аптымізавана"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"З абмежаваннямі"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"памер тэксту, вялікі шрыфт, буйны шрыфт, павялічаны тэкст, слабы зрок, павялічыць тэкст, праграма для павелічэння шрыфту, павелічэнне шрыфту"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"заўсёды ўключаная экранная застаўка"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, цэтлік, тэрмінал"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"клавіятура, тактыльны водгук, вібрыраваць,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Гучнасць, вібрацыя, рэжым \"Не турбаваць\""</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Гучнасць медыя"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Гучнасць трансляцыі"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Дазволіць доступ да кіравання ўсімі файламі"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Дазвольце гэтай праграме чытаць, змяняць і выдаляць усе файлы на гэтай прыладзе ці ў падключаных сховішчах. З такім дазволам праграма зможа атрымліваць доступ да файлаў без вашага ведама."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Магчымы доступ да ўсіх файлаў"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Поўнаэкранныя апавяшчэнні"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Дазволіць поўнаэкранныя апавяшчэнні ад гэтай праграмы"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Гэта праграма зможа паказваць поўнаэкранныя апавяшчэнні, калі прылада заблакіравана. Дзякуючы гэтаму дазволу праграмы могуць паказваць сігналы будзільнікаў, уваходныя выклікі і іншыя тэрміновыя апавяшчэнні."</string>
@@ -4882,16 +4943,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Назва прылады даступная для ўсталяваных вамі праграм. Яе таксама могуць пабачыць іншыя людзі, калі вы падключыцеся да прылад з Bluetooth або да сеткі Wi-Fi ці наладзіце хот-спот Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Граматычны род"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Выберыце граматычны род"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Сканіраванне на наяўнасць падманных праграм"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Правяраць дзеянні ў праграме на фішынг"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Выкарыстоўваць сканіраванне"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Выкарыстоўваць сканіраванне для працоўных праграм"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index f40ab01..9910cff 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Деактивиране на Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Деактивира Bluetooth LE Audio, ако устройството поддържа хардуер с възможност за LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Показване на превключват. за LE Audio в подробн. за у-вото"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Заобикаляне на списъка на разрешените устройства с Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Използване на LE Audio по подразбиране дори ако не е потвърдено, че периферното устройство с LE Audio отговаря на критериите на списъка на разрешените устройства."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Мултимедийни устройства"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Устройства за обаждания"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Други устройства"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Запазени устройства"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Асоциирано с профила"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Използвано по-рано с профил"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth ще се включи с цел сдвояване"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Предпочитания за свързването"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"По-рано свързвани"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Ръкописно въвеждане в текстовите полета"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Игнориране на натисканията на бутони с писалката"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Писалка"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Споделяне на аудио"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Споделяне на аудио"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Обаждания и будилници"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Дата и час"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси сървър"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Изчистване"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Лично пространство"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Скриване на приложенията в лична папка"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Отключване с опцията за заключване на екрана"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Показване на личното пространство"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Скриване, когато е заключено"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Скриване на личното пространство, когато е заключено"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"За да бъде тайно личното пространство на у-вото ви, можете да го скриете от списъка с приложения"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Достъп до личното пространство, когато е скрито"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Потърсете „лично пространство“ в лентата за търсене"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Докоснете панела за личното пространство"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Отключване на личното ви пространство"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Изкл."</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Вкл."</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Система"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Създаване на лично пространство"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Изтриване на личното пространство"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Създаването на личното пространство не бе успешно"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Личното пространство бе изтрито успешно"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Изтриването на личното пространство не бе успешно"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Настройте заключване на екрана"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"За да ползвате личното пространство, настройте заключване на екрана."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Настройване на закл. на екрана"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Отказ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Отказ"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Настройване"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Настройване на личното пространство"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Скрийте частните приложения в сигурна среда, до която само вие имате достъп"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Начин на работа"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Можете да осъществите достъп до личното пространство от долната част на списъка с приложения"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Приложенията в личното пространство са защитени чрез опция за заключване"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Известията от приложенията в личното пространство са скрити, когато то е заключено"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Когато личното пространство е заключено, приложенията в него няма да се показват в мениджъра на разрешенията, таблото за управление на поверителността и други настройки"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Личното пространство се настройва…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Личното пространство е защитено чрез опция за заключване"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Информацията за използването на приложенията в личното пространство е скрита, когато то е заключено"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Достъп до личното пространство от списъка ви с приложения"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Настройването на личното пространство не бе успешно"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Опитайте отново сега или се върнете по-късно"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Нов опит"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Да се отключва ли чрез опцията за закл. на екрана?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Можете да отключвате личното пространство по същия начин, по който отключвате устройството си, или да изберете друга опция за заключване"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Използване на опцията за заключване на екрана"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Избиране на нова опция за заключване"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Готово!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"За достъп до личното пространство прекарайте пръст нагоре от долната част на началния екран, след което превъртете надолу"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Готово"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Превъртете надолу за достъп до личното пространство"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Можете да добавите до <xliff:g id="COUNT">%d</xliff:g> отпечатъка"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Добавихте максималния брой отпечатъци"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Не могат да се добавят още отпечатъци"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Продължаване на използването на приложенията при сгъване"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Плавно показване"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Автоматично увеличава честотата на опресняване от 60 на <xliff:g id="ID_1">%1$s</xliff:g> Hz за част от съдържанието. По-интензивно използване на батерията."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Автоматично увеличава честотата на опресняване до <xliff:g id="ID_1">%1$d</xliff:g> Hz за част от съдържанието. По-интензивно използване на батерията."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Принудителна най-висока честота на опресняване"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Най-висока честота на опресняване за по-добро реагиране при докосване и качество на анимациите. По-интензивно използване на батерията."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Внимание към екрана"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Общи настройки"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Редакт. на точка за достъп"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Не е зададено"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Не е зададено"</string>
<string name="apn_name" msgid="6677695784108157953">"Име"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Отваряне с бутона за достъпност"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"За отваряне натиснете и задръжте бутоните за силата на звука"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Трикратно докосване на екрана с цел отваряне"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Отваряне с трикратно докосване на екрана с два пръста"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Отваряне с жест"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Използване на жеста за достъпност"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"За да използвате тази функция, докоснете бутона за достъпност <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> в долната част на екрана.\n\nДокоснете и задръжте този бутон и за превключване между функциите."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"За да използвате тази функция, докоснете бутона за достъпност на екрана."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"За да използвате тази функция, натиснете и задръжте двата бутона за силата на звука."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"За стартиране и спиране на увеличението докоснете три пъти където и да е на екрана."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"За стартиране и спиране на увеличението докоснете три пъти с два пръста където и да е на екрана."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"За да използвате тази функция, прекарайте два пръста нагоре от долната част на екрана.\n\nЗа превключване между функциите прекарайте два пръста нагоре и задръжте."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"За да използвате тази функция, прекарайте три пръста нагоре от долната част на екрана.\n\nЗа превключване между функциите прекарайте три пръста нагоре и задръжте."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"За да използвате функцията за достъпност, прекарайте два пръста нагоре от долната част на екрана.\n\nЗа превключване между функциите прекарайте два пръста нагоре и задръжте."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Задържане на бутоните за силата на звука"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"задържане на бутоните за силата на звука"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Натиснете и задръжте двата бутона за силата на звука"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Трикратно докосване на екрана с два пръста"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"трикратно докосване на екрана с два пръста"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Бързо докоснете екрана {0,number,integer} пъти с два пръста"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Трикратно докосване на екрана"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"трикратно докосване на екрана"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Бързо докоснете екрана {0,number,integer} пъти. Този пряк път може да забави работата на устройството ви."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Използване на вибриране и осезателна обратна връзка"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Вибриране за будилници"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Вибриране за мултимедия"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Вибриране при използване на клавиатурата"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Вибриране при звънене"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Вибриране при известия"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Обратна връзка при докосване"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ако ограничите активността на заден за дадено приложение, то може да не функционира правилно"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Тъй като прил. не е зададено да оптимизира батерията, можете да го ограничите.\n\nЗа тази цел първо включете оптим. на батерията."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Управление на използването на батерията"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Неограничено"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оптимизирано"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ограничено"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"размер на текста, едър шрифт, голям шрифт, големи знаци, слабо зрение, уголемяване на знаците, инструмент за уголемяване на шрифта, уголемяване на шрифта"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"винаги включен фонов дисплей, дисплей, открояващ важни неща"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, маркер, четец"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"клавиатура, осезателна обратна връзка, вибриране,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Сила на звука, вибриране, „Не безпокойте“"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Сила на звука за мултимедия"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Сила на звука при предаване"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Разрешаване на достъп за управл. на всички файлове"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Разрешете на това приложение да чете, променя и изтрива всички файлове на устройството или обемите на свързаните хранилища. Ако то получи разрешението, може да осъществява достъп до файловете без изричното ви знание."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Може да осъществява достъп до всички файлове"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Известия на цял екран"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Разрешаване на известията на цял екран от това приложение"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Разрешаване на това приложение да показва известия, които заемат целия екран, когато устройството е заключено. Приложенията могат да ги използват, за да открояват будилници, входящи обаждания или други спешни известия."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Името на устройството ви е видимо за инсталираните от вас приложения. То може да се вижда и от други хора, когато се свържете с устройства с Bluetooth или с Wi-Fi мрежа или настроите точка за достъп до Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Граматически род"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Изберете граматически род"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Сканиране за подвеждащи приложения"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Проверка на активността в приложенията за фишинг"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Използване на сканирането"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Използване на сканирането за служебни приложения"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index e9fe74d..607f8da 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ব্লুটুথ LE অডিও বন্ধ করুন"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ডিভাইসে LE অডিও হার্ডওয়্যার কাজ করলে, ব্লুটুথ LE অডিও ফিচার বন্ধ করে।"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ডিভাইসের বিবরণে LE অডিও টগল দেখুন"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ব্লুটুথ LE অডিও-এর সাদাতালিকা বাইপাস করুন"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE অডিও-এর সাদাতালিকার শর্ত পূর্ণ করতে LE অডিও-এর পেরিফেরাল যাাচাই করা না হলেও ডিফল্ট হিসেবে LE অডিও ব্যবহার করুন।"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"মিডিয়া ডিভাইস"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"কল করার ডিভাইস"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"অন্যান্য ডিভাইস"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"সেভ করে রাখা ডিভাইস"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"অ্যাকাউন্টের সাথে যুক্ত করা হয়েছে"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"অ্যাকাউন্টের সাথে আগে ব্যবহার করা হয়েছে"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"পেয়ার করার জন্য ব্লুটুথ চালু হবে"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"কানেকশন অভিরুচি"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"আগে কানেক্ট করা"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"টেক্সট ফিল্ডে লিখুন"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"স্টাইলাসের মাধ্যমে প্রেস করা হয়েছে এমন বোতাম এড়িয়ে যান"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"স্টাইলাস"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"অডিও শেয়ার করা"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"অডিও শেয়ার করুন"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"কল ও অ্যালার্ম"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"দিন ও তারিখ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"প্রক্সী"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"সাফ করুন"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ব্যক্তিগত স্পেস"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ব্যক্তিগত ফোল্ডারে অ্যাপ লুকান"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"\'স্ক্রিন লক\' ব্যবহার করে আনলক করুন"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"\'ব্যক্তিগত স্পেস\' দেখান"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"লক থাকাকালীন লুকান"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"লক থাকাকালীন \'ব্যক্তিগত\' স্পেস লুকিয়ে রাখুন"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"আপনার ডিভাইসে \'ব্যক্তিগত\' স্পেস থাকার বিষয়টি যাতে অন্যান্য লোকজন না জানতে পারেন, তার জন্য সেটি অ্যাপ তালিকা থেকে লুকিয়ে রাখুন"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"লুকানো থাকাকালীন \'ব্যক্তিগত\' স্পেস অ্যাক্সেস করুন"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"সার্চ বারে \'ব্যক্তিগত\' স্পেস সম্পর্কিত সার্চ"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"\'ব্যক্তিগত\' স্পেসের টাইলে ট্যাপ করুন"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"আপনার \'ব্যক্তিগত\' স্পেস আনলক করুন"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"বন্ধ আছে"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"চালু আছে"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"সিস্টেম"</string>
<string name="private_space_create_title" msgid="47273568884806726">"\'ব্যক্তিগত স্পেস\' তৈরি করুন"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"\'ব্যক্তিগত স্পেস\' মুছুন"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"\'ব্যক্তিগত স্পেস\' তৈরি করা যায়নি"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"\'ব্যক্তিগত স্পেস\' মুছে ফেলা হয়েছে"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"\'ব্যক্তিগত স্পেস\' মুছে ফেলা যায়নি"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"\'স্ক্রিন লক\' সেট করুন"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"\'ব্যক্তিগত স্পেস\' ব্যবহার করতে, এই ডিভাইসে \'স্ক্রিন লক\' সেট করুন।"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"\'স্ক্রিন লক\' সেট করুন"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"বাতিল করুন"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"বাতিল করুন"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"সেট-আপ করুন"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"\'ব্যক্তিগত\' স্পেস সেট-আপ করুন"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ব্যক্তিগত অ্যাপ সুরক্ষিত জায়গাতে লুকিয়ে রাখুন যাতে শুধুমাত্র আপনিই তা অ্যাক্সেস করতে পারেন"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"এটি কীভাবে কাজ করে"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"আপনার অ্যাপ তালিকার নিচে থকে \'ব্যক্তিগত\' স্পেস অ্যাক্সেস করতে পারবেন"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"\'ব্যক্তিগত\' স্পেসে অ্যাপ লকের মাধ্যমে সুরক্ষিত থাকে"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"\'ব্যক্তিগত স্পেস\' লক থাকলে সেখানে থাকা অ্যাপের বিজ্ঞপ্তি লুকানো থাকে"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"\'ব্যক্তিগত স্পেস\' লক করা থাকলে পার্মিশন ম্যানেজার, প্রাইভেসি ড্যাশবোর্ড এবং অন্যান্য সেটিংসে \'ব্যক্তিগত স্পেসের\' অ্যাপ দেখা যাবে না"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"\'ব্যক্তিগত স্পেস\' সেট-আপ করা হচ্ছে…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"\'ব্যক্তিগত স্পেসে\' অ্যাপ লক করে সুরক্ষিত অবস্থায় থাকে"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"\'ব্যক্তিগত স্পেস\' লক করা থাকলে এখানে থাকা অ্যাপ ব্যবহারের তথ্য লুকানো থাকবে"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"আপনার অ্যাপ তালিকা থেকে \'ব্যক্তিগত স্পেস\' অ্যাক্সেস করুন"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"\'ব্যক্তিগত স্পেস\' সেট-আপ করা যায়নি"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"এখনই আবার চেষ্টা করুন বা পরে আবার চেষ্টা করে দেখুন"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"আবার চেষ্টা করুন"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"আনলক করতে স্ক্রিন লক ব্যবহার করতে চান?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"যেভাবে আপনার ডিভাইস আনলক করেন একইভাবে নিজের \'ব্যক্তিগত স্পেস\' আনলক করতে পারেন বা অন্য কোনও লক বেছে নিতে পারেন"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"স্ক্রিন লক ব্যবহার করুন"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"নতুন লক বেছে নিন"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"হয়ে গেছে!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"\'ব্যক্তিগত স্পেস\' অ্যাক্সেস করতে, হোম স্ক্রিনের নিচের দিক থেকে উপরের দিকে সোয়াইপ করুন ও তারপর নিচের দিকে স্ক্রল করুন"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"হয়ে গেছে"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"\'ব্যক্তিগত স্পেস\' অ্যাক্সেস করতে নিচের দিকে স্ক্রল করুন"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"আপনি সর্বাধিক <xliff:g id="COUNT">%d</xliff:g>টি ফিঙ্গারপ্রিন্ট যোগ করতে পারবেন"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"আপনি অনুমোদিত সর্বোচ্চ সংখ্যক আঙ্গুলের ছাপ যোগ করেছেন"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"এর বেশি আঙ্গুলের ছাপ যোগ করা যাবে না"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ফোল্ডে থাকা অ্যাপ ব্যবহার করা চালিয়ে যান"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"স্মুথ ডিসপ্লে"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"কিছু কন্টেন্টের রিফ্রেশ রেট অটোমেটিক 60 থেকে <xliff:g id="ID_1">%1$s</xliff:g> Hz পর্যন্ত বেড়ে যায়। ব্যাটারির খরচও বেড়ে যায়।"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"কিছু কন্টেন্টের রিফ্রেশ রেট অটোমেটিক <xliff:g id="ID_1">%1$d</xliff:g> Hz পর্যন্ত বেড়ে যায়। ব্যাটারি বেশি খরচ হয়।"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"সবচেয়ে বেশি রিফ্রেশ রেটে সেট করা হয়েছে"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"সর্বাধিক রিফ্রেশ রেট সেট করে টাচ রেসপন্সিভনেস এবং অ্যানিমেশন কোয়ালিটি উন্নত করুন। ব্যাটারির খরচ বেড়ে যায়।"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"স্ক্রিন অ্যাটেনশন"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"\'কমিউনাল\' সেটিংস"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"অ্যাক্সেস পয়েন্ট এডিট করুন"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"সেট করা নেই"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"সেট করা নেই"</string>
<string name="apn_name" msgid="6677695784108157953">"নাম"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"অ্যাক্সেসিবিলিটি বোতাম ব্যবহার করে খোলা"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"খোলার জন্য ভলিউম কী প্রেস করে ধরে থাকুন"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"খুলতে স্ক্রিনে ট্রিপল ট্যাপ করুন"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"স্ক্রিনে দুই আঙুল দিয়ে তিনবার ট্যাপ করে খুলুন"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ইঙ্গিতের মাধ্যমে খোলা"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"\'অ্যাক্সেসিবিলিটি\' জেসচার ব্যবহার করুন"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"এই ফিচারটি ব্যবহার করার জন্য, স্ক্রিনের নিচের দিকের অ্যাক্সেসিবিলিটি বোতামে <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ট্যাপ করুন।\n\nএকটি ফিচার থেকে অন্যটিতে যেতে, অ্যাক্সেসিবিলিটি বোতাম টাচ করে ধরে থাকুন।"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"এই ফিচার ব্যবহার করতে, আপনার স্ক্রিনে অ্যাক্সেসিবিলিটি বোতামে ট্যাপ করুন।"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"এই ফিচার ব্যবহার করার জন্য, উভয় ভলিউম কী প্রেস করে ধরে থাকুন।"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ম্যাগনিফিকেশন চালু বা বন্ধ করতে, স্ক্রিনের যেকোনও জায়গায় ট্রিপল ট্যাপ করুন।"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ম্যাগনিফিকেশন চালু বা বন্ধ করতে, স্ক্রিনের যেকোনও জায়গায় দুই আঙুল দিয়ে তিনবার ট্যাপ করুন।"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"এই ফিচার ব্যবহার করার জন্য, স্ক্রিনের নিচ থেকে উপরের দিকে ২টি আঙ্গুল দিয়ে সোয়াইপ করুন।\n\nএকটি ফিচার থেকে অন্যটিতে যেতে, ২টি আঙ্গুল দিয়ে নিচের থেকে উপরের দিকে সোয়াইপ করে ধরে থাকুন।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"এই ফিচার ব্যবহার করার জন্য, স্ক্রিনের নিচ থেকে উপরের দিকে ৩টি আঙ্গুল দিয়ে সোয়াইপ করুন।\n\nএকটি ফিচার থেকে অন্যটিতে যেতে, ৩টি আঙ্গুল দিয়ে নিচের থেকে উপরের দিকে সোয়াইপ করে ধরে থাকুন।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"অ্যাক্সেসিবিলিটি ফিচার ব্যবহার করার জন্য, স্ক্রিনের নিচ থেকে উপরের দিকে ২টি আঙ্গুল দিয়ে সোয়াইপ করুন।\n\nএকটি ফিচার থেকে অন্যটিতে যেতে, ২টি আঙ্গুল দিয়ে নিচের থেকে উপরের দিকে সোয়াইপ করে ধরে থাকুন।"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ভলিউম কী কিছু সময় প্রেস করে রাখুন"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ভলিউম কী প্রেস করে রাখুন"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"উভয় ভলিউম কী প্রেস করে ধরে থাকুন"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"দুই আঙুল দিয়ে স্ক্রিনে তিনবার ট্যাপ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"দুই আঙুল দিয়ে স্ক্রিনে তিনবার ট্যাপ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"দুই আঙুল দিয়ে স্ক্রিনে দ্রুত {0,number,integer} বার ট্যাপ করুন"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ট্রিপল-ট্যাপ স্ক্রিন"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"স্ক্রিনে ট্রিপল-ট্যাপ করা"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"স্ক্রিনে ঝটপট {0,number,integer} বার ট্যাপ করুন। এই শর্টকাট ব্যবহারের ফলে আপনার ডিভাইসের স্পিড কমে যেতে পারে"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ভাইব্রেশন এবং হ্যাপটিক ব্যবহার করুন"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"অ্যালার্ম ভাইব্রেশন"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"মিডিয়া ভাইব্রেশন"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"কীবোর্ড ভাইব্রেশন"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"রিং ভাইব্রেশন"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"বিজ্ঞপ্তির ভাইব্রেশন"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"টাচ ফিডব্যাক"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"কোনও অ্যাপের ব্যাকগ্রাউন্ড অ্যাক্টিভিটি সীমিত করলে তা সঠিক ভাবে কাজ নাও করতে পারে"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"যেহেতু এই অ্যাপটিকে ব্যাটারি অপ্টিমাইজ করার জন্য সেট করা হয়নি, তাই আপনি এটির অ্যাক্টিভিটি সীমিত করতে পারবেন না।\n\nঅ্যাপের অ্যাক্টিভিটি সীমিত করতে আগে ব্যাটারি অপ্টিমাইজেশন চালু করুন।"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ব্যাটারির ব্যবহার ম্যানেজ করুন"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"সীমিত নয়"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"অপ্টিমাইজ করা আছে"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"সীমিত"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"টেক্সটের সাইজ, বড় প্রিন্ট, বড় ফন্ট, বড় টেক্সট, কম দৃষ্টি, টেক্সট আরও বড় করুন, ফন্ট বড় করার টুল, ফন্ট বড় করা"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"\'সবসময় চালু\' অ্যাম্বিয়েন্ট ডিসপ্লে, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ট্যাগ, রিডার"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"কীবোর্ড, হ্যাপটিক, ভাইব্রেট,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ভলিউম, ভাইব্রেশন, বিরক্ত করবে না"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"মিডিয়া ভলিউম"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"কাস্টের ভলিউম"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"সব ফাইল ম্যানেজ করতে অ্যাক্সেস দিন"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"এই ডিভাইস অথবা এতে কানেক্ট রয়েছে এমন যেকোনও স্টোরেজে থাকা সব ফাইল পড়তে, পরিবর্তন করতে এবং মুছতে এই অ্যাপকে অনুমতি দিন। অনুমতি দিলে এই অ্যাপ আপনাকে না জানিয়েই ফাইলগুলি অ্যাক্সেস করতে পারবে।"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"সব ফাইল অ্যাক্সেস করতে পারে"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ফুল স্ক্রিন বিজ্ঞপ্তি"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"এই অ্যাপকে ফুল স্ক্রিন জুড়ে বিজ্ঞপ্তি দেখানোর অনুমতি দিন"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ডিভাইস লক থাকার সময় এই অ্যাপকে ফুল স্ক্রিন জুড়ে বিজ্ঞপ্তি দেখানোর অনুমতি দিন। অ্যালার্ম, ইনকামিং কল অথবা অন্যান্য জরুরি বিজ্ঞপ্তি হাইলাইট করতে, অ্যাপ এগুলি ব্যবহার করতে পারে।"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"আপনার ইনস্টল করা অ্যাপে আপনার ডিভাইসের নাম দেখা যাচ্ছে। আপনি ব্লুটুথ ডিভাইস বা কোনও ওয়াই-ফাই নেটওয়ার্কে কানেক্ট অথবা ওয়াই-ফাই হটস্পট সেট-আপ করলে অন্য লোকজনও এটি দেখতে পেতে পারেন।"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"ব্যাকরণগতভাবে লিঙ্গ পরিচয়"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"ব্যাকরণগতভাবে লিঙ্গ পরিচয় বেছে নিন"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"প্রতারণামূলক অ্যাপ শনাক্ত করতে স্ক্যান করা"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"ফিশিংয়ের জন্য অ্যাপ অ্যাক্টিভিটি চেক করুন"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"স্ক্যানিং ব্যবহার করুন"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"অফিসের অ্যাপের জন্য স্ক্যান ব্যবহার করুন"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 0652670..070b305 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Onemogući Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Onemogućava funkciju Bluetooth LE Audio ako uređaj podržava mogućnosti hardvera za LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Prikaži prekidač za LE Audio u Detalj. uređ."</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Zaobiđi Listu dozvoljenih za Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Koristite LE Audio prema zadanim postavkama čak i ako nije potvrđeno da LE Audio periferni uređaj ispunjava kriterije Liste dozvoljenih."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Uređaji za medije"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Uređaji za pozive"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Drugi uređaji"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Sačuvani uređaji"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Povezano s računom"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Prethodno korišteno s računom"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth će se uključiti za uparivanje"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Postavke veze"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Prethodno povezano"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Pisanje u poljima za tekst"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignoriranje svih pritisaka dugmeta za pisaljku"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Pisaljka"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Dijeljenje zvuka"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Dijeli zvuk"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Pozivi i alarmi"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Povežite se s audiostreamom LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Audiostreamovi u blizini"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audiostreamovi"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Povežite se s audiostreamom pomoću QR koda"</string>
<string name="date_and_time" msgid="1788358029823431692">"Datum i vrijeme"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proksi server"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Obriši"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privatni prostor"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Sakrijte aplikacije u privatnom folderu"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Otključajte pomoću zaključavanja ekrana"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Prikaži privatni prostor"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Sakrij kada je zaključano"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Sakrij privatan prostor kada je zaključan"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Kako drugi ne bi saznali da je privatan prostor na vašem uređaju, sakrijte ga s liste aplikacija"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Pristupite privatnom prostoru kada je sakriven"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Pretražite \"Privatan prostor\" u traci za pretraživanje"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Dodirnite karticu privatnog prostora"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Otključajte privatan prostor"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Isključeno"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Uključeno"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Kreiraj privatni prostor"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Izbriši privatni prostor"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Kreiranje privatnog prostora nije uspjelo"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privatni prostor je uspješno izbrisan"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Brisanje privatnog prostora nije uspjelo"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Postavite zaključavanje ekrana"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Da koristite privat. prostor, postavite zaklj. ekr. na uređ."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Postavite zaključavanje ekrana"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Otkaži"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Otkaži"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Postavi"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Postavite privatan prostor"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Sakrijte privatne aplikacije u zaštićeni prostor kojem samo vi možete pristupiti"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Kako ovo funkcionira"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Možete pristupiti privatnom prostoru s dna liste aplikacija"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikacije u privatnom prostoru su zaštićene zaključavanjem"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Obavještenja iz aplikacija u privatnom prostoru su sakrivena kada je prostor zaključan"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikacije iz privatnog prostora se neće pojavljivati u upravitelju odobrenja, na kontrolnoj tabli za privatnost i u drugim postavkama kada je privatni prostor zaključan"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Postavljanje privatnog prostora…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privatni prostor je zaštićen zaključavanjem"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Informacije o korištenju aplikacija iz privatnog prostora su sakrivene kada je prostor zaključan"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Pristupite privatnom prostoru s liste aplikacija"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Postavljanje privatnog prostora nije uspjelo"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Pokušajte ponovo sada ili se vratite kasnije"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Pokušaj ponovo"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Koristiti zaključavanje ekrana za otključavanje?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Privatni prostor možete otključati na isti način kao što otključavate uređaj ili odaberite drugi način zaključavanja"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Koristi zaključavanje ekrana"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Odaberite novi način zaključavanja"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Sve je spremno!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Da pristupite privatnom prostoru, prevucite nagore s dna početnog ekrana, a zatim kliznite nadolje"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Gotovo"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Kliznite nadolje da pristupite privatnom prostoru"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Broj otisaka prstiju koje možete dodati: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Dodali ste maksimalan broj otisaka prstiju"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nije moguće dodati još otisaka prstiju"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Nastavak korištenja aplikacija nakon sklapanja"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Glatki prikaz"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatski povećava učestalost osvježavanja sa 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz za određeni sadržaj. Povećava potrošnju baterije."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatski podiže učestalost osvježavanja do <xliff:g id="ID_1">%1$d</xliff:g> Hz za određeni sadržaj. Povećava potrošnju baterije."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Nametni maksimalnu brzinu osvježavanja"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Najveća brzina osvježavanja za poboljšanu reakciju na dodir i kvalitet animacije. Povećava potrošnju baterije."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Svjesni ekran"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Opće postavke"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-ovi"</string>
<string name="apn_edit" msgid="2003683641840248741">"Uredi pristupnu tačku"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Dodajte pristupnu točku"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Nije postavljeno"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nije postavljeno"</string>
<string name="apn_name" msgid="6677695784108157953">"Naziv"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Otvorite pomoću dugmeta za pristupačnost"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Držite tipke za jačinu zvuka da otvorite"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triput dodirnite ekran da otvorite"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Otvaranje trostrukim dodirom ekrana s dva prsta"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Otvorite pokretom"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Korištenje pokreta za pristupačnost"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Da koristite ovu funkciju, dodirnite dugme Pristupačnost <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> na dnu ekrana.\n\nDa prebacujete između funkcija, dodirnite i zadržite dugme Pristupačnost."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Da koristite ovu funkciju, dodirnite dugme za pristupačnost na ekranu."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Da koristite ovu funkciju, pritisnite i držite obje tipke za jačinu zvuka."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Da pokrenete i zaustavite uvećavanje, triput dodirnite bilo gdje na ekranu."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Da pokrenete i zaustavite uvećavanje, triput dodirnite bilo gdje na ekranu s dva prsta."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Da koristite ovu funkciju, prevucite s 2 prsta nagore s dna ekrana.\n\nDa prebacujete između funkcija, prevucite s 2 prsta nagore i zadržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Da koristite ovu funkciju, prevucite s 3 prsta nagore s dna ekrana.\n\nDa prebacujete između funkcija, prevucite s 3 prsta nagore i zadržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Da koristite funkciju pristupačnosti, prevucite s 2 prsta nagore s dna ekrana.\n\nDa prebacujete između funkcija, prevucite s 2 prsta nagore i zadržite."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Držite tipke za jačinu zvuka"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"držite tipke za jačinu zvuka"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Pritisnite i zadržite obje tipke za jačinu zvuka"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Trostruki dodir ekrana s dva prsta"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trostruki dodir ekrana s dva prsta"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Brzo dodirnite ekran {0,number,integer} put(a) s dva prsta"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Dodirnite ekran triput"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"dodirnite ekran triput"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Brzo dodirnite ekran sljedeći broj puta: {0,number,integer}. Ova prečica može usporiti uređaj"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Koristi vibraciju i haptiku"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibracija pri alarmu"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibracija medijskog sadržaja"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibracija tastature"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibracija pri zvonu"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibracija pri obavještenjima"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Povratne informacije na dodir"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ako aplikaciji ograničite aktivnost u pozadini, može raditi nepravilno"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Aplikaciju ne možete ograničiti jer nije postavljena optimizacija baterije.\n\nDa je ograničite prvo uključite optimizaciju."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Upravljajte potrošnjom baterije"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Omogućivanje upotrebe u pozadini"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Omogućite za ažuriranja u stvarnom vremenu, onemogućite za uštedu baterije"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neograničeno"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizirano"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ograničeno"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"veličina teksta, velika slova, veliki font, veliki tekst, slabi vid, povećavanje teksta, povećalo fonta, povećavanje fonta"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"uvijek uključeni ambijentalni prikaz (always on ambient display, AOD)"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, oznaka, čitač"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastatura, haptika, vibriraj"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Jačina zvuka, vibracija, Ne ometaj"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Jačina zvuka medija"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Jačina zvuka emitiranja"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Dozvoli pristup za upravljanje svim fajlovima"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Dozvolite ovoj aplikaciji da čita, mijenja i briše sve fajlove na ovom uređaju ili svim povezanim uređajima za pohranu. Ako to dozvolite, aplikacija može pristupati fajlovima bez vašeg znanja."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Može da pristupa svim fajlovima"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Obavještenja preko cijelog ekrana"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Dozvoli obavještenja ove aplikacije preko cijelog ekrana"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Dozvolite aplikaciji da prikazuje obavještenja koja zauzimaju cijeli ekran kada je uređaj zaključan. Aplikacije ih mogu koristiti da istaknu alarme, dolazne pozive ili druga hitna obavještenja."</string>
@@ -4885,6 +4939,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Provjerite aktivnost aplikacije radi otkrivanja krađe identiteta"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Koristi skeniranje"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Koristi skeniranje poslovnih aplikacija"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Skeniranje se privatno provodi direktno na uređaju i njime se provjerava aktivnost aplikacije radi otkrivanja krađe identiteta ili drugog obmanjujućeg ponašanja. Ako se otkrije, određene informacije o aplikaciji se šalju Google Play zaštiti da se potvrdi prijetnja i upozore korisnici aplikacije."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Ovo je zaštićena sigurnosna funkcija. S Googleom se ne dijele nikakve informacije o uređaju ni lične informacije. \n\nKrađa identiteta je pokušaj krađe akreditiva za prijavu ili drugih ličnih informacija."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 67043ad..c36b7c0 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Desactiva Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Desactiva la funció Bluetooth LE Audio si el dispositiu admet les funcions de maquinari d\'LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Botó d\'LE Audio a Detalls del dispositiu"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omet la llista d\'accés permès de Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Utilitza LE Audio de manera predeterminada encara que no s\'hagi verificat si el dispositiu perifèric de LE Audio compleix els criteris de la llista d\'accés permès."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositius multimèdia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositius de trucada"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Altres dispositius"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositius desats"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associat al compte"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"S\'ha utilitzat anteriorment amb un compte"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"El Bluetooth s\'activarà per vincular"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferències de connexió"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Connectats prèviament"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escriu als camps de text"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Omet la premuda repetida del botó de llapis òptic"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Llapis òptic"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Ús compartit d\'àudio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Comparteix l\'àudio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Trucades i alarmes"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Connecta\'t a un flux d\'LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Fluxos d\'àudio a prop"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Fluxos d\'àudio"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Connecta\'t a un flux d\'àudio fent servir un codi QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Data i hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Servidor intermediari"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Esborra"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espai privat"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Amaga les aplicacions en una carpeta privada"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloqueja amb el bloqueig de pantalla"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostra l\'espai privat"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Amaga quan estigui bloquejat"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Amaga Espai privat quan estigui bloquejat"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Per evitar que altres persones sàpiguen que tens Espai privat, pots amagar-lo de la llista d\'apps"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Accedeix a Espai privat quan està amagat"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Cerca \"Espai privat\" a la barra de cerca"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Toca la icona d\'Espai privat"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloqueja Espai privat"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desactivat"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Activat"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Crea un espai privat"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Suprimeix l\'espai privat"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"L\'espai privat no s\'ha pogut crear"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"L\'espai privat s\'ha suprimit correctament"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"L\'espai privat no s\'ha pogut suprimir"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Defineix un bloqueig de pantalla"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Per utilitzar l\'espai privat, defineix un bloqueig de pantalla."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Defineix un bloqueig de pantalla"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancel·la"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancel·la"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configura"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configura Espai privat"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Amaga aplicacions privades en un espai segur a què només pots accedir tu"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Com funciona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Pots accedir a Espai privat des del final de la llista d\'aplicacions"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Les aplicacions que hi ha a Espai privat estan protegides amb un bloqueig"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Quan està bloquejat, les notificacions de les aplicacions d\'Espai privat s\'amaguen"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Les aplicacions d\'Espai privat no es mostraran al gestor de permisos, al tauler de privadesa ni en altres opcions de configuració quan Espai privat estigui bloquejat"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"S\'està configurant Espai privat…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Espai privat està protegit amb un bloqueig"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"La informació d\'ús de les aplicacions d\'Espai privat s\'amaga quan està bloquejat"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accedeix a Espai privat des de la llista d\'aplicacions"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"No s\'ha pogut configurar Espai privat"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Torna-ho a provar ara o torna més tard"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Torna-ho a provar"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Vols desbloquejar amb el bloqueig de pantalla?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Pots desbloquejar Espai privat de la mateixa manera que desbloqueges el dispositiu, o triar un altre bloqueig"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Utilitza el bloqueig de pantalla"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Tria un bloqueig nou"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Tot a punt!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Per accedir a Espai privat, llisca cap amunt des de la part interior de la pantalla d\'inici i, a continuació, desplaça\'t cap avall"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Fet"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Desplaça\'t cap avall per accedir a Espai privat"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Pots afegir un màxim de <xliff:g id="COUNT">%d</xliff:g> empremtes digitals"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Has afegit el nombre màxim d\'empremtes digitals"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"No es poden afegir més empremtes digitals"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continua utilitzant les aplicacions amb el dispositiu plegat"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Augmenta automàticament la freqüència d\'actualització de 60 a <xliff:g id="ID_1">%1$s</xliff:g> Hz en alguns continguts. Augmenta l\'ús de la bateria."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Augmenta automàticament la freqüència d\'actualització fins a <xliff:g id="ID_1">%1$d</xliff:g> Hz en alguns continguts. Augmenta l\'ús de la bateria."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Força la freqüència d\'actualització màxima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"La freqüència d\'actualització més alta millora la resposta tàctil i la qualitat de les animacions. Augmenta l\'ús de la bateria."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atenció a la pantalla"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Configuració comuna"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edita el punt d\'accés"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Afegeix un punt d\'accés"</string>
<string name="apn_not_set" msgid="8246646433109750293">"No definit"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"No definit"</string>
<string name="apn_name" msgid="6677695784108157953">"Nom"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Utilitza el botó d\'accessibilitat per obrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Per obrir, mantén premudes les tecles de volum"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Per obrir, fes triple toc a la pantalla"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Fes triple toc a la pantalla amb dos dits per obrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Utilitza un gest per obrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Utilitza el gest d\'accessibilitat"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Per utilitzar aquesta funció, toca el botó d\'accessibilitat <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> a la part inferior de la pantalla.\n\nPer canviar entre funcions, mantén premut el botó d\'accessibilitat."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Per utilitzar aquesta funció, toca el botó d\'accessibilitat de la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Per utilitzar aquesta funció, mantén premudes les dues tecles de volum."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Per iniciar o aturar l\'ampliació, fes triple toc en qualsevol punt de la pantalla."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Per iniciar o aturar l\'ampliació, fes triple toc en qualsevol punt de la pantalla amb dos dits."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Per utilitzar aquesta funció, llisca cap amunt amb 2 dits des de la part inferior de la pantalla.\n\nPer canviar entre funcions, llisca cap amunt amb 2 dits i mantén premut."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Per utilitzar aquesta funció, llisca cap amunt amb 3 dits des de la part inferior de la pantalla.\n\nPer canviar entre funcions, llisca cap amunt amb 3 dits i mantén premut."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Per utilitzar una funció d\'accessibilitat, llisca cap amunt amb 2 dits des de la part inferior de la pantalla.\n\nPer canviar entre funcions, llisca cap amunt amb 2 dits i mantén premut."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Mantén premudes les tecles de volum"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"mantén premudes les tecles de volum"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Mantén premudes les dues tecles de volum"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Fes triple toc a la pantalla amb dos dits"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"fes triple toc a la pantalla amb dos dits"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Toca ràpidament la pantalla {0,number,integer} vegades amb dos dits"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Fes tres tocs a la pantalla"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"fes tres tocs a la pantalla"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Toca ràpidament la pantalla {0,number,integer} vegades. És possible que aquesta drecera alenteixi el dispositiu."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Utilitza la vibració i la tecnologia hàptica"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibració de les alarmes"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibració del contingut multimèdia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibració del teclat"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibració de les trucades"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibració de les notificacions"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Resposta tàctil"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Si limites l\'activitat en segon pla d\'una aplicació, és possible que no funcioni correctament"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Com que aquesta aplicació no s\'ha configurat per optimitzar la bateria, no pots restringir-la.\n\nPer restringir l\'aplicació, activa l\'optimització de la bateria."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gestiona l\'ús de la bateria"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Permet l\'ús en segon pla"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Activa per a actualitzacions en temps real; desactiva per estalviar bateria"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sense restriccions"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimitzat"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restringit"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"mida del text, impressió gran, lletra gran, text gran, poca visió, fer el text més gran, ampliador de font, ampliació de font"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"pantalla ambient sempre activa, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiqueta, lector"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclat, tecnologia hàptica, vibració,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volum, vibració, No molestis"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volum de multimèdia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volum emès"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Permet l\'accés per gestionar tots els fitxers"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permet que aquesta aplicació llegeixi, modifiqui i suprimeixi tots els fitxers d\'aquest dispositiu o de qualsevol volum d\'emmagatzematge connectat. L\'aplicació podrà accedir als fitxers sense el teu coneixement explícit."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Pot accedir a tots els fitxers"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificacions de pantalla completa"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permet les notificacions de pantalla completa d\'aquesta aplicació"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permet que aquesta aplicació mostri notificacions que ocupen tota la pantalla quan el dispositiu està bloquejat. Les aplicacions poden utilitzar aquesta opció per destacar alarmes, trucades entrants o altres notificacions urgents."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Comprova l\'activitat de les aplicacions per detectar pesca de credencials"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Utilitza l\'anàlisi"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Utilitza l\'anàlisi per a les aplicacions de treball"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"L\'anàlisi s\'executa de manera privada directament des del dispositiu, i es comprova l\'activitat de les aplicacions per detectar pesca de credencials o altres comportaments enganyosos. Si s\'identifica algun d\'aquests comportaments, s\'enviarà determinada informació de les aplicacions en qüestió a Google Play Protect per confirmar l\'amenaça i avisar-ne els usuaris."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"És una funció de seguretat protegida. No es comparteix cap informació personal ni del dispositiu amb Google. \n\nLa pesca de credencials és un intent de robar les credencials d\'inici de sessió o altres dades personals."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 536e49c..d6f16c9 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Deaktivovat Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Vypne funkci zvuku přes Bluetooth LE, pokud zařízení podporuje hardwarové zvukové funkce LE."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Zobrazit přepínač LE Audio v Podrobnostech o zařízení"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Obejít seznam povolených pro Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Ve výchozím nastavení použít LE Audio i v případě, že u periferního zařízení LE Audio nebylo ověřeno splnění kritérií na seznamu povolených."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Mediální zařízení"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Volání na zařízení"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Ostatní zařízení"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Uložená zařízení"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Přidružení k účtu"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Dříve použito s účtem"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Za účelem spárování se Bluetooth zapne"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Předvolby připojení"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Dříve připojeno"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Psát do textových polí"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorovat všechna stisknutí tlačítka na dotykovém peru"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Dotykové pero"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Sdílení zvuku"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Sdílet zvuk"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Hovory a budíky"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Připojení ke zvukovému streamu LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Okolní zvukové streamy"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Zvukové streamy"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Připojení ke zvukovému streamu pomocí QR kódu"</string>
<string name="date_and_time" msgid="1788358029823431692">"Datum a čas"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy server"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Vymazat"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Soukromý prostor"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Skrýt aplikace v soukromé složce"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Odemknout pomocí zámku obrazovky"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Zobrazit soukromý prostor"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Při uzamčení skrýt"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Při uzamčení soukromý prostor skrýt"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Pokud chcete, aby o soukromém prostoru ve vašem zařízení nikdo nevěděl, můžete ho skrýt ze seznamu aplikací"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Přístup do soukromého prostoru, když je skrytý"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Ve vyhledávacím poli vyhledejte text „soukromý prostor“."</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Klepněte na dlaždici Soukromý prostor"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Odemknutí soukromého prostoru"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Vypnuto"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Zapnuto"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Systém"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Vytvořit soukromý prostor"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Smazat soukromý prostor"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Soukromý prostor se nepodařilo vytvořit"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Soukromý prostor byl úspěšně smazán"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Soukromý prostor se nepodařilo vytvořit"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Nastavte zámek obrazovky"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Pokud chcete používat soukromý prostor, nastavte na tomto zařízení zámek obrazovky."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Nastavit zámek obrazovky"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Zrušit"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Zrušit"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Nastavit"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Nastavení soukromého prostoru"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Skryjte soukromé aplikace do zabezpečeného prostoru přístupného pouze pro vás"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Jak to funguje"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Soukromý prostor můžete otevřít ze spodní části seznamu aplikací"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikace v soukromém prostoru jsou chráněny zámkem"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Když je soukromý prostor uzamčen, jsou oznámení aplikací v soukromém prostoru skryta"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Když je soukromý prostor uzamčen, aplikace v soukromém prostoru se nezobrazují ve správci oprávnění, na panelu ochrany soukromí ani v dalších nastaveních"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Nastavování soukromého prostoru…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Soukromý prostor je chráněn zámkem"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Když je soukromý prostor uzamčen, informace o využití aplikací v soukromém prostoru jsou skryty"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Přístup k soukromému prostoru ze seznamu aplikací"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Soukromý prostor se nepodařilo nastavit"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Zkuste to teď znovu nebo se vraťte později"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Zkusit znovu"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Použít k odemknutí zámek obrazovky?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Soukromý prostor můžete odemykat stejně, jako odemykáte své zařízení, nebo můžete zvolit jiný zámek"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Použít zámek obrazovky"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Zvolit nový zámek"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Hotovo!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Pokud chcete získat přístup k soukromému prostoru, přejeďte prstem ze spodní části plochy nahoru a poté přejděte dolů"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Hotovo"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Pokud chcete otevřít soukromý prostor, přejděte dolů"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Maximální počet otisků prstů, které lze přidat: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Přidali jste maximální počet otisků prstů"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Další otisky prstů nelze přidat"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Při složení pokračovat v používání aplikací"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Plynulé zobrazení"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"U některého obsahu automaticky zvýší obnovovací frekvenci z 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz. Zvyšuje využití baterie."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"U některého obsahu automaticky zvýší obnovovací frekvenci až na <xliff:g id="ID_1">%1$d</xliff:g> Hz. Zvyšuje využití baterie."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Vynutit nejvyšší obnovovací frekvenci"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Vyšší obnovovací frekvence za účelem vylepšení responzivity klepnutí a kvality animace. Zvyšuje využití baterie."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Vnímavá obrazovka"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Komunální nastavení"</string>
<string name="apn_settings" msgid="4295467389400441299">"Přístupové body"</string>
<string name="apn_edit" msgid="2003683641840248741">"Upravit přístupový bod"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Přidání přístupového bodu"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Nenastaveno"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nenastaveno"</string>
<string name="apn_name" msgid="6677695784108157953">"Název"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Otevření pomocí tlačítka přístupnosti"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Otevřete podržením tlačítek hlasitosti"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Otevřete trojitým klepnutím na obrazovku"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Otevření provedete trojitým klepnutím dvěma prsty na obrazovku"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Otevření gestem"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Použití gesta přístupnosti"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Tuto funkci použijete klepnutím na tlačítko Přístupnost <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> v dolní části obrazovky.\n\nChcete-li přepnout mezi funkcemi, tlačítko Přístupnost podržte."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Pokud chcete použít tuto funkci, klepněte na tlačítko přístupnosti."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Tuto funkci použijete tak, že stisknete a podržíte obě tlačítka hlasitosti."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Zvětšení aktivujete nebo deaktivujete trojitým klepnutím kamkoliv na obrazovce."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Zvětšení aktivujete nebo deaktivujete trojitým klepnutím dvěma prsty kamkoliv na obrazovku."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Tuto funkci použijete tak, že přejedete dvěma prsty z dolního okraje obrazovky nahoru.\n\nPokud chcete přepnout mezi funkcemi, přejeďte dvěma prsty nahoru a podržte je."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Tuto funkci použijete tak, že přejedete třemi prsty z dolního okraje obrazovky nahoru.\n\nChcete-li přepnout mezi funkcemi, přejeďte třemi prsty nahoru a podržte je."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Funkce pro usnadnění přístupu použijete tak, že přejedete dvěma prsty z dolního okraje obrazovky nahoru.\n\nPokud chcete přepnout mezi funkcemi, přejeďte dvěma prsty nahoru a podržte je."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Podržení tlačítek hlasitosti"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"podržení tlačítek hlasitosti"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Podržte obě tlačítka hlasitosti"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Tojité klepnutí na obrazovku dvěma prsty"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trojité klepnutí na obrazovku dvěma prsty"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Rychle {0,number,integer}krát klepnout na obrazovku dvěma prsty"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Trojité klepnutí na obrazovku"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"trojité klepnutí na obrazovku"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Rychle {0,number,integer}krát klepněte na obrazovku. Tato zkratka může zařízení zpomalit."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Používat vibrace a hmatovou odezvu"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibrace u budíku"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibrace u médií"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibrace klávesnice"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibrace při vyzvánění"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibrace při oznámení"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Odezva při klepnutí"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Pokud u aplikace omezíte aktivitu na pozadí, může dojít k nepředvídatelnému chování"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Aplikace není nastavena k optimalizaci baterie, nelze ji tedy omezit.\n\nChcete-li ji omezit, nejprve zapněte optimalizaci."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Správa využití baterie"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Povolení použití na pozadí"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Aktivujte, pokud máte zájem o aktualizace v reálném čase, deaktivujte, pokud chcete šetřit baterii"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neomezeno"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimalizováno"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Omezeno"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"velikost textu, velké písmo, velký text, slabozrakost, zvětšení textu, zvětšovač písma, zvětšení písma"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"vždy zapnuté ambientní zobrazení, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, štítek, čtečka"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klávesnice, hmatová odezva, vibrace,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Hlasitost, vibrace, režim Nerušit"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Hlasitost médií"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Hlasitost odesílání"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Povolit přístup ke správě všech souborů"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Když tuto možnost povolíte, aplikace bude moci načítat, upravovat a mazat soubory v tomto zařízení a v připojených úložištích. Aplikace bude mít přístup k souborům i bez vašeho vědomí."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Mají přístup ke všem souborům"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Oznámení na celou obrazovku"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Povolte oznámení z této aplikace na celou obrazovku"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Povolte této aplikaci zobrazovat oznámení na celou obrazovku, když bude zařízení zamknuté. Aplikace tak mohou zvýraznit budíky, příchozí hovory a další důležitá oznámení."</string>
@@ -4886,6 +4940,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Kontrola aplikace ohledně phishingu"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Použít kontrolu"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Použít kontrolu pracovních aplikací"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Kontrola probíhá soukromě přímo v zařízení. Kontrolujte se případná phishingová nebo jiná podvodná aktivita v aplikacích. Pokud na něco takového narazíme, určité informace o aplikaci se odešlou do funkce Google Play Protect, abychom potvrdili hrozbu a varovali uživatele."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Toto je chráněná bezpečnostní funkce. S Googlem nejsou sdílené žádné informace o zařízení ani osobní údaje. \n\nPhishingem se rozumí pokus o odcizení přihlašovacích nebo jiných osobních údajů."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index caa1567..07c9b11 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Deaktiver Bluetooth LE-lyd"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Deaktiverer funktionen Bluetooth LE-lyd, hvis enheden understøtter denne LE-lyd til hardware."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Vis kontakten til LE-lyd i Enhedsoplysninger"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omgå tilladelsesliste for Bluetooth LE-lyd"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Brug LE-lyd som standard, selvom det ikke er verificeret, at den eksterne LE-lydenhed opfylder kriterierne for tilladelseslisten."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medieenheder"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Opkaldsenheder"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Andre enheder"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Gemte enheder"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Knyttet til kontoen"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Tidligere anvendt med kontoen"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth aktiveres for at parre"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Præferencer for forbindelser"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Tidligere forbindelser"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Skriv i tekstfelter"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorer alle tryk på styluspen-knappen"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Styluspen"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Deling af lyd"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Del lyd"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Opkald og alarmer"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Dato og klokkeslæt"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Ryd"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privat rum"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Skjul apps i en privat mappe"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Lås op ved hjælp af en skærmlås"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Vis det private rum"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Skjul, når det er låst"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Skjul det private rum, når det er låst"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Hvis andre ikke må kende til det private rum på din enhed, kan du skjule det på listen over apps"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Åbn dit private rum, når det er skjult"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Søg efter \"privat rum\" i søgefeltet"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tryk på handlingsfeltet Privat rum"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Lås dit private rum op"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Fra"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Til"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Opret et privat rum"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Slet det private rum"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Det private rum kunne ikke oprettes"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Det private rum er slettet"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Det private rum kunne ikke slettes"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Konfigurer en skærmlås"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Konfigurer en skærmlås på enheden for at bruge private rum"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Konfigurer skærmlås"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Annuller"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Annuller"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Konfigurer"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Konfigurer et privat rum"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Skjul private apps et sikkert sted, som kun du har adgang til"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Sådan fungerer det"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Du få adgang til det private rum nederst på din liste over apps"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps i et privat rum er beskyttet af en lås"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifikationer fra apps i det private rum er skjult, når det private rum er låst"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Apps i et privat rum vises ikke i tilladelsesmanager, privatlivspanelet eller andre indstillinger, når det private rum er låst"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Konfigurerer et privat rum…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Det private rum er beskyttet af en lås"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Oplysninger om brug for apps i et privat rum er skjult, når det private rum er låst"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Få adgang til dit private rum via din liste over apps"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Det private rum kunne ikke konfigureres"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Prøv igen nu, eller vend tilbage senere"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Prøv igen"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Vil du bruge skærmlås til at låse op?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Du kan låse op for det private rum på samme måde, som du låser din enhed op, eller ved at vælge en anden lås"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Brug skærmlås"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Vælg en ny lås"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Det var det hele."</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Stryg opad fra bunden af startskærmen, og rul ned for at få adgang til dit private rum"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Udfør"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Rul ned for at få adgang til det private rum"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Du kan tilføje op til <xliff:g id="COUNT">%d</xliff:g> fingeraftryk"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Du har tilføjet det maksimale antal fingeraftryk"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Du kan ikke tilføje flere fingeraftryk"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Fortsæt med at bruge apps på Fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Øger automatisk opdateringshastigheden fra 60 til <xliff:g id="ID_1">%1$s</xliff:g> Hz for noget indhold. Medfører højere batteriforbrug."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Øger automatisk opdateringshastigheden op til <xliff:g id="ID_1">%1$d</xliff:g> Hz for noget indhold. Medfører højere batteriforbrug."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Gennemtving højeste opdateringshastighed"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Den højeste opdateringshastighed, som giver forbedret animationskvalitet og reaktionsevne ved berøring. Medfører højere batteriforbrug."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Opmærksom skærm"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Fælles indstillinger"</string>
<string name="apn_settings" msgid="4295467389400441299">"Adgangspunkter"</string>
<string name="apn_edit" msgid="2003683641840248741">"Rediger adgangspunkt"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ikke angivet"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ikke angivet"</string>
<string name="apn_name" msgid="6677695784108157953">"Navn"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Brug knappen til hjælpefunktioner til at åbne"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold lydstyrkeknapperne nede for at åbne"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Tryk tre gange på skærmen for at åbne"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Tryk tre gange på skærmen med to fingre for at åbne"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Brug en bevægelse til at åbne"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Brug bevægelsen for hjælpefunktioner"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Tryk på knappen til hjælpefunktioner <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> nederst på skærmen for at bruge denne funktion.\n\nDu kan skifte mellem funktioner ved at holde knappen til hjælpefunktioner nede."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Tryk på knappen til hjælpefunktioner på din skærm for at bruge denne funktion."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Hold begge lydstyrkeknapper nede for at bruge denne funktion."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Du kan starte og stoppe forstørrelse ved at trykke tre gange på skærmen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Du kan starte og stoppe forstørrelse ved at trykke tre gange på skærmen med to fingre."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Stryg opad fra bunden af skærmen med to fingre for at bruge denne funktion.\n\nDu kan skifte mellem funktioner ved at stryge opad med to fingre og holde dem nede."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Stryg opad fra bunden af skærmen med tre fingre for at bruge denne funktion.\n\nDu kan skifte mellem funktioner ved at stryge opad med tre fingre og holde dem nede."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Stryg opad fra bunden af skærmen med to fingre for at bruge en hjælpefunktion.\n\nDu kan skifte mellem funktioner ved at stryge opad med to fingre og holde dem nede."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold lydstyrkeknapperne nede"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold lydstyrkeknapperne nede"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Hold begge lydstyrkeknapper nede"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Tryk tre gange på skærmen med to fingre"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"tryk tre gange på skærmen med to fingre"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Tryk hurtigt på skærmen {0,number,integer} gange med to fingre"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tryk tre gange på skærmen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tryk tre gange på skærmen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Tryk hurtigt på skærmen {0,number,integer} gange. Denne genvej kan gøre din enhed langsommere"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Brug vibration og haptik"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibration for alarm"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibration for medier"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Tastaturvibration"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibration ved opkald"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibration ved notifikation"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Feedback ved tryk"</string>
@@ -2197,7 +2249,7 @@
<string name="keywords_accessibility" msgid="8593989878379366798">"syn, hørelse, blind, døv, mobilitet, fingerbevægelighed, hjælp, hjælpefunktion, brugervenlighed, nem adgang, hånd, assistance"</string>
<string name="keywords_magnification" msgid="3908145308269840862">"Forstørrelse af vindue, zoom, forstørrelse, nedsat syn, forstør, gør større"</string>
<string name="keywords_talkback" msgid="2816435437095102527"></string>
- <string name="keywords_live_caption" msgid="1667203998080567556">"Tekster, undertekster for hørehæmmede, undertekster, Live transskribering, hørehæmmet, hørelsestab, CART, indtaling, undertekst"</string>
+ <string name="keywords_live_caption" msgid="1667203998080567556">"Tekster, undertekster for hørehæmmede, undertekster, Livetransskribering, hørehæmmet, hørelsestab, CART, indtaling, undertekst"</string>
<string name="keywords_live_transcribe" msgid="3226990195174890997"></string>
<string name="keywords_sound_notifications" msgid="8183107485754075413"></string>
<string name="keywords_sound_amplifier" msgid="939404835256246663"></string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Hvis du begrænser en apps baggrundsaktivitet, kan det medføre, at den ikke fungerer korrekt"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Appen kan ikke begrænses, da batterioptimering er deaktiveret.\n\nAktivér batterioptimering for at begrænse appen."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Administrer batteriforbrug"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Ubegrænset"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimeret"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Begrænset"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tekststørrelse, stor skrifttype, store bogstaver, stor skrifttype, stor tekst, nedsat syn, gør teksten større, større skrifttype, forstørrelse af skrifttype"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"altid tændt pauseskærm, AOD (always on ambient display)"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, læser"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastatur, haptisk teknologi, vibration"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Lydstyrke, vibration, Forstyr ikke"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Lydstyrke for medier"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Lydstyrke for castet indhold"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Tillad administrationsadgang til alle filer"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Giv denne app tilladelse til at læse, ændre og slette alle filer på denne enhed eller andre tilsluttede lagringsløsninger. Hvis du giver tilladelse til dette, kan appen få adgang til dine filer, uden du specifikt bliver gjort opmærksom på det."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Kan få adgang til alle filer"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notifikationer i fuld skærm"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Tillad notifikationer i fuld skærm fra denne app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Tillad appen at vise notifikationer, der fylder hele skærmen, når enheden er låst. Apps kan benytte denne mulighed til at fremhæve alarmer, indgående opkald og andre presserende notifikationer."</string>
@@ -4107,7 +4168,7 @@
<string name="enterprise_privacy_enterprise_installed_packages" msgid="9114143640515900082">"Installerede apps"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="7959907857710107792">"Antallet af apps er et skøn. Apps, der er blevet installeret uden for Play Butik, er muligvis ikke medregnet."</string>
<string name="enterprise_privacy_number_packages_lower_bound" msgid="5317634640873658149">"{count,plural, =1{Mindst # app}one{Mindst # app}other{Mindst # apps}}"</string>
- <string name="enterprise_privacy_location_access" msgid="8023838718108456971">"Adgangstilladelser til lokation"</string>
+ <string name="enterprise_privacy_location_access" msgid="8023838718108456971">"Lokationstilladelser"</string>
<string name="enterprise_privacy_microphone_access" msgid="7242958026470143653">"Adgangstilladelser til mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="7685460535880069016">"Adgangstilladelser til kamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="7498546659083996300">"Standardapps"</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Tjek appaktivitet for phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Brug scanning"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Brug scanning til arbejdsapps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanningen kører privat og direkte på din enhed. Den tjekker appaktivitet for phishing eller anden form for vildledende adfærd. Hvis en sådan adfærd registreres, sendes visse appoplysninger til Google Play Protect for at bekræfte tilstedeværelsen af truslen og advare appbrugerne."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Dette er en beskyttet sikkerhedsfunktion. Ingen oplysninger om enheden eller personlige oplysninger deles med Google. \n\nPhishing er et forsøg på at stjæle loginoplysninger eller andre personlige oplysninger."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 0624c94..d09edb4 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audio deaktivieren"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Deaktiviert die Bluetooth LE Audio-Funktion, wenn das Gerät LE Audio-Hardwarefunktionen unterstützt."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Ein/Aus für LE Audio in Gerätedetails"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio-Zulassungsliste umgehen"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio wird standardmäßig verwendet, selbst wenn ein LE Audio-Peripheriegerät nicht die Kriterien der Zulassungsliste erfüllt."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Mediengeräte"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Anrufgeräte"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Andere Geräte"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Gespeicherte Geräte"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Mit Konto verknüpft"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Zuvor mit Konto verwendet"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth wird aktiviert, um das Koppeln zu ermöglichen"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Verbindungseinstellungen"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Zuletzt verbundene Geräte"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Textfelder ausfüllen"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Drücken der Taste am Eingabestift ignorieren"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Eingabestift"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audiofreigabe"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Audioinhalte freigeben"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Anrufe und Wecker"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Datum & Uhrzeit"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Löschen"</string>
@@ -537,7 +547,24 @@
<string name="private_space_title" msgid="7078627930195569767">"Privater Bereich"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Apps in privatem Ordner verstecken"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Mit Displaysperre entsperren"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Privaten Bereich anzeigen"</string>
+ <!-- no translation found for private_space_hide_title (8687034008994037610) -->
+ <skip />
+ <!-- no translation found for privatespace_hide_page_title (972581369094289386) -->
+ <skip />
+ <!-- no translation found for privatespace_hide_page_summary (1052569521186403642) -->
+ <skip />
+ <!-- no translation found for privatespace_access_header (982809349769470185) -->
+ <skip />
+ <!-- no translation found for privatespace_search_description (983837656432484282) -->
+ <skip />
+ <!-- no translation found for privatespace_tap_tile_description (4146608898639668340) -->
+ <skip />
+ <!-- no translation found for privatespace_unlock_description (4132755357482447360) -->
+ <skip />
+ <!-- no translation found for privatespace_hide_off_summary (7227778747159633671) -->
+ <skip />
+ <!-- no translation found for privatespace_hide_on_summary (6136704537527640183) -->
+ <skip />
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Privaten Bereich erstellen"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Privaten Bereich löschen"</string>
@@ -546,6 +573,41 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Privater Bereich konnte nicht erstellt werden"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privater Bereich wurde gelöscht"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Privater Bereich konnte nicht gelöscht werden"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Displaysperre einrichten"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Zur Nutzung von „Privater Bereich“ auf dem Gerät Displaysperre einrichten."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Displaysperre einrichten"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Abbrechen"</string>
+ <!-- no translation found for privatespace_cancel_label (362351004019511784) -->
+ <skip />
+ <!-- no translation found for privatespace_setup_button_label (3696372546231047258) -->
+ <skip />
+ <!-- no translation found for privatespace_setup_title (177623114624330394) -->
+ <skip />
+ <!-- no translation found for privatespace_hide_apps_summary (4016518749055602268) -->
+ <skip />
+ <!-- no translation found for privatespace_how_title (8794102046435526065) -->
+ <skip />
+ <!-- no translation found for privatespace_access_bottom_text (1075244097441349030) -->
+ <skip />
+ <!-- no translation found for privatespace_protected_lock_text (7320604832432017423) -->
+ <skip />
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Benachrichtigungen von Apps im privaten Bereich werden nicht angezeigt, wenn dieser gesperrt ist"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Apps im privaten Bereich werden nicht im Berechtigungsmanager, im Privatsphäredashboard und in anderen Einstellungen angezeigt, wenn der private Bereich gesperrt ist"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Der private Bereich wird eingerichtet…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Der private Bereich ist durch eine Sperre geschützt"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Informationen zur Nutzung von Apps im privaten Bereich sind verborgen, wenn dieser gesperrt ist"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Über die App-Liste auf den privaten Bereich zugreifen"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Der private Bereich konnte nicht eingerichtet werden"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Du kannst es jetzt oder später noch einmal versuchen"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Wiederholen"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Displaysperre zum Entsperren verwenden?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Du kannst den privaten Bereich auf dieselbe Weise entsperren wie dein Gerät oder eine andere Sperre auswählen"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Displaysperre verwenden"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Neue Sperre auswählen"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Fertig!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Wische vom unteren Rand deines Startbildschirms nach oben und scrolle dann nach unten, um auf den privaten Bereich zuzugreifen"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Fertig"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scrolle nach unten, um auf den privaten Bereich zuzugreifen"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Du kannst bis zu <xliff:g id="COUNT">%d</xliff:g> Fingerabdrücke hinzufügen."</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Du hast die maximale Anzahl an Fingerabdrücken hinzugefügt"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Es können keine Fingerabdrücke mehr hinzugefügt werden"</string>
@@ -1063,7 +1125,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Apps weiterhin verwenden, wenn das Gerät zusammengeklappt ist"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Setzt die Aktualisierungsrate für einige Inhalte automatisch von 60 auf <xliff:g id="ID_1">%1$s</xliff:g> Hz herauf. Erhöht den Akkuverbrauch."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Setzt die Aktualisierungsrate für einige Inhalte automatisch auf <xliff:g id="ID_1">%1$d</xliff:g> Hz herauf. Dadurch wird die Akkunutzung erhöht."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Maximale Aktualisierungsrate erzwingen"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Höchste Aktualisierungsrate für bessere Touchscreen-Reaktion und flüssigere Animationen. Erhöhter Akkuverbrauch."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Aufmerksamkeitserkennung"</string>
@@ -1299,6 +1361,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Gemeinschaftliche Einstellungen"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Zugangspunkt bearbeiten"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nicht definiert"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nicht festgelegt"</string>
<string name="apn_name" msgid="6677695784108157953">"Name"</string>
@@ -1933,19 +1997,21 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Zum Öffnen Schaltfläche „Bedienungshilfen“ nutzen"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Zum Öffnen die Lautstärketasten gedrückt halten"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Zum Öffnen dreimal auf das Display tippen"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Zum Öffnen mit zwei Fingern dreimal auf das Display tippen"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Zum Öffnen Touch-Geste verwenden"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Touch-Geste für Bedienungshilfen verwenden"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Wenn du diese Funktion verwenden möchtest, tippe unten auf dem Display auf die Schaltfläche \"Bedienungshilfen\" <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nWenn du zwischen den Funktionen wechseln möchtest, halte diese Schaltfläche gedrückt."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Tippe zum Verwenden dieser Funktion auf dem Display auf die Schaltfläche „Bedienungshilfen“."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Wenn du diese Funktion verwenden möchtest, halte beide Lautstärketasten gedrückt."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Tippe dreimal auf das Display, um die Vergrößerung zu starten oder zu beenden."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Tippe zum Starten oder Beenden der Vergrößerung mit zwei Fingern dreimal auf eine beliebige Stelle des Displays."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Wenn du diese Funktion verwenden möchtest, wische vom unteren Displayrand mit zwei Fingern nach oben.\n\nWenn du zwischen den Funktionen wechseln möchtest, wische mit zwei Fingern über das Display nach oben und halte."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Wenn du diese Funktion verwenden möchtest, wische vom unteren Displayrand mit drei Fingern nach oben.\n\nWenn du zwischen den Funktionen wechseln möchtest, wische mit drei Fingern über das Display nach oben und halte."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Wenn du eine Bedienungshilfe verwenden möchtest, wische vom unteren Displayrand mit zwei Fingern nach oben.\n\nWenn du zwischen den Funktionen wechseln möchtest, wische mit zwei Fingern über das Display nach oben und halte."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings_talkback" msgid="7292969929578621958">"Wenn du eine Bedienungshilfe verwenden möchtest, wische vom unteren Displayrand mit drei Fingern nach oben.\n\nWenn du zwischen den Funktionen wechseln möchtest, wische mit drei Fingern über das Display nach oben und halte."</string>
<string name="accessibility_tutorial_dialog_button" msgid="2031773187678948436">"OK"</string>
<string name="accessibility_tutorial_dialog_link_button" msgid="6797349445794031781">"Schaltflächeneinstellungen"</string>
- <string name="accessibility_shortcut_title" msgid="8125867833704517463">"Kurzbefehl für „<xliff:g id="SERVICE">%1$s</xliff:g>“"</string>
+ <string name="accessibility_shortcut_title" msgid="8125867833704517463">"Kurzbefehl für <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_edit_summary_software" msgid="6405629977940618205">"Schaltfläche „Bedienungshilfen“"</string>
<string name="accessibility_shortcut_edit_summary_software_gesture" msgid="5489284264414421286">"Touch-Geste für Bedienungshilfen"</string>
<string name="accessibility_shortcut_edit_dialog_title_software_gesture" msgid="8078659880723370597">"Mit zwei Fingern nach oben wischen"</string>
@@ -1960,6 +2026,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Lautstärketasten gedrückt halten"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"Lautstärketasten gedrückt halten"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Halte beide Lautstärketasten gedrückt"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Mit zwei Fingern dreimal auf das Display tippen"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"mit zwei Fingern dreimal auf das Display tippen"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Tippe {0,number,integer}-Mal schnell mit zwei Fingern auf das Display"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Dreimal auf den Bildschirm tippen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"dreimal auf den Bildschirm tippen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Tippe {0,number,integer}-mal schnell auf das Display. Durch diesen Kurzbefehl kann dein Gerät langsamer werden."</string>
@@ -2047,8 +2116,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Vibration & haptisches Feedback verwenden"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibration für Wecker"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibration für Medien"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Tastenvibration"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibration bei Klingeln"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibration bei Benachrichtigungseingang"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Haptisches Feedback"</string>
@@ -2258,6 +2326,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Wenn du die Hintergrundaktivität einer App einschränkst, kann dies zu unerwünschtem Verhalten führen"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Da bei dieser App die Akkunutzung nicht optimiert wird, kannst du sie nicht einschränken.\n\nDu musst du zunächst die Akkuoptimierung aktivieren."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Akkunutzung verwalten"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Uneingeschränkt"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimiert"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Eingeschränkt"</string>
@@ -2616,8 +2688,7 @@
<string name="data_usage_app_summary_title" msgid="4933742247928064178">"Mobile Daten und WLAN"</string>
<string name="account_settings_menu_auto_sync_personal" msgid="2905595464540145671">"Private Daten autom. synchronisieren"</string>
<string name="account_settings_menu_auto_sync_work" msgid="8561102487795657789">"Arbeitsdaten autom. synchronisieren"</string>
- <!-- no translation found for account_settings_menu_auto_sync_private (2315144351530596228) -->
- <skip />
+ <string name="account_settings_menu_auto_sync_private" msgid="2315144351530596228">"Pers. Daten autom. synchr."</string>
<string name="data_usage_change_cycle" msgid="4501026427365283899">"Zyklus ändern..."</string>
<string name="data_usage_pick_cycle_day" msgid="3548922497494790123">"Tag, an dem Datenverbrauchszyklus zurückgesetzt wird:"</string>
<string name="data_usage_empty" msgid="5619908658853726866">"Kein Datenverbrauch in diesem Zeitraum"</string>
@@ -3060,8 +3131,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"Textgröße, Großdruck, Großschrift, großer Text, eingeschränktes Sehvermögen, Text vergrößern, Textvergrößerung"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"immer aktiver Bildschirmschoner, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, Tag, Lesegerät"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"Tastatur, Haptik, Vibration"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Lautstärke, Vibration, Bitte nicht stören"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Medienlautstärke"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Streaminglautstärke"</string>
@@ -3368,28 +3438,17 @@
<string name="notif_listener_not_migrated" msgid="6265206376374278226">"Diese App unterstützt erweiterte Einstellungen nicht"</string>
<string name="notif_listener_more_settings" msgid="1348409392307208921">"Weitere Einstellungen"</string>
<string name="notif_listener_more_settings_desc" msgid="7995492074281663658">"Weitere Einstellungen sind in dieser App verfügbar"</string>
- <!-- no translation found for notification_polite_title (6121016426991791557) -->
- <skip />
- <!-- no translation found for notification_polite_all_apps (1118651561594250059) -->
- <skip />
- <!-- no translation found for notification_polite_all_apps_summary (540268373207498126) -->
- <skip />
- <!-- no translation found for notification_polite_conversations (8197695136727245741) -->
- <skip />
- <!-- no translation found for notification_polite_conversations_summary (2677141765664359994) -->
- <skip />
- <!-- no translation found for notification_polite_disabled (1378078021594282842) -->
- <skip />
- <!-- no translation found for notification_polite_disabled_summary (1145341260283746936) -->
- <skip />
- <!-- no translation found for notification_polite_vibrate_unlocked (6142573851761357903) -->
- <skip />
- <!-- no translation found for notification_polite_vibrate_unlocked_summary (1678472892282874459) -->
- <skip />
- <!-- no translation found for notification_polite_work (8823596456640216391) -->
- <skip />
- <!-- no translation found for notification_polite_work_summary (8260947839104352075) -->
- <skip />
+ <string name="notification_polite_title" msgid="6121016426991791557">"Verringern der Benachrichtigungslautstärke"</string>
+ <string name="notification_polite_all_apps" msgid="1118651561594250059">"Verringern der Lautstärke auf alle Benachrichtigungen anwenden"</string>
+ <string name="notification_polite_all_apps_summary" msgid="540268373207498126">"Benachrichtigungslautstärke schrittweise verringern, wenn von derselben App viele Benachrichtigungen nacheinander eingehen"</string>
+ <string name="notification_polite_conversations" msgid="8197695136727245741">"Verringern der Lautstärke auf Unterhaltungen anwenden"</string>
+ <string name="notification_polite_conversations_summary" msgid="2677141765664359994">"Benachrichtigungslautstärke schrittweise verringern, wenn von demselben Chat viele Nachrichten innerhalb kurzer Zeit eingehen"</string>
+ <string name="notification_polite_disabled" msgid="1378078021594282842">"Verringern der Benachrichtigungslautstärke nicht verwenden"</string>
+ <string name="notification_polite_disabled_summary" msgid="1145341260283746936">"Benachrichtigungslautstärke nie verringern, unabhängig von der Anzahl der von derselben App nacheinander erhaltenen Benachrichtigungen"</string>
+ <string name="notification_polite_vibrate_unlocked" msgid="6142573851761357903">"Vibration, wenn entsperrt"</string>
+ <string name="notification_polite_vibrate_unlocked_summary" msgid="1678472892282874459">"Vibration nur bei entsperrtem Display"</string>
+ <string name="notification_polite_work" msgid="8823596456640216391">"Auf Arbeitsprofile anwenden"</string>
+ <string name="notification_polite_work_summary" msgid="8260947839104352075">"Einstellungen für das Verringern der Benachrichtigungslautstärke des privaten Profils auf das Arbeitsprofil anwenden"</string>
<string name="vr_listeners_title" msgid="4960357292472540964">"VR-Hilfsdienste"</string>
<string name="no_vr_listeners" msgid="8442646085375949755">"Keine installierte App hat die Ausführung als VR-Hilfedienst angefordert."</string>
<string name="vr_listener_security_warning_title" msgid="7026351795627615177">"VR-Dienstzugriff für <xliff:g id="SERVICE">%1$s</xliff:g> erlauben?"</string>
@@ -3781,6 +3840,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Zugriff zum Verwalten aller Dateien zulassen"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Du kannst dieser App erlauben, alle Dateien auf diesem Gerät und auf allen verbundenen Laufwerken zu lesen, zu ändern und zu löschen. Sie kann dann ohne deine explizite Zustimmung auf Dateien zugreifen."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Auf alle Dateien zugreifen"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Vollbildbenachrichtigungen"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Vollbildbenachrichtigungen von dieser App erlauben"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Diese App darf Benachrichtigungen anzeigen, die das gesamte Display ausfüllen, wenn das Gerät gesperrt ist. Apps können diese verwenden, um Wecker, eingehende Anrufe oder andere dringende Benachrichtigungen hervorzuheben."</string>
@@ -4819,8 +4884,8 @@
<string name="background_install_before" msgid="8608614957688912715">"{count,plural, =1{Apps, die innerhalb des letzten Monats installiert wurden}other{Apps, die innerhalb der letzten # Monate installiert wurden}}"</string>
<string name="background_install_after" msgid="7983488897570908149">"{count,plural, =1{Apps, die vor mehr als # Monat installiert wurden}other{Apps, die vor mehr als # Monaten installiert wurden}}"</string>
<string name="aspect_ratio_title" msgid="2451826875939676101">"Seitenverhältnis"</string>
- <string name="aspect_ratio_summary" msgid="4056406351663726494">"Probiere ein neues Seitenverhältnis für diese App aus, wenn sie nicht für dein Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) optimiert ist"</string>
- <string name="aspect_ratio_main_summary" msgid="4141964559612756940">"Probiere ein neues Seitenverhältnis für diese App aus, wenn sie nicht für dein Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) optimiert ist. Einige Apps sind möglicherweise nicht für bestimmte Seitenverhältnisse optimiert."</string>
+ <string name="aspect_ratio_summary" msgid="4056406351663726494">"Probiere ein neues Seitenverhältnis für diese App aus, wenn sie nicht für dein Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) konzipiert wurde"</string>
+ <string name="aspect_ratio_main_summary" msgid="4141964559612756940">"Probiere ein neues Seitenverhältnis für diese App aus, wenn sie nicht für dein Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) konzipiert wurde. Einige Apps sind möglicherweise nicht für bestimmte Seitenverhältnisse optimiert."</string>
<string name="aspect_ratio_summary_text" msgid="4737461467467220325">"Probiere ein neues Seitenverhältnis für eine App aus, wenn sie nicht für dein Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) konzipiert wurde"</string>
<string name="aspect_ratio_main_summary_text" msgid="5544816872094235840">"Probiere ein neues Seitenverhältnis für eine App aus, wenn sie nicht für dein Gerät (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) konzipiert wurde. Einige Apps sind möglicherweise nicht für bestimmte Seitenverhältnisse optimiert."</string>
<string name="user_aspect_ratio_suggested_apps_label" msgid="8085934042329632039">"Vorgeschlagene Apps"</string>
@@ -4892,16 +4957,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Dein Gerätename ist für Apps, die du installiert hast, sichtbar. Wenn du dein Gerät mit Bluetooth-Geräten oder einem WLAN verbindest oder einen WLAN-Hotspot einrichtest, kann der Name möglicherweise auch von anderen Personen gesehen werden."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Genus"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Genus auswählen"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Auf Apps mit irreführenden Funktionen scannen"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"App-Aktivitäten auf Phishing prüfen"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Scannen verwenden"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Scannen für geschäftliche Apps verwenden"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 4ab9361..a0d4bf6 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Απενεργοποίηση Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Απενεργοποιεί τη λειτουργία Bluetooth LE Audio αν η συσκευή υποστηρίζει δυνατότητες εξοπλισμού LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Εναλλαγή LE Audio στις λεπτομ. συσκευής"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Παράκαμψη λίστας επιτρεπομένων Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Χρήση του LE Audio από προεπιλογή, ακόμα και αν το περιφερειακό LE Audio δεν έχει επαληθευτεί, ώστε να πληροί τα κριτήρια της λίστας επιτρεπομένων."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Συσκευές μέσων"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Συσκευές κλήσεων"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Άλλες συσκευές"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Αποθηκευμένες συσκευές"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Συσχετισμός με λογαριασμό"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Στο παρελθόν χρησιμοποιήθηκε με λογαριασμό"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Το Bluetooth θα ενεργοποιηθεί για σύζευξη"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Προτιμήσεις σύνδεσης"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Συνδέθηκαν στο παρελθόν"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Γραφή σε πεδία κειμένου"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Παράβλεψη όλων των πατημάτων του κουμπιού γραφίδας"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Γραφίδα"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Κοινή χρήση ήχου"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Κοινή χρήση ήχου"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Κλήσεις και ξυπνητήρια"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Σύνδεση σε ροή LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Κοντινές ροές ήχου"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Ροές ήχου"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Συνδεθείτε σε μια ροή ήχου χρησιμοποιώντας τον κωδικό QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Ημερομηνία & ώρα"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Διακομιστής μεσολάβησης"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Διαγραφή"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Ιδιωτικός χώρος"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Απόκρυψη εφαρμογών σε ιδιωτικό φάκελο"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Ξεκλείδωμα με χρήση κλειδώματος οθόνης"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Εμφάνιση Ιδιωτικού χώρου"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Απόκρυψη κατά το κλείδωμα"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Απόκρυψη Ιδιωτικού χώρου κατά το κλείδωμα"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Για να μην γνωρίζουν άλλοι τον Ιδιωτικό χώρο στη συσκευή σας, μπορείτε να τον κρύψετε από τη λίστα εφαρμογών"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Πρόσβαση στον Ιδιωτικό χώρο κατά την απόκρυψη"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Αναζητήστε τον Ιδιωτικό χώρο στη γραμμή αναζήτησης"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Πατήστε το πλακάκι Ιδιωτικός χώρος"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Ξεκλείδωμα του Ιδιωτικού χώρου"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Ανενεργός"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Ενεργός"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Σύστημα"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Δημιουργία Ιδιωτικού χώρου"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Διαγραφή Ιδιωτικού χώρου"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Δεν ήταν δυνατή η δημιουργία του Ιδιωτικού χώρου"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Ο Ιδιωτικός χώρος διαγράφηκε με επιτυχία"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Δεν ήταν δυνατή η διαγραφή του Ιδιωτικού χώρου"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ορισμός κλειδώματος οθόνης"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Για χρήση ιδιωτικού χώρου, ορίστε κλείδ. οθόνης στη συσκευή."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ρύθμιση κλειδώματος οθόνης"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Ακύρωση"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Ακύρωση"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Ρύθμιση"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Ρύθμιση Ιδιωτικού χώρου"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Κρύψτε τις ιδιωτικές εφαρμογές σε έναν ασφαλή χώρο στον οποίο μόνο εσείς έχετε πρόσβαση"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Πώς λειτουργεί"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Μπορείτε να αποκτήσετε πρόσβαση στον Ιδιωτικό χώρο από το κάτω μέρος της λίστας εφαρμογών"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Οι εφαρμογές στον Ιδιωτικό χώρο προστατεύονται με κλείδωμα"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Οι ειδοποιήσεις από εφαρμογές στον Ιδιωτικό χώρο είναι κρυφές όταν είναι κλειδωμένος"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Οι εφαρμογές στον Ιδιωτικό χώρο δεν θα εμφανίζονται στη Διαχείριση αδειών, στον πίνακα ελέγχου απορρήτου και σε άλλες ρυθμίσεις όταν ο Ιδιωτικός χώρος είναι κλειδωμένος"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Ρύθμιση Ιδιωτικού χώρου…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Ο Ιδιωτικός χώρος προστατεύεται με κλείδωμα"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Οι πληροφορίες χρήσης για τις εφαρμογές στον Ιδιωτικό χώρο είναι κρυφές όταν είναι κλειδωμένος"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Πρόσβαση στον Ιδιωτικό χώρο από τη λίστα εφαρμογών σας"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Δεν είναι δυνατή η ρύθμιση του Ιδιωτικού χώρου"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Δοκιμάστε ξανά τώρα ή επιστρέψτε αργότερα"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Επανάληψη"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Χρήση κλειδώματος οθόνης για ξεκλείδωμα;"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Μπορείτε να ξεκλειδώσετε τον Ιδιωτικό χώρο όπως ξεκλειδώνετε τη συσκευή σας ή να επιλέξετε διαφορετικό κλείδωμα"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Χρήση κλειδώματος οθόνης"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Επιλογή νέου κλειδώματος"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Όλα έτοιμα!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Για να αποκτήσετε πρόσβαση στον Ιδιωτικό χώρο, σύρετε προς τα επάνω από το κάτω μέρος της αρχικής οθόνης και έπειτα κάντε κύλιση προς τα κάτω"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Τέλος"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Κάντε κύλιση προς τα κάτω για πρόσβαση στον Ιδιωτικό χώρο"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Μπορείτε να προσθέσετε έως <xliff:g id="COUNT">%d</xliff:g> δακτυλικά αποτυπώματα"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Έχετε προσθέσει τον μέγιστο αριθμό δακτυλικών αποτυπωμάτων"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Δεν είναι δυνατή η προσθήκη περισσότερων δακτυλικών αποτυπωμάτων"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Συνέχιση χρήσης εφαρμογών κατά την αναδίπλωση"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Αυξάνει αυτόματα τον ρυθμό ανανέωσης από τα 60 στα <xliff:g id="ID_1">%1$s</xliff:g> Hz για ορισμένο περιεχόμενο. Αυξάνει τη χρήση μπαταρίας."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Αυξάνει αυτόματα τον ρυθμό ανανέωσης έως και <xliff:g id="ID_1">%1$d</xliff:g> Hz για ορισμένο περιεχόμενο. Αυξάνει τη χρήση μπαταρίας."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Επιβολή μέγιστου ρυθμού ανανέωσης"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Ο υψηλότερος δυνατός ρυθμός ανανέωσης για βελτιωμένη απόκριση αφής και ποιότητα κινούμενων εικόνων. Αυξάνει τη χρήση της μπαταρίας."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Παρακολούθηση οθόνης"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Κοινόχρηστες ρυθμίσεις"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Επεξ/σία σημ. πρόσβ."</string>
+ <string name="apn_add" msgid="9069613192201630934">"Προσθήκη σημείου πρόσβασης"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Δεν έχει ρυθμιστεί"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Δεν ορίστηκε"</string>
<string name="apn_name" msgid="6677695784108157953">"Όνομα"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Χρήση κουμπιού προσβασιμότητας για άνοιγμα"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Παρατεταμένο πάτημα πλήκτρων έντασης για άνοιγμα"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Πατήστε τρεις φορές για να ανοίξει η οθόνη"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Τριπλό πάτημα οθόνης με δύο δάχτυλα για άνοιγμα"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Χρήση κίνησης για άνοιγμα"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Χρήση κίνησης προσβασιμότητας"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Για να χρησιμοποιήσετε αυτήν τη λειτουργία, πατήστε το κουμπί προσβασιμότητας <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> στο κάτω μέρος της οθόνης.\n\nΓια εναλλαγή μεταξύ λειτουργιών, αγγίξτε παρατεταμένα το κουμπί προσβασιμότητας."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Για να χρησιμοποιήσετε αυτήν τη λειτουργία, πατήστε το κουμπί προσβασιμότητας στην οθόνη σας."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Για να χρησιμοποιήσετε αυτήν τη λειτουργία, πιέστε παρατεταμένα και τα δύο πλήκτρα έντασης ήχου."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Για έναρξη και διακοπή της μεγιστοποίησης, πατήστε τρεις φορές οπουδήποτε στην οθόνη σας."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Για έναρξη και διακοπή της μεγιστοποίησης, πατήστε τρεις φορές οπουδήποτε στην οθόνη με δύο δάχτυλα."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Για να χρησιμοποιήσετε αυτήν τη λειτουργία, σύρετε προς τα επάνω από το κάτω μέρος της οθόνης χρησιμοποιώντας 2 δάχτυλα.\n\nΓια εναλλαγή μεταξύ λειτουργιών, σύρετε προς τα επάνω με 2 και κρατήστε τα δάχτυλά σας στην οθόνη."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Για να χρησιμοποιήσετε αυτήν τη λειτουργία, σύρετε προς τα επάνω από το κάτω μέρος της οθόνης χρησιμοποιώντας 3 δάχτυλα.\n\nΓια εναλλαγή μεταξύ λειτουργιών, σύρετε προς τα επάνω με 3 και κρατήστε τα δάχτυλά σας στην οθόνη."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Για να χρησιμοποιήσετε μια λειτουργία προσβασιμότητας, σύρετε προς τα επάνω από το κάτω μέρος της οθόνης χρησιμοποιώντας 2 δάχτυλα.\n\nΓια εναλλαγή μεταξύ λειτουργιών, σύρετε προς τα επάνω με 2 δάχτυλα και κρατήστε τα δάχτυλά σας στην οθόνη."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Πατήστε παρατεταμένα τα πλήκτρα έντασης"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"παρατεταμένο πάτημα πλήκτρων έντασης"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Πατήστε παρατεταμένα και τα δύο πλήκτρα έντασης ήχου."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Τριπλό πάτημα οθόνης με δύο δάχτυλα"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"τριπλό πάτημα οθόνης με δύο δάχτυλα"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Πατήστε γρήγορα την οθόνη {0,number,integer} φορές με δύο δάχτυλα"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Τριπλό πάτημα οθόνης"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"τριπλό πάτημα οθόνης"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Πατήστε γρήγορα στην οθόνη {0,number,integer} φορές. Αυτή η συντόμευση μπορεί να μειώσει την ταχύτητα της συσκευής σας."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Χρήση δόνησης και απτικής λειτουργίας"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Δόνηση ξυπνητηριού"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Δόνηση μέσων"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Δόνηση πληκτρολογίου"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Δόνηση κλήσης"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Δόνηση ειδοποίησης"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Ανάδραση αφής"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Εάν περιορίσετε τη δραστηριότητα στο παρασκήνιο για μια εφαρμογή, μπορεί να μην λειτουργήσει σωστά"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Εφόσον δεν έχει οριστεί βελτιστοποίηση μπαταρίας, δεν είναι δυνατός ο περιορισμός της εφαρμογής.\n\nΓια περιορισμό, ενεργοποιήστε τη βελτιστοποίηση."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Διαχείριση χρήσης μπαταρίας"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Επιτρέψτε τη χρήση στο παρασκήνιο"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Ενεργοποιήστε για ενημερώσεις σε πραγματικό χρόνο, απενεργοποιήστε για εξοικονόμηση μπαταρίας"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Απεριόριστη"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Βελτιστοποιημένη"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Περιορισμένη"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"μέγεθος οθόνης, μεγάλη εκτύπωση, μεγάλη γραμματοσειρά, μεγάλο κείμενο, χαμηλή όραση, αύξηση μεγέθους κειμένου, εργαλείο αύξησης μεγέθους γραμματοσειράς, αύξηση μεγέθους γραμματοσειράς"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"πάντα ενεργή οθόνη ambient, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"εκπ, ετικέτα, αναγνώστης"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"πληκτρολόγιο, απτική λειτουργία, δόνηση,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Ένταση ήχου, δόνηση, λειτουργία \"Μην ενοχλείτε\""</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Ένταση ήχου πολυμέσων"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Ένταση ήχου μετάδοσης"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Να επιτρέπεται η πρόσβαση για τη διαχείριση όλων των αρχείων"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Να επιτρέπεται σε αυτή την εφαρμογή η ανάγνωση, η τροποποίηση και η διαγραφή όλων των αρχείων σε αυτήν τη συσκευή και σε κάθε συνδεδεμένη μονάδα αποθήκευσης. Εάν εκχωρηθούν σχετικά δικαιώματα, η εφαρμογή μπορεί να έχει πρόσβαση σε αρχεία χωρίς να έχετε ενημερωθεί ρητά."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Με πρόσβαση σε όλα τα αρχεία"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Ειδοποιήσεις σε πλήρη οθόνη"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Να επιτρέπονται οι ειδοποιήσεις σε πλήρη οθόνη από αυτή την εφαρμογή"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Να επιτρέπεται στην εφαρμογή η εμφάνιση ειδοποιήσεων σε πλήρη οθόνη όταν η συσκευή είναι κλειδωμένη. Οι εφαρμογές ενδέχεται να χρησιμοποιούν αυτήν τη λειτουργία για επισήμανση ξυπνητηριών, εισερχόμενων κλήσεων ή άλλων επειγουσών ειδοποιήσεων."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Έλεγχος δραστηριότητας σε εφαρμογές για ηλεκτρονικό ψάρεμα (phishing)"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Χρήση σάρωσης"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Χρήση σάρωσης για εφαρμογές εργασιών"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Η σάρωση εκτελείται ιδιωτικά απευθείας στη συσκευή σας, ελέγχοντας τη δραστηριότητα σε εφαρμογές για ηλεκτρονικό ψάρεμα (phishing) ή άλλη παραπλανητική συμπεριφορά. Αν εντοπιστεί κάτι από τα παραπάνω, ορισμένες πληροφορίες εφαρμογής αποστέλλονται στο Google Play Protect για να επιβεβαιωθεί η απειλή και να ειδοποιηθούν οι χρήστες της εφαρμογής."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Αυτή είναι μια προστατευόμενη λειτουργία ασφάλειας. Δεν κοινοποιούνται προσωπικά στοιχεία ή πληροφορίες συσκευής στην Google. \n\nΤο ηλεκτρονικό ψάρεμα (phishing) είναι μια απόπειρα κλοπής διαπιστευτηρίων σύνδεσης ή άλλων προσωπικών στοιχείων."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 78f6659..80ca54f 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Disable Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Disables the Bluetooth LE audio feature if the device supports LE audio hardware capabilities."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Show LE Audio toggle in Device details"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bypass Bluetooth LE Audio allowlist"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Use LE Audio by default even if LE Audio peripheral hasn\'t been verified to meet allowlist criteria."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Media devices"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Call devices"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Other devices"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saved devices"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associated with account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Previously used with account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth will turn on to pair"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Connection preferences"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Previously connected"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Write in text fields"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignore all stylus button presses"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio sharing"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Share audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Calls and alarms"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Date and time"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Clear"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Private Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Hide apps in a private folder"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Unlock using screen lock"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Show Private Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Hide when locked"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Hide Private Space when locked"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"To stop other people knowing Private Space is on your device, you can hide it from your apps list"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Access Private Space when hidden"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Search for \'Private Space\' in the search bar"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tap the Private Space tile"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Unlock your Private Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"On"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Create Private Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Delete Private Space"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Private Space could not be created"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Private Space successfully deleted"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Private Space could not be deleted"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Set a screen lock"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"To use Private Space, set a screen lock on this device."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Set screen lock"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancel"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancel"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Set up"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Set up Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Hide private apps in a secure space that only you can access"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"How it works"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"You can access Private Space from the bottom of your apps list"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Private Space are protected by a lock"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifications from apps in Private Space are hidden when it’s locked"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space apps won’t appear in permission manager, privacy dashboard and other settings when Private Space is locked"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Setting up Private Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space is protected by a lock"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Usage info for Private Space apps is hidden when it’s locked"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Access Private Space from your apps list"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Couldn’t set up Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Try again now, or come back later"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Try again"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Use screen lock to unlock?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"You can unlock Private Space the same way you unlock your device, or choose a different lock"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Use screen lock"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Choose new lock"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"All set!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"To access Private Space, swipe up from the bottom of your home screen, then scroll down"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Done"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll down to access Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"You can add up to <xliff:g id="COUNT">%d</xliff:g> fingerprints"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"You’ve added the maximum number of fingerprints"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Can’t add more fingerprints"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continue using apps on fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatically raises the refresh rate from 60 to <xliff:g id="ID_1">%1$s</xliff:g> Hz for some content. Increases battery usage."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatically raises the refresh rate up to <xliff:g id="ID_1">%1$d</xliff:g> Hz for some content. Increases battery usage."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Force peak refresh rate"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Highest refresh rate for improved touch responsiveness and animation quality. Increases battery usage."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Screen attention"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Communal settings"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit access point"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Not set"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Not set"</string>
<string name="apn_name" msgid="6677695784108157953">"Name"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Use Accessibility button to open"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold volume keys to open"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triple-tap screen to open"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Two-finger triple tap screen to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Use gesture to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Use accessibility gesture"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"To use this feature, tap the accessibility button <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch and hold the accessibility button."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"To use this feature, tap the Accessibility button on your screen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"To use this feature, press and hold both volume keys."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"To start and stop magnification, triple-tap anywhere on your screen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"To start and stop magnification, triple tap anywhere on your screen with two fingers."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"To use this feature, swipe up from the bottom of the screen with two fingers.\n\nTo switch between features, swipe up with two fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"To use this feature, swipe up from the bottom of the screen with three fingers.\n\nTo switch between features, swipe up with three fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"To use an accessibility feature, swipe up from the bottom of the screen with two fingers.\n\nTo switch between features, swipe up with two fingers and hold."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold volume keys"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold volume keys"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Press and hold both volume keys"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Two-finger triple tap screen"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"two-finger triple tap screen"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Quickly tap screen {0,number,integer} times with two fingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triple-tap screen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triple-tap screen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Quickly tap screen {0,number,integer} times. This shortcut may slow down your device"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Use vibration and haptics"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Alarm vibration"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Media vibration"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Keyboard vibration"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Ring vibration"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Notification vibration"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Touch feedback"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"If you limit background activity for an app, it may misbehave"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Since this app is not set to optimise battery, you can’t restrict it.\n\nTo restrict the app, first turn on battery optimisation."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Manage battery usage"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Unrestricted"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimised"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restricted"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"text size, large print, large font, large text, low vision, make text bigger, font enlarger, font enlargement"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"always on ambient display, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, reader"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"keyboard, haptics, vibrate,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibration, Do Not Disturb"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Media volume"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Cast volume"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Allow access to manage all files"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Can access all files"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Full-screen notifications"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Allow full-screen notifications from this app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Allow this app to show notifications that take up the full screen when the device is locked. Apps may use these to highlight alarms, incoming calls or other urgent notifications."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Check app activity for phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Use scanning"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Use scanning for work apps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanning runs privately directly on your device, checking app activity for phishing or other deceptive behaviour. If it\'s detected, some app info is sent to Google Play Protect to confirm the threat and warn app users."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"This is a protected security feature. No device or personal info is shared with Google. \n\nPhishing is an attempt to steal sign-in credentials or other personal info."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 5d47174..90b3ce4 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -120,6 +120,7 @@
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Other devices"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saved devices"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associated with account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Previously used with account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth will turn on to pair"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Connection preferences"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Previously connected"</string>
@@ -132,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Write in text fields"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignore all stylus button presses"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio sharing"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Share audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Calls and alarms"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Connect to a LE audio stream"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Nearby audio streams"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audio streams"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Connect to an audio stream using QR code"</string>
<string name="date_and_time" msgid="1788358029823431692">"Date and time"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Clear"</string>
@@ -535,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Private Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Hide apps in a private folder"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Unlock using screen lock"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Show Private Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Hide when locked"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Hide Private Space when locked"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"To stop other people knowing Private Space is on your device, you can hide it from your apps list"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Access Private Space when hidden"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Search for \'Private Space\' in the search bar"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tap the Private Space tile"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Unlock your Private Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"On"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Create Private Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Delete Private Space"</string>
@@ -544,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Private Space could not be created"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Private Space successfully deleted"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Private Space could not be deleted"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Set a screen lock"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"To use Private Space, set a screen lock on this device."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Set screen lock"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancel"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancel"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Set up"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Set up Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Hide private apps in a secure space that only you can access"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"How it works"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"You can access Private Space from the bottom of your apps list"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Private Space are protected by a lock"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifications from apps in Private Space are hidden when it’s locked"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space apps won’t appear in permission manager, privacy dashboard, and other settings when Private Space is locked"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Setting up Private Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space is protected by a lock"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Usage info for Private Space apps is hidden when it’s locked"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Access Private Space from your apps list"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Couldn’t set up Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Try again now, or come back later"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Try Again"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Use screen lock to unlock?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"You can unlock Private Space the same way you unlock your device, or choose a different lock"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Use screen lock"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Choose new lock"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"All set!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"To access Private Space, swipe up from the bottom of your home screen, then scroll down"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Done"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll down to access Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"You can add up to <xliff:g id="COUNT">%d</xliff:g> fingerprints"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"You’ve added the maximum number of fingerprints"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Can’t add more fingerprints"</string>
@@ -1061,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continue using apps on fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatically raises the refresh rate from 60 to <xliff:g id="ID_1">%1$s</xliff:g> Hz for some content. Increases battery usage."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatically raises the refresh rate up to <xliff:g id="ID_1">%1$d</xliff:g> Hz for some content. Increases battery usage."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Force peak refresh rate"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Highest refresh rate for improved touch responsiveness & animation quality. Increases battery usage."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Screen attention"</string>
@@ -1297,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Communal settings"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit access point"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Add access point"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Not set"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Not set"</string>
<string name="apn_name" msgid="6677695784108157953">"Name"</string>
@@ -1931,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Use accessibility button to open"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold volume keys to open"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triple-tap screen to open"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Two finger triple tap screen to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Use gesture to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Use accessibility gesture"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"To use this feature, tap the accessibility button <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch and hold the accessibility button."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"To use this feature, tap the accessibility button on your screen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"To use this feature, press and hold both volume keys."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"To start and stop magnification, triple-tap anywhere on your screen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"To start and stop magnification, triple-tap anywhere on your screen with two fingers."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"To use this feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"To use this feature, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"To use an accessibility feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold."</string>
@@ -1958,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold volume keys"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold volume keys"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Press and hold both volume keys"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Two-finger triple-tap screen"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"two-finger triple-tap screen"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Quickly tap screen {0,number,integer} times with two fingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triple-tap screen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triple-tap screen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Quickly tap screen {0,number,integer} times. This shortcut may slow down your device"</string>
@@ -2255,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"If you limit background activity for an app, it may misbehave"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Since this app is not set to optimize battery, you can\'t restrict it.\n\nTo restrict the app, first turn on battery optimization."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Manage battery usage"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Allow background usage"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Enable for real-time updates, disable to save battery"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Unrestricted"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimized"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restricted"</string>
@@ -3765,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Allow access to manage all files"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Can access all files"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Full screen notifications"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Allow full screen notifications from this app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Allow this app to show notifications that take up the full screen when the device is locked. Apps may use these to highlight alarms, incoming calls, or other urgent notifications."</string>
@@ -4880,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Check app activity for phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Use scanning"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Use scanning for work apps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanning runs privately right on your device, checking app activity for phishing or other deceptive behavior. If its detected, some app info is sent to Google Play Protect to confirm the threat and warn app users."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"This is a protected security feature. No device or personal info is shared with Google. \n\nPhishing is an attempt to steal sign-in credentials or other personal info."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index bbf77f7..3ff500a 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Disable Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Disables the Bluetooth LE audio feature if the device supports LE audio hardware capabilities."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Show LE Audio toggle in Device details"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bypass Bluetooth LE Audio allowlist"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Use LE Audio by default even if LE Audio peripheral hasn\'t been verified to meet allowlist criteria."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Media devices"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Call devices"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Other devices"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saved devices"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associated with account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Previously used with account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth will turn on to pair"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Connection preferences"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Previously connected"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Write in text fields"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignore all stylus button presses"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio sharing"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Share audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Calls and alarms"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Date and time"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Clear"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Private Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Hide apps in a private folder"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Unlock using screen lock"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Show Private Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Hide when locked"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Hide Private Space when locked"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"To stop other people knowing Private Space is on your device, you can hide it from your apps list"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Access Private Space when hidden"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Search for \'Private Space\' in the search bar"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tap the Private Space tile"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Unlock your Private Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"On"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Create Private Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Delete Private Space"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Private Space could not be created"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Private Space successfully deleted"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Private Space could not be deleted"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Set a screen lock"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"To use Private Space, set a screen lock on this device."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Set screen lock"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancel"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancel"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Set up"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Set up Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Hide private apps in a secure space that only you can access"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"How it works"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"You can access Private Space from the bottom of your apps list"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Private Space are protected by a lock"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifications from apps in Private Space are hidden when it’s locked"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space apps won’t appear in permission manager, privacy dashboard and other settings when Private Space is locked"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Setting up Private Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space is protected by a lock"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Usage info for Private Space apps is hidden when it’s locked"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Access Private Space from your apps list"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Couldn’t set up Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Try again now, or come back later"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Try again"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Use screen lock to unlock?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"You can unlock Private Space the same way you unlock your device, or choose a different lock"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Use screen lock"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Choose new lock"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"All set!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"To access Private Space, swipe up from the bottom of your home screen, then scroll down"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Done"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll down to access Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"You can add up to <xliff:g id="COUNT">%d</xliff:g> fingerprints"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"You’ve added the maximum number of fingerprints"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Can’t add more fingerprints"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continue using apps on fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatically raises the refresh rate from 60 to <xliff:g id="ID_1">%1$s</xliff:g> Hz for some content. Increases battery usage."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatically raises the refresh rate up to <xliff:g id="ID_1">%1$d</xliff:g> Hz for some content. Increases battery usage."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Force peak refresh rate"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Highest refresh rate for improved touch responsiveness and animation quality. Increases battery usage."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Screen attention"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Communal settings"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit access point"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Not set"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Not set"</string>
<string name="apn_name" msgid="6677695784108157953">"Name"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Use Accessibility button to open"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold volume keys to open"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triple-tap screen to open"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Two-finger triple tap screen to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Use gesture to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Use accessibility gesture"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"To use this feature, tap the accessibility button <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch and hold the accessibility button."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"To use this feature, tap the Accessibility button on your screen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"To use this feature, press and hold both volume keys."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"To start and stop magnification, triple-tap anywhere on your screen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"To start and stop magnification, triple tap anywhere on your screen with two fingers."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"To use this feature, swipe up from the bottom of the screen with two fingers.\n\nTo switch between features, swipe up with two fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"To use this feature, swipe up from the bottom of the screen with three fingers.\n\nTo switch between features, swipe up with three fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"To use an accessibility feature, swipe up from the bottom of the screen with two fingers.\n\nTo switch between features, swipe up with two fingers and hold."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold volume keys"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold volume keys"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Press and hold both volume keys"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Two-finger triple tap screen"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"two-finger triple tap screen"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Quickly tap screen {0,number,integer} times with two fingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triple-tap screen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triple-tap screen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Quickly tap screen {0,number,integer} times. This shortcut may slow down your device"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Use vibration and haptics"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Alarm vibration"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Media vibration"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Keyboard vibration"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Ring vibration"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Notification vibration"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Touch feedback"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"If you limit background activity for an app, it may misbehave"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Since this app is not set to optimise battery, you can’t restrict it.\n\nTo restrict the app, first turn on battery optimisation."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Manage battery usage"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Unrestricted"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimised"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restricted"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"text size, large print, large font, large text, low vision, make text bigger, font enlarger, font enlargement"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"always on ambient display, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, reader"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"keyboard, haptics, vibrate,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibration, Do Not Disturb"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Media volume"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Cast volume"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Allow access to manage all files"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Can access all files"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Full-screen notifications"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Allow full-screen notifications from this app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Allow this app to show notifications that take up the full screen when the device is locked. Apps may use these to highlight alarms, incoming calls or other urgent notifications."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Check app activity for phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Use scanning"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Use scanning for work apps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanning runs privately directly on your device, checking app activity for phishing or other deceptive behaviour. If it\'s detected, some app info is sent to Google Play Protect to confirm the threat and warn app users."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"This is a protected security feature. No device or personal info is shared with Google. \n\nPhishing is an attempt to steal sign-in credentials or other personal info."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index c7520dc..43185a0 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Disable Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Disables the Bluetooth LE audio feature if the device supports LE audio hardware capabilities."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Show LE Audio toggle in Device details"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bypass Bluetooth LE Audio allowlist"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Use LE Audio by default even if LE Audio peripheral hasn\'t been verified to meet allowlist criteria."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Media devices"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Call devices"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Other devices"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saved devices"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associated with account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Previously used with account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth will turn on to pair"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Connection preferences"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Previously connected"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Write in text fields"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignore all stylus button presses"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio sharing"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Share audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Calls and alarms"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Date and time"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Clear"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Private Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Hide apps in a private folder"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Unlock using screen lock"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Show Private Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Hide when locked"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Hide Private Space when locked"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"To stop other people knowing Private Space is on your device, you can hide it from your apps list"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Access Private Space when hidden"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Search for \'Private Space\' in the search bar"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tap the Private Space tile"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Unlock your Private Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"On"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Create Private Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Delete Private Space"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Private Space could not be created"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Private Space successfully deleted"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Private Space could not be deleted"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Set a screen lock"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"To use Private Space, set a screen lock on this device."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Set screen lock"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancel"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancel"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Set up"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Set up Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Hide private apps in a secure space that only you can access"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"How it works"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"You can access Private Space from the bottom of your apps list"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Private Space are protected by a lock"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifications from apps in Private Space are hidden when it’s locked"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space apps won’t appear in permission manager, privacy dashboard and other settings when Private Space is locked"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Setting up Private Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space is protected by a lock"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Usage info for Private Space apps is hidden when it’s locked"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Access Private Space from your apps list"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Couldn’t set up Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Try again now, or come back later"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Try again"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Use screen lock to unlock?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"You can unlock Private Space the same way you unlock your device, or choose a different lock"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Use screen lock"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Choose new lock"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"All set!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"To access Private Space, swipe up from the bottom of your home screen, then scroll down"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Done"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll down to access Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"You can add up to <xliff:g id="COUNT">%d</xliff:g> fingerprints"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"You’ve added the maximum number of fingerprints"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Can’t add more fingerprints"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continue using apps on fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatically raises the refresh rate from 60 to <xliff:g id="ID_1">%1$s</xliff:g> Hz for some content. Increases battery usage."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatically raises the refresh rate up to <xliff:g id="ID_1">%1$d</xliff:g> Hz for some content. Increases battery usage."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Force peak refresh rate"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Highest refresh rate for improved touch responsiveness and animation quality. Increases battery usage."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Screen attention"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Communal settings"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit access point"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Not set"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Not set"</string>
<string name="apn_name" msgid="6677695784108157953">"Name"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Use Accessibility button to open"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold volume keys to open"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triple-tap screen to open"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Two-finger triple tap screen to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Use gesture to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Use accessibility gesture"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"To use this feature, tap the accessibility button <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch and hold the accessibility button."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"To use this feature, tap the Accessibility button on your screen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"To use this feature, press and hold both volume keys."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"To start and stop magnification, triple-tap anywhere on your screen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"To start and stop magnification, triple tap anywhere on your screen with two fingers."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"To use this feature, swipe up from the bottom of the screen with two fingers.\n\nTo switch between features, swipe up with two fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"To use this feature, swipe up from the bottom of the screen with three fingers.\n\nTo switch between features, swipe up with three fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"To use an accessibility feature, swipe up from the bottom of the screen with two fingers.\n\nTo switch between features, swipe up with two fingers and hold."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold volume keys"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold volume keys"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Press and hold both volume keys"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Two-finger triple tap screen"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"two-finger triple tap screen"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Quickly tap screen {0,number,integer} times with two fingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triple-tap screen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triple-tap screen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Quickly tap screen {0,number,integer} times. This shortcut may slow down your device"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Use vibration and haptics"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Alarm vibration"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Media vibration"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Keyboard vibration"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Ring vibration"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Notification vibration"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Touch feedback"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"If you limit background activity for an app, it may misbehave"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Since this app is not set to optimise battery, you can’t restrict it.\n\nTo restrict the app, first turn on battery optimisation."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Manage battery usage"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Unrestricted"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimised"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restricted"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"text size, large print, large font, large text, low vision, make text bigger, font enlarger, font enlargement"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"always on ambient display, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, reader"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"keyboard, haptics, vibrate,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibration, Do Not Disturb"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Media volume"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Cast volume"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Allow access to manage all files"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Can access all files"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Full-screen notifications"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Allow full-screen notifications from this app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Allow this app to show notifications that take up the full screen when the device is locked. Apps may use these to highlight alarms, incoming calls or other urgent notifications."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Check app activity for phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Use scanning"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Use scanning for work apps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanning runs privately directly on your device, checking app activity for phishing or other deceptive behaviour. If it\'s detected, some app info is sent to Google Play Protect to confirm the threat and warn app users."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"This is a protected security feature. No device or personal info is shared with Google. \n\nPhishing is an attempt to steal sign-in credentials or other personal info."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index e3f1729..bf52509 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -120,6 +120,7 @@
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Other devices"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saved devices"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associated with account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Previously used with account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth will turn on to pair"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Connection preferences"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Previously connected"</string>
@@ -132,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Write in text fields"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignore all stylus button presses"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio sharing"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Share audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Calls and alarms"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Connect to a LE audio stream"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Nearby audio streams"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audio streams"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Connect to an audio stream using QR code"</string>
<string name="date_and_time" msgid="1788358029823431692">"Date & time"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Clear"</string>
@@ -535,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Private Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Hide apps in a private folder"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Unlock using screen lock"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Show Private Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Hide when locked"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Hide Private Space when locked"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"To stop other people knowing Private Space is on your device, you can hide it from your apps list"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Access Private Space when hidden"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Search for \'Private Space\' in the search bar"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tap the Private Space tile"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Unlock your Private Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"On"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Create Private Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Delete Private Space"</string>
@@ -544,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Private Space could not be created"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Private Space successfully deleted"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Private Space could not be deleted"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Set a screen lock"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"To use Private Space, set a screen lock on this device."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Set screen lock"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancel"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancel"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Set up"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Set up Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Hide private apps in a secure space that only you can access"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"How it works"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"You can access Private Space from the bottom of your apps list"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Private Space are protected by a lock"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifications from apps in Private Space are hidden when it’s locked"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space apps won’t appear in permission manager, privacy dashboard, and other settings when Private Space is locked"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Setting up Private Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space is protected by a lock"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Usage info for Private Space apps is hidden when it’s locked"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Access Private Space from your apps list"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Couldn’t set up Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Try again now, or come back later"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Try Again"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Use screen lock to unlock?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"You can unlock Private Space the same way you unlock your device, or choose a different lock"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Use screen lock"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Choose new lock"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"All set!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"To access Private Space, swipe up from the bottom of your home screen, then scroll down"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Done"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll down to access Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"You can add up to <xliff:g id="COUNT">%d</xliff:g> fingerprints"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"You’ve added the maximum number of fingerprints"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Can’t add more fingerprints"</string>
@@ -1061,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continue using apps on fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatically raises the refresh rate from 60 to <xliff:g id="ID_1">%1$s</xliff:g> Hz for some content. Increases battery usage."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatically raises the refresh rate up to <xliff:g id="ID_1">%1$d</xliff:g> Hz for some content. Increases battery usage."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Force peak refresh rate"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Highest refresh rate for improved touch responsiveness & animation quality. Increases battery usage."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Screen attention"</string>
@@ -1297,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Communal settings"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit access point"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Add access point"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Not set"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Not set"</string>
<string name="apn_name" msgid="6677695784108157953">"Name"</string>
@@ -1931,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Use accessibility button to open"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold volume keys to open"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triple tap screen to open"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Two finger triple tap screen to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Use gesture to open"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Use accessibility gesture"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"To use this feature, tap the accessibility button <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch & hold the accessibility button."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"To use this feature, tap the accessibility button on your screen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"To use this feature, press & hold both volume keys."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"To start and stop magnification, triple-tap anywhere on your screen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"To start and stop magnification, triple-tap anywhere on your screen with two fingers."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"To use this feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"To use this feature, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"To use an accessibility feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold."</string>
@@ -1958,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold volume keys"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold volume keys"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Press & hold both volume keys"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Two-finger triple-tap screen"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"two-finger triple-tap screen"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Quickly tap screen {0,number,integer} times with two fingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triple-tap screen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triple-tap screen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Quickly tap screen {0,number,integer} times. This shortcut may slow down your device"</string>
@@ -2255,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"If you limit background activity for an app, it may misbehave"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Since this app is not set to optimize battery, you can’t restrict it.\n\nTo restrict the app, first turn on battery optimization."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Manage battery usage"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Allow background usage"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Enable for real-time updates, disable to save battery"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Unrestricted"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimized"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restricted"</string>
@@ -3765,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Allow access to manage all files"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Can access all files"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Full screen notifications"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Allow full screen notifications from this app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Allow this app to show notifications that take up the full screen when the device is locked. Apps may use these to highlight alarms, incoming calls, or other urgent notifications."</string>
@@ -4880,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Check app activity for phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Use scanning"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Use scanning for work apps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanning runs privately right on your device, checking app activity for phishing or other deceptive behavior. If its detected, some app info is sent to Google Play Protect to confirm the threat and warn app users."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"This is a protected security feature. No device or personal info is shared with Google. \n\nPhishing is an attempt to steal sign-in credentials or other personal info."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index ddaaffa..a290e21 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Inhabilitar Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Inhabilita la función Bluetooth LE Audio si el dispositivo admite funciones de hardware de ese tipo."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Botón de LE Audio en Detalles del disp."</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omitir lista de entidades permitidas de Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Usa LE Audio de forma predeterminada incluso si no se verificó si el dispositivo periférico de LE Audio cumple con los criterios de lista de entidades permitidas."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivos de medios"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivos para llamar"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Otros dispositivos"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivos guardados"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Asociado con la cuenta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Se usó previamente con la cuenta"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Se activará el Bluetooth para vincular"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferencias de conexión"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Conectados anteriormente"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escribir en campos de texto"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorar todas las pulsaciones del botón de la pluma stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Pluma stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Uso compartido de audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Comparte audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Llamadas y alarmas"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Conectarse a reproducción de LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Reproducciones de audio cercanas"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Reproducciones de audio"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Conectarse a una reproducción de audio usando un código QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Fecha y hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Eliminar"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espacio privado"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Esconde las apps en una carpeta privada"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloquea con el bloqueo de pantalla"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Muestra un Espacio privado"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Se oculta con el dispositivo bloqueado"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Oculta Espacio privado con el dispositivo bloqueado"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Oculta Espacio privado de tu lista para que no puedan verlo"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Accede a Espacio privado cuando está oculto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Busca \"Espacio privado\" en la barra de búsqueda"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Presiona la tarjeta de Espacio privado"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloquea tu Espacio privado"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desactivado"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Activado"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Crea un Espacio privado"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Borra un Espacio privado"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"No se pudo crear el Espacio privado"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"El Espacio privado se borró correctamente"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"No se pudo borrar el Espacio privado"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Configura un bloqueo de pant."</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para usar Espacio privado, configura un bloqueo de pantalla."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Configurar bloqueo de pantalla"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancelar"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancelar"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configuración"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configura Espacio privado"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Esconde las apps privadas en un espacio seguro que solo tú puedes acceder"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Cómo funciona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Puedes acceder a Espacio privado desde el final de tu lista de apps"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Las apps en Espacio privado están protegidas con un bloqueo"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Las notificaciones de las apps en Espacio privado se ocultan cuando está bloqueado"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Las apps de Espacio privado no se mostrarán en el Administrador de permisos, el panel de privacidad ni en ninguna otra configuración cuando Espacio privado esté bloqueado"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configurando Espacio privado…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Espacio privado está protegido por un bloqueo"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Espacio privado no muestra la información de uso de las apps cuando está bloqueado"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accede a Espacio privado desde la lista de apps"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"No se pudo configurar Espacio privado"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Vuelve a intentarlo ahora o regresa más tarde"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Reintentar"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"¿Usar bloqueo de pantalla para desbloquear?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Puedes desbloquear Espacio privado de la misma manera que desbloqueas el dispositivo o elegir un bloqueo diferente"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usar bloqueo de pantalla"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Elegir nuevo bloqueo"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Todo listo"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para acceder a Espacio privado, desliza el dedo hacia arriba desde la parte inferior de la pantalla principal y, luego, desplázate hacia abajo"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Listo"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Desplázate hacia abajo para acceder a Espacio privado"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Puedes agregar hasta <xliff:g id="COUNT">%d</xliff:g> huellas dactilares"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Agregaste la cantidad máxima permitida de huellas digitales"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"No se pueden agregar más huellas digitales"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuar usando apps con el dispositivo plegado"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Aumenta automáticamente la frecuencia de actualización de 60 Hz a <xliff:g id="ID_1">%1$s</xliff:g> Hz para cierto contenido. Incrementa el uso de batería."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Aumenta automáticamente la frecuencia de actualización a <xliff:g id="ID_1">%1$d</xliff:g> Hz para cierto contenido. Incrementa el uso de batería."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forzar frecuencia de actualización máxima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"La máxima frecuencia de actualización mejora la respuesta táctil y la calidad de las animaciones. Incrementa el uso de batería."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atención a la pantalla"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Configuraciones compartidas"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editar punto de acceso"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Agregar punto de acceso"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Sin establecer"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Sin definir"</string>
<string name="apn_name" msgid="6677695784108157953">"Nombre"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Usa el botón de accesibilidad para abrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mantén presionadas las teclas de volumen para abrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Presiona tres veces para abrir el servicio"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Presiona tres veces la pantalla con dos dedos para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Usa el gesto para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usa los gestos de accesibilidad"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Para usar esta función, presiona el botón de accesibilidad <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ubicado en la parte inferior de la pantalla.\n\nSi quieres cambiar de función, mantén presionado el botón de accesibilidad."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para usar esta función, presiona el botón de accesibilidad en la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Para usar esta función, mantén presionadas las teclas de volumen."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para iniciar y detener la ampliación, presiona tres veces en cualquier parte de la pantalla."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para iniciar y detener la amplificación, presiona tres veces la pantalla con dos dedos."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Para usar esta función, desliza 2 dedos hacia arriba desde la parte inferior de la pantalla.\n\nSi quieres cambiar de función, desliza 2 dedos hacia arriba y mantén presionada la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Para usar esta función, desliza 3 dedos hacia arriba desde la parte inferior de la pantalla.\n\nSi quieres cambiar de función, desliza 3 dedos hacia arriba y mantén presionada la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Para usar una función de accesibilidad, desliza 2 dedos hacia arriba desde la parte inferior de la pantalla.\n\nSi quieres cambiar de función, desliza 2 dedos hacia arriba y mantén presionada la pantalla."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Mantener presionadas las teclas de volumen"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"mantener presionadas las teclas de volumen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Mantén presionadas ambas teclas de volumen."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Presiona la pantalla tres veces con dos dedos"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"presiona la pantalla tres veces con dos dedos"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Presiona la pantalla rápidamente {0,number,integer} veces con dos dedos"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Presionar tres veces la pantalla"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"presionar tres veces la pantalla"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Presiona rápidamente la pantalla {0,number,integer} veces. Esta combinación de teclas podría hacer que tu dispositivo funcione más lento."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Usar vibración y tecnología táctil"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibración de alarmas"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibración de contenido multimedia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibración del teclado"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibración del tono"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibración de las notificaciones"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Respuesta táctil"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Si limitas la actividad en segundo plano de una app, es posible que no funcione correctamente"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Como no se configuró la app para optimizar la batería, no puedes restringirla.\n\nPrimero, activa optimización de batería."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Administrar uso de batería"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Permitir uso en segundo plano"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Habilitar para actualizaciones en tiempo real; inhabilitar para ahorrar batería"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sin restricciones"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizado"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restringido"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tamaño del texto, letra grande, fuente grande, texto grande, visión reducida, agrandar el texto, agrandar la fuente, agrandamiento de la fuente"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"pantalla ambiente siempre encendida, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiqueta, lector"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclado, tecnología táctil, vibración,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volumen, vibración, No interrumpir"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volumen multimedia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volumen de transmisión"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Permitir administrar todos los archivos"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permite que esta app lea, modifique y borre todos los archivos en el dispositivo o cualquier volumen de almacenamiento conectado. Si habilitas el permiso, es posible que la app acceda a archivos sin tu conocimiento explícito."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Pueden acceder a todos los archivos"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificaciones de pantalla completa"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permitir notificaciones de pantalla completa de esta app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permite que esta app muestre notificaciones que ocupan toda la pantalla cuando el dispositivo está bloqueado. Las apps pueden usarlas para destacar alarmas, llamadas entrantes y otras notificaciones urgentes."</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"El nombre de tu dispositivo es visible para las apps instaladas. Es posible que también lo vean otras personas cuando te conectes a dispositivos Bluetooth o a una red Wi-Fi, o cuando configures un hotspot de Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Género gramatical"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Selecciona un género gramatical"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Análisis de apps engañosas"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Revisar la actividad en la app en busca de phishing"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usar análisis"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usar análisis para apps de trabajo"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index eda919b..b01215b 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Inhabilitar Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Inhabilita la función Bluetooth LE Audio si el dispositivo es compatible con las capacidades de hardware de LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Botón LE Audio en Detalles del dispositivo"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Ignorar lista de permitidos de Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Usa LE Audio de forma predeterminada aunque no se haya verificado que el periférico LE Audio cumpla los criterios de la lista de permitidos."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivos multimedia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivos de llamada"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Otros dispositivos"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivos guardados"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Asociado a la cuenta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Se ha usado previamente en una cuenta"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"El Bluetooth se activará para emparejar"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferencias de conexión"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Conectado anteriormente"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escribir en campos de texto"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorar todas las pulsaciones del botón del lápiz óptico"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Lápiz óptico"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Uso compartido de audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Compartir audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Llamadas y alarmas"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Fecha y hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Borrar"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espacio privado"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Oculta aplicaciones en una carpeta privada"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloquear con el bloqueo de pantalla"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostrar espacio privado"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ocultar cuando esté bloqueado"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ocultar espacio privado si está bloqueado"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Para evitar que se sepa que usas espacio privado, puedes ocultarlo desde tu lista de aplicaciones"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Acceder al espacio privado cuando está oculto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Busca espacio privado en la barra de búsqueda"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Toca el recuadro de espacio privado"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloquea tu espacio privado"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desactivado"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Activado"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Crear espacio privado"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Eliminar espacio privado"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"El espacio privado no se ha podido crear"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Espacio privado eliminado correctamente"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"El espacio privado no se ha podido eliminar"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Define un bloqueo de pantalla"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para usar el espacio privado, define un bloqueo de pantalla."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Define un bloqueo de pantalla"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancelar"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancelar"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configurar"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurar espacio privado"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Oculta las aplicaciones privadas en un espacio seguro al que solo tú tengas acceso"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Cómo funciona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Puedes acceder al espacio privado desde la parte inferior de tu lista de aplicaciones"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Las aplicaciones del espacio privado están protegidas con un bloqueo"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Las notificaciones de las aplicaciones del espacio privado se ocultan si está bloqueado"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Las aplicaciones del espacio privado no se mostrarán en Gestor de permisos, el panel de privacidad o en otros ajustes si el espacio privado está bloqueado"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configurando espacio privado…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"El espacio privado está protegido con un bloqueo"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"La información de uso de las aplicaciones del espacio privado se oculta cuando está bloqueado"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Acceder al espacio privado desde la lista de aplicaciones"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"No se ha podido configurar el espacio privado"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Inténtalo de nuevo ahora o vuelve más tarde"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Reintentar"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"¿Usar bloqueo de pantalla para desbloquear?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Puedes desbloquear el espacio privado de la misma forma que desbloqueas tu dispositivo, o bien con un bloqueo diferente"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usar bloqueo de pantalla"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Elegir nuevo aspecto"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"¡Todo listo!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para acceder al espacio privado, desliza hacia arriba desde la parte inferior de la pantalla de inicio y, a continuación, desliza hacia abajo"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Hecho"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Desplázate hacia abajo para acceder al espacio privado"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Puedes añadir hasta <xliff:g id="COUNT">%d</xliff:g> huellas digitales"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Has añadido el número máximo de huellas digitales"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"No se pueden añadir más huellas digitales"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Seguir usando aplicaciones con el dispositivo plegado"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Pantalla fluida"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Incrementa automáticamente la frecuencia de actualización de 60 a <xliff:g id="ID_1">%1$s</xliff:g> Hz en determinados tipos de contenido. Aumenta el uso de batería."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Incrementa automáticamente la frecuencia de actualización a <xliff:g id="ID_1">%1$d</xliff:g> Hz en determinados tipos de contenido. Aumenta el uso de la batería."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forzar tasa de refresco máxima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Se usa la tasa de refresco más alta posible para mejorar la capacidad de respuesta táctil y la calidad de las animaciones. Aumenta el uso de la batería."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Pantalla atenta"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Ajustes comunes"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editar punto de acceso"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Sin establecer"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Sin configurar"</string>
<string name="apn_name" msgid="6677695784108157953">"Nombre"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Usa el botón de accesibilidad para abrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mantén pulsadas las teclas de volumen para abrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Toca tres veces la pantalla para abrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Toca tres veces la pantalla para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Usar gesto para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usar gesto de accesibilidad"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Para usar esta función, toca el botón de accesibilidad <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>, situado en la parte inferior de la pantalla.\n\nPara pasar de una función a otra, mantén pulsado el botón de accesibilidad."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para usar esta función, toca el botón de accesibilidad de la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Para usar esta función, mantén pulsadas las dos teclas de volumen."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para iniciar o detener la ampliación, toca tres veces en cualquier parte de la pantalla."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para iniciar o detener la ampliación, toca 3 veces en cualquier parte de la pantalla con dos dedos."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Para usar esta función, desliza hacia arriba con dos dedos desde la parte inferior de la pantalla.\n\nPara pasar de una función a otra, desliza hacia arriba con dos dedos y mantén pulsada la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Para usar esta función, desliza hacia arriba con tres dedos desde la parte inferior de la pantalla.\n\nPara pasar de una función a otra, desliza hacia arriba con tres dedos y mantén pulsada la pantalla."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Para usar una función de accesibilidad, desliza hacia arriba con dos dedos desde la parte inferior de la pantalla.\n\nPara pasar de una función a otra, desliza hacia arriba con dos dedos y mantén pulsada la pantalla."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Mantener teclas de volumen"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"mantener pulsadas las teclas de volumen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Mantén pulsadas las dos teclas de volumen"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Toca tres veces la pantalla con dos dedos"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"tocar tres veces la pantalla con dos dedos"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Toca la pantalla {0,number,integer} veces rápidamente con dos dedos"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triple toque en la pantalla"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tocar tres veces la pantalla"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Toca la pantalla {0,number,integer} veces rápidamente. Esta acción puede hacer que tu dispositivo funcione más lento."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Usar vibración y vibración al pulsar"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibración de alarmas"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibración de contenido multimedia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibración del teclado"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibración del tono"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibración de las notificaciones"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Respuesta táctil"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Si limitas la actividad en segundo plano de una aplicación, puede que no funcione correctamente"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Esta aplicación no optimiza la batería, por lo que no puedes restringirla.\n\nPara hacerlo, activa antes la optimización."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gestionar el uso de batería"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sin restricciones"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizado"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restringido"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tamaño del texto, letras grandes, fuente grande, texto grande, baja visión, hacer el texto más grande, agrandar texto, ampliar texto, ampliador de fuente, ampliación de la fuente"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"pantalla ambiente siempre encendida, pantalla siempre activa"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiqueta, lector"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclado, tecnología de vibración al pulsar, vibrar,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volumen, vibración, No molestar"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volumen de multimedia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volumen de envío"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Dar acceso para gestionar todos los archivos"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permite que esta aplicación lea, modifique y elimine todos los archivos de este dispositivo o de cualquier volumen de almacenamiento conectado. Si le das permiso, podrá acceder a archivos sin avisarte expresamente."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Puede acceder a todos los archivos"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificaciones a pantalla completa"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permitir notificaciones a pantalla completa de esta aplicación"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permite que esta aplicación muestre notificaciones que ocupan toda la pantalla cuando el dispositivo está bloqueado. La aplicación puede usar esta opción para resaltar alarmas, llamadas entrantes u otras notificaciones urgentes."</string>
@@ -4813,7 +4874,7 @@
<string name="aspect_ratio_main_summary_text" msgid="5544816872094235840">"Prueba una nueva relación de aspecto para ver una aplicación si no se ha diseñado para adaptarse a tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Puede que algunas aplicaciones no estén optimizadas para determinadas relaciones de aspecto."</string>
<string name="user_aspect_ratio_suggested_apps_label" msgid="8085934042329632039">"Aplicaciones sugeridas"</string>
<string name="user_aspect_ratio_changed_apps_label" msgid="2096614916172567672">"Aplicaciones cambiadas"</string>
- <string name="user_aspect_ratio_app_default" msgid="270065763307617837">"Predeterminado de la aplicación"</string>
+ <string name="user_aspect_ratio_app_default" msgid="270065763307617837">"Predeterminada de la aplicación"</string>
<string name="user_aspect_ratio_fullscreen" msgid="1843427242540081996">"Pantalla completa"</string>
<string name="user_aspect_ratio_half_screen" msgid="1015852057094310209">"Media pantalla"</string>
<string name="user_aspect_ratio_device_size" msgid="2339820985120881199">"Relación de aspecto del dispositivo"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Las aplicaciones que hayas instalado pueden ver el nombre de tu dispositivo. También es posible que lo vean otros usuarios si lo conectas con dispositivos Bluetooth, si te conectas a una red Wi-Fi o si configuras un punto de acceso Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Género gramatical"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Selecciona el género gramatical"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Buscando aplicaciones engañosas"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Comprobar la actividad de las aplicaciones en busca de phishing"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usar análisis"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usar análisis en aplicaciones de trabajo"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index ea49eab..d587459 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Keela Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Keelab funktsiooni Bluetooth LE Audio, kui seade toetab LE Audio riistvara võimalusi."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Kuva seadme üksikasjades LE Audio lüliti"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio lubamisloendist möödaminek"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audiot kasutatakse vaikimisi isegi siis, kui LE Audio välisseadme vastavust lubamisloendi kriteeriumitele pole kinnitatud."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Meediaseadmed"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Helistamisseadmed"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Muud seadmed"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Salvestatud seadmed"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Kontoga seotud"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Varem kontoga kasutatud"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth lülitatakse sidumiseks sisse"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Ühenduse eelistused"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Eelnevalt ühendatud"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Kirjutamine tekstiväljadele"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Elektronpliiatsi kõigi nupuvajutuste eiramine"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Elektronpliiats"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Heli jagamine"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Heli jagamine"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Kõned ja äratused"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Kuupäev ja kellaaeg"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Puhverserver"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Kustuta"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privaatne ruum"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Peida privaatses kaustas olevad rakendused"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Avamine ekraaniluku abil"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Privaatse ruumi kuvamine"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Peida lukustatuna"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Privaatse ruumi peitmine, kui see on lukustatud"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Privaatse ruumi saate oma rakenduste loendis peita, et teised ei teaks selle olemasolust teie seadmes"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Juurdepääs privaatsele ruumile, kui see on peidetud"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Sisestage otsinguribale tekst „Privaatne ruum”"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Puudutage privaatse ruumi paani"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Avage oma privaatne ruum"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Väljas"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Sees"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Süsteem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Privaatse ruumi loomine"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Privaatse ruumi kustutamine"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Privaatset ruumi ei saanud luua"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privaatse ruumi kustutamine õnnestus"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Privaatset ruumi ei saanud kustutada"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ekraaniluku seadistamine"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Seadistage privaatse ruumi jaoks seadmele ekraanilukk."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Seadistage ekraanilukk"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Tühista"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Tühista"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Seadistamine"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Privaatse ruumi seadistamine"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Privaatsete rakenduste peitmine turvalises ruumis, millele pääsete juurde ainult teie"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Tööpõhimõtted"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Privaatsele ruumile pääsete juurde oma rakenduste loendi allosas"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Privaatse ruumi rakendused on lukuga kaitstud"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Kui privaatne ruum on lukustatud, siis on privaatse ruumi rakenduste märguanded peidetud"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Kui privaatne ruum on lukustatud, ei kuvata privaatse ruumi rakendusi lubade halduris, privaatsuse juhtpaneelil ega muudes seadetes"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Privaatse ruumi seadistamine…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privaatne ruum on lukuga kaitstud"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Kui privaatne ruum on lukustatud, siis on privaatse ruumi rakenduste kasutusteave peidetud"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Juurdepääs privaatsele ruumile rakenduste loendist"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Privaatset ruumi ei saanud seadistada"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Proovige kohe uuesti või tulge hiljem tagasi"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Proovi uuesti"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Kas kasutada lukust avamiseks ekraanilukku?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Privaatse ruumi saate lukust avada samal moel seadme lukust avamisega või valida erineva luku"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Kasuta ekraanilukku"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Uue luku valimine"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Valmis!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Juurdepääsuks privaatsele ruumile pühkige avakuva allosast üles ja seejärel kerige alla"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Valmis"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Juurdepääsuks privaatsele ruumile kerige alla"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Saate lisada kuni <xliff:g id="COUNT">%d</xliff:g> sõrmejälge"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Olete lisanud maksimaalse arvu sõrmejälgi"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Rohkem sõrmejälgi ei saa lisada"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Jätka rakenduste kasutamist voldituna"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Suurendab teatud sisu puhul värskendussagedust 60 hertsilt <xliff:g id="ID_1">%1$s</xliff:g> hertsini. Akukasutus suureneb."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Suurendab teatud sisu puhul värskendamissagedust automaatselt kuni <xliff:g id="ID_1">%1$d</xliff:g> hertsini. Akukasutus suureneb."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Jõusta kõrgeim värskendamissagedus"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Kõrgeim värskendamissagedus täiustab puutetundlikkust ja pakub sujuvamaid animatsioone. Akukasutus suureneb."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Ekraanivaatamise tuvastus"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Ühised seaded"</string>
<string name="apn_settings" msgid="4295467389400441299">"Pääsupunktid (APN-id)"</string>
<string name="apn_edit" msgid="2003683641840248741">"Pääsupunkti muutmine"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Määramata"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Määramata"</string>
<string name="apn_name" msgid="6677695784108157953">"Nimi"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Avamiseks juurdepääsetavuse nupu kasutamine"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Avamiseks hoidke helitugevuse klahve all"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Avamiseks puudutage ekraani kolm korda"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Avamiseks ekraani kahe sõrmega kolmekordne puudutamine"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Kasutage avamiseks liigutust"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Juurdepääsuliigutuse kasutamine"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Selle funktsiooni kasutamiseks puudutage ekraanikuva allosas juurdepääsetavuse nuppu <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nFunktsioonide vahel vahetamiseks puudutage juurdepääsetavuse nuppu pikalt."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Selle funktsiooni kasutamiseks puudutage ekraanikuval juurdepääsetavuse nuppu."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Selle funktsiooni kasutamiseks vajutage pikalt mõlemat helitugevuse klahvi."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Suurenduse käivitamiseks ja peatamiseks puudutage ekraani kolm korda."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Suurenduse käivitamiseks ja peatamiseks puudutage ekraani kahe sõrmega kolm korda."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Selle funktsiooni kasutamiseks pühkige ekraanikuva allosast kahe sõrmega üles.\n\nFunktsioonide vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke sõrmi ekraanil."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Selle funktsiooni kasutamiseks pühkige ekraanikuva allosast kolme sõrmega üles.\n\nFunktsioonide vahel vahetamiseks pühkige kolme sõrmega üles ja hoidke sõrmi ekraanil."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Juurdepääsufunktsiooni kasutamiseks pühkige ekraanikuva allosast kahe sõrmega üles.\n\nFunktsioonide vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke sõrmi ekraanil."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Helitugevuse klahvide allhoidmine"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"helitugevuse klahvide allhoidmine"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Hoidke all mõlemat helitugevuse klahvi"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Ekraani kahe sõrmega kolmekordne puudutamine"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ekraani kahe sõrmega kolmekordne puudutamine"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Puudutage kahe sõrmega hetkeks ekraani {0,number,integer} korda"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ekraani kolmikpuudutamine"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ekraani kolmikpuudutamine"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Puudutage ekraani kiiresti {0,number,integer} korda. See otsetee võib teie seadme tööd aeglustada."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Vibreerimise ja värintagasiside kasutamine"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Äratuse vibreerimine"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Meedia vibreerimine"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Klaviatuuri vibreerimine"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Helin koos vibreerimisega"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Märguanne koos vibreerimisega"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Puudutuste tagasiside"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Kui piirate rakenduse tegevust taustal, võib rakendus toimida valesti."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Kuna rak. pole aku optimeerimine seadistatud, ei saa te seda piirata.\n\nRak. piiramiseks lülit. esmalt sisse aku optimeerimine."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Akukasutuse haldamine"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Piiranguteta"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimeeritud"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Piiratud"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"teksti suurus, suur tekst, suur font, halb nähtavus, teksti suuremaks muutmine, fondi suurendaja, fondi suurendamine"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"alati sisse lülitatud taustakuva, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, kiip, lugeja"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klaviatuur, värintagasiside, vibreerimine,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Helitugevus, vibreerimine, režiim Mitte segada"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Meedia helitugevus"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Ülekantava sisu helitugevus"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Luba juurdepääs kõikide failide haldamisele"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Sellel rakendusel lubatakse lugeda, muuta ja kustutada kõiki selles seadmes ning ühendatud andmekandjatel olevaid faile. Loa andmisel võib rakendus failidele juurde pääseda ilma teie teadmata."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Pääseb failidele juurde"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Kogu ekraani katvad märguanded"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Luba selle rakenduse kogu ekraani katvad märguanded"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Lubage sellel rakendusel kuvada kogu ekraani katvaid märguandeid, kui seade on lukustatud. Rakendused võivad selle abil tõsta esile alarme, sissetulevaid kõnesid või muid pakilisi märguandeid."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Teie seadme nimi on teie installitud rakendustele nähtav. Bluetooth-seadmetega või WiFi-võrguga ühenduse loomisel või WiFi-kuumkoha seadistamisel võivad seda näha ka teised inimesed."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Grammatiline sugu"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Grammatilise soo valimine"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Petturlike rakenduste skannimine"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Rakenduse tegevuste kontrollimine andmepüügi suhtes"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Skannimise kasutamine"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Töörakenduste puhul skannimise kasutamine"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index ae25720..359f96d 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -112,16 +112,15 @@
<string name="bluetooth_disable_hw_offload_dialog_cancel" msgid="3663690305043973720">"Utzi"</string>
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Desgaitu Kontsumo txikiko Bluetooth bidezko audioa"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Kontsumo txikiko Bluetooth bidezko audioa darabilten hardware-gaitasunak gailuarekin bateragarriak badira, Kontsumo txikiko Bluetooth bidezko audioa eginbidea desgaitzen du."</string>
- <string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Erakutsi kontsumo txikiko Bluetooth bidezko audioaren etengailua gailuaren xehetasunetan"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Erakutsi kontsumo txikiko audioaren etengailua gailuaren xehetasunetan"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Ez aplikatu kontsumo txikiko Bluetooth bidezko audioaren baimendutakoen zerrenda"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Erabili kontsumo txikiko audioa modu lehenetsian, hura darabilen gailu periferikoak baimendutakoen zerrendako irizpideak betetzen dituen egiaztatu ez bada ere."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Multimedia-gailuak"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Deiak jaso eta egiteko gailuak"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Beste gailu batzuk"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Gordetako gailuak"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Kontuarekin erlazionatuta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Aurretik erabili da kontuarekin"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth bidezko konexioa aktibatuko da parekatu ahal izateko"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Konexio-hobespenak"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Aurretik konektatutakoak"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Idatzi testu-eremuetan"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Egin ez ikusi arkatzarekin sakatzen diren botoi guztiei"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Arkatza"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audioa partekatzea"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Partekatu audioa"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Deiak eta alarmak"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Konektatu kontsumo txikiko zuzeneko audio-igorpen batera"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Inguruko zuzeneko audio-igorpenak"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Zuzeneko audio-igorpenak"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Konektatu zuzeneko audio-igorpen batera QR kodea erabilita"</string>
<string name="date_and_time" msgid="1788358029823431692">"Data eta ordua"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxya"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Garbitu"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Eremu pribatua"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ezkutatu aplikazioak karpeta pribatu batean"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desblokeatu pantailaren blokeoaren bidez"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Erakutsi eremu pribatua"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ezkutatu blokeatuta dagoenean"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ezkutatu Eremu pribatua blokeatuta dagoenean"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Inork jakin ez dezan gailuan Eremu pribatua daukazula, aplikazio-zerrendatik ezkuta dezakezu"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Atzitu Eremu pribatua ezkutatuta dagoenean ere"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Bilatu \"Eremu pribatua\" bilaketa-barran"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Sakatu eremu pribatuaren lauza"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desblokeatu Eremu pribatua"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desaktibatuta"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Aktibatuta"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Sortu eremu pribatua"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Ezabatu eremu pribatua"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Ezin izan da sortu eremu pribatua"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Ezabatu da eremu pribatua"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Ezin izan da ezabatu eremu pribatua"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ezarri pantailaren blokeoa"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Eremu pribatua erabiltzeko, ezarri pantaila blokeatzeko aukera bat gailuan."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ezarri pantailaren blokeoa"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Utzi"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Utzi"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Konfiguratu"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Konfiguratu Eremu pribatua"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Ezkutatu aplikazio pribatuak eremu seguru batean, zuk soilik atzitu ahal izateko"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Nola funtzionatzen du?"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Eremu pribatua aplikazio-zerrendaren behealdetik atzi dezakezu"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Eremu pribatuko aplikazioak blokeo bidez babesten dira"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Eremu pribatua blokeatuta badago, hango aplikazioen jakinarazpenak ezkutatzen dira"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Eremu pribatua blokeatuta badago, hango aplikazioak ez dira agertuko baimenen kudeatzailean, pribatutasun-panelean eta beste ezarpenetan"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Eremu pribatua konfiguratzen…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Eremu pribatua blokeo bidez babestuta dago"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Eremu pribatuko aplikazioei buruzko erabilera-informazioa ezkutatuta dago eremu pribatua blokeatuta dagoenean"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Atzitu eremu pribatua aplikazioen zerrendatik"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Ezin izan da konfiguratu eremu pribatua"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Saiatu berriro edo itzuli geroago"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Saiatu berriro"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Pantailaren blokeoa erabili desblokeatzeko?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Gailua desblokeatzeko darabilzun modu berarekin desblokea dezakezu eremu pribatua. Bestela, aukeratu beste blokeo bat."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Erabili pantailaren blokeoa"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Aukeratu beste blokeo bat"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Dena prest!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Eremu pribatua atzitzeko, pasatu hatza hasierako pantailaren behealdetik gora eta egin behera"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Eginda"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Egin behera eremu pribatua atzitzeko"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"<xliff:g id="COUNT">%d</xliff:g> hartz-marka gehi ditzakezu gehienez"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Iritsi zara onartzen den gehieneko hatz-marka kopurura"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Ezin duzu gehitu beste hatz-markarik"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Jarraitu aplikazioak erabiltzen gailua tolestuta egon bitartean"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatikoki igotzen du freskatze-abiadura 60 Hz-tik <xliff:g id="ID_1">%1$s</xliff:g> Hz-ra zenbait edukitarako. Bateria gehiago erabiltzen du."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Zenbait edukiren freskatze-abiadura <xliff:g id="ID_1">%1$d</xliff:g> Hz-eraino igotzen du automatikoki. Bateria gehiago erabiltzen du."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Erabili gehieneko freskatze-abiadura"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Freskatze-abiadura handiena, ukipenei erantzuteko gaitasuna eta animazioen kalitatea hobetzeko. Bateria gehiago erabiltzen du."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Pantaila kontzientea"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Ezarpen komunak"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNak"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editatu sarbide-puntua"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Gehitu sarbide-puntu bat"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Ezarri gabe"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ez da ezarri"</string>
<string name="apn_name" msgid="6677695784108157953">"Izena"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Erabili Erabilerraztasuna botoia irekitzeko"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Irekitzeko, eduki sakatuta bolumen-botoiak"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Irekitzeko, sakatu pantaila hiru aldiz"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Irekitzeko, sakatu pantaila 3 aldiz 2 hatzekin"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Erabili keinua irekitzeko"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Erabili erabilerraztasun-keinua"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Eginbide hau erabiltzeko, sakatu pantailaren behealdeko <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> Erabilerraztasuna botoia.\n\nEginbide batetik bestera aldatzeko, eduki sakatuta Erabilerraztasuna botoia."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Eginbide hau erabiltzeko, sakatu pantailako Erabilerraztasuna botoia."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Eginbide hau erabiltzeko, eduki sakatuta bi bolumen-botoiak."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Luparen eginbidea abiarazteko eta gelditzeko, sakatu hiru aldiz pantailako edozein puntu."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Luparen eginbidea abiarazteko eta gelditzeko, sakatu 3 aldiz pantailako edozein puntu 2 hatzekin."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Eginbide hau erabiltzeko, pasatu bi hatz pantailaren behealdetik gorantz.\n\nEginbide batetik bestera aldatzeko, pasatu bi hatz gorantz eta eduki pantaila sakatuta."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Eginbide hau erabiltzeko, pasatu hiru hatz pantailaren behealdetik gorantz.\n\nEginbide batetik bestera aldatzeko, pasatu hiru hatz gorantz eta eduki pantaila sakatuta."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Erabilerraztasun-eginbide bat erabiltzeko, pasatu bi hatz pantailaren behealdetik gorantz.\n\nEginbide batetik bestera aldatzeko, pasatu bi hatz gorantz eta eduki pantaila sakatuta."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Eduki sakatuta bolumen-botoiak"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"eduki sakatuta bolumen-botoiak"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Eduki sakatuta bolumen-botoiak"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Sakatu pantaila 3 aldiz 2 hatzekin"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"sakatu pantaila 3 aldiz 2 hatzekin"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Sakatu bizkor pantaila {0,number,integer} aldiz 2 hatzekin"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Sakatu pantaila hiru aldiz"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"sakatu pantaila hiru aldiz"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Sakatu pantaila bizkor {0,number,integer} aldiz. Baliteke lasterbide honek gailua moteltzea."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Erabili dardara eta teknologia haptikoa"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Alarmen dardara"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Multimedia-edukiaren dardara"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Teklatuaren dardara"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Tonuaren dardara"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Jakinarazpenen dardara"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Ukipen bidezko interakzioa"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Aplikazio baten atzeko planoko jarduerak mugatzen badituzu, baliteke aplikazioak behar bezala ez funtzionatzea"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Aplikazio hau bateria optimizatzeko konfiguratuta ez dagoenez, ezin duzu mugatu.\n\nMugatzeko, aktibatu bateriaren optimizazioa."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Kudeatu bateria-erabilera"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Eman atzeko planoan erabiltzeko baimena"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Gaitu denbora errealeko berritasunak jasotzeko eta desgaitu bateria aurrezteko"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Mugagabea"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizatua"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Mugatua"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"testuaren tamaina, letra-tipo handia, letra handia, testu handia, ikusmen txarra, handitu testua, testua handitzea, letra handitzea, letra handiagoa"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"girotzeko irudia beti aktibatuta, pantaila etengabe piztuta mantentzeko eginbidea"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc-a, etiketa, irakurgailua"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teklatua, teknologia haptikoa, dardara"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Bolumena, dardara, ez molestatzeko modua"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Multimedia-edukiaren bolumena"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Igorpenaren bolumena"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Eman fitxategi guztiak kudeatzeko baimena"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Eman gailuko edo konektatutako biltegiratze-unitateetako fitxategiak irakurtzeko, aldatzeko eta ezabatzeko baimena aplikazioari. Baimena emanez gero, baliteke aplikazioak fitxategiak atzitzea zuk jakin ez arren."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Fitxategi guztiak atzi ditzake"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Pantaila osoko jakinarazpenak"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Eman pantaila osoko jakinarazpenak erakusteko baimena aplikazioari"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Eman gailua blokeatuta dagoenean pantaila osoa hartzen duten jakinarazpenak erakusteko baimena aplikazioari. Alarmen, sarrerako deien edo bestelako premiazko jakinarazpenen berri emateko erabil dezakete aplikazioek."</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Instalatu dituzun aplikazioek gailuaren izena ikus dezakete. Baliteke jendeak ere ikustea Bluetooth bidezko gailuetara edo wifi-sare batera konektatzean, edo wifi-gune bat konfiguratzean."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Genero gramatikala"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Hautatu genero gramatikala"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Azpikeriazko aplikazioak bilatzea"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Bilatu phishinga aplikazioetako jardueretan"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Aztertu"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Aztertu laneko aplikazioak"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index d580e84..375f19e 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"غیرفعال کردن «صدای بلوتوث کممصرف»"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"اگر دستگاه از ویژگیهای سختافزار «صدای کممصرف» پشتیبانی کند، ویژگی «صدای بلوتوث کممصرف» را غیرفعال میکند."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"نمایش تنظیم «صدای کممصرف» در جزئیات دستگاه"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"کنار گذاشتن فهرست «صدای بلوتوث کممصرف» مجاز"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"استفاده از «صدای کممصرف» بهطور پیشفرض حتی درصورتیکه دستگاه جانبی مجهز به «صدای کممصرف» ازلحاظ مطابقت با معیارهای «فهرست مجازها» تأیید نشده باشد"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"دستگاههای ذخیرهسازی"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"دستگاههای برقراری تماس"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"دستگاههای دیگر"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"دستگاههای ذخیرهشده"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"مرتبط با حساب"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"قبلاً با حساب استفاده شده است"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"بلوتوث برای جفت کردن روشن خواهد شد"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"اولویتهای اتصال"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"قبلاً متصلشده"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"نوشتن در فیلدهای نوشتاری"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"نادیده گرفتن همه موارد فشردن دکمه قلم"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"قلم"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"همرسانی صدا"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"همرسانی صدا"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"تماسها و زنگهای هشدار"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"تاریخ و زمان"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"پروکسی"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"پاک کردن"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"فضای خصوصی"</string>
<string name="private_space_summary" msgid="8237652417163408001">"پنهان کردن برنامهها در پوشه خصوصی"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"باز کردن قفل بااستفاده از قفل صفحه"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"نمایش «فضای خصوصی»"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"پنهان کردن هنگام قفل بودن"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"پنهان کردن «فضای خصوصی» هنگام قفل بودن"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"برای اینکه دیگران متوجه نشوند «فضای خصوصی» در دستگاهتان روشن است، میتوانید آن را از فهرست برنامهها پنهان کنید"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"دسترسی به «فضای خصوصی» هنگام پنهان بودن"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"در نوار جستجو، «فضای خصوصی» را جستجو کنید"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"روی کاشی «فضای خصوصی» ضربه بزنید"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"قفل «فضای خصوصی» را باز کنید"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"خاموش"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"روشن"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"سیستم"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ایجاد «فضای خصوصی»"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"حذف «فضای خصوصی»"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"«فضای خصوصی» ایجاد نشد"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"«فضای خصوصی» باموفقیت حذف شد"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"«فضای خصوصی» حذف نشد"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"قفل صفحه تنظیم کنید"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"برای استفاده از «فضای خصوصی»، قفل صفحه در این دستگاه تنظیم کنید."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"تنظیم قفل صفحه"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"لغو کردن"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"لغو کردن"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"راهاندازی"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"راهاندازی «فضای خصوصی»"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"برنامههای خصوصی را در فضای امنی که فقط خودتان میتوانید به آن دسترسی داشته باشید پنهان کنید"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"سازوکار عمل"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"میتوانید از پایین فهرست برنامهها به «فضای خصوصی» دسترسی پیدا کنید"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"از برنامههای موجود در «فضای خصوصی» با یک قفل محافظت میشود"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"اعلان برنامههای موجود در «فضای خصوصی» هنگام قفل بودن آن پنهان میشوند"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"درصورت قفل بودن «فضای خصوصی»، برنامههای «فضای خصوصی» در مدیر اجازهها، داشبورد حریم خصوصی، و دیگر تنظیمات نشان داده نخواهد شد"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"درحال راهاندازی «فضای خصوصی»…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"«فضای خصوصی» با قفل محافظت میشود"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"اطلاعات استفاده برای برنامههای «فضای خصوصی» هنگام قفل بودن آن پنهان میشود"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"دسترسی به «فضای خصوصی» از فهرست برنامهها"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"«فضای خصوصی» راهاندازی نشد"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"اکنون دوباره امتحان کنید یا بعداً برگردید"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"امتحان مجدد"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"از قفل صفحه برای باز کردن قفل استفاده شود؟"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"میتوانید با همان روشی که قفل دستگاهتان را باز میکنید قفل «فضای خصوصی» را باز کنید یا قفل دیگری انتخاب کنید"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"استفاده از قفل صفحه"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"انتخاب قفل جدید"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"همه چیز آماده است!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"برای دسترسی به «فضای خصوصی»، از پایین صفحه اصلی به بالا بکشید، سپس به پایین پیمایش کنید"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"تمام"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"برای دسترسی به «فضای خصوصی»، به پایین پیمایش کنید"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"میتوانید حداکثر <xliff:g id="COUNT">%d</xliff:g> اثرانگشت اضافه کنید"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"حداکثر تعداد اثرانگشت را اضافه کردهاید"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"نمیتوانید اثرانگشتهای بیشتری اضافه کنید"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ادامه دادن به استفاده از برنامهها درحالت تاخوردگی"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"نمایشگر روان"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"بهطور خودکار نرخ بازآوری را برای بعضی محتوا، از ۶۰ هرتز تا <xliff:g id="ID_1">%1$s</xliff:g> هرتز بالا میبرد. مصرف باتری را افزایش میدهد."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"بهطور خودکار نرخ بازآوری را برای بعضی محتوا تا <xliff:g id="ID_1">%1$d</xliff:g> هرتز بالا میبرد. مصرف باتری را افزایش میدهد."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"اعمال بالاترین نرخ بازآوری"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"بالاترین نرخ بازآوری برای پاسخگویی بهبودیافته لمس و کیفیت پویانمایی. مصرف باتری را افزایش میدهد."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"توجه به صفحه"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"تنظیمات عمومی"</string>
<string name="apn_settings" msgid="4295467389400441299">"نامهای نقاط دستیابی"</string>
<string name="apn_edit" msgid="2003683641840248741">"ویرایش نقطه دستیابی"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"تنظیم نشده است"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"تنظیمنشده"</string>
<string name="apn_name" msgid="6677695784108157953">"نام"</string>
@@ -1599,7 +1647,7 @@
<string name="auto_launch_label" msgid="4069860409309364872">"باز کردن بهصورت پیشفرض"</string>
<string name="auto_launch_label_generic" msgid="5033137408273064599">"پیشفرضها"</string>
<string name="screen_compatibility_label" msgid="7549658546078613431">"سازگاری با صفحهنمایش"</string>
- <string name="permissions_label" msgid="1708927634370314404">"مجوزها"</string>
+ <string name="permissions_label" msgid="1708927634370314404">"اجازهها"</string>
<string name="cache_header_label" msgid="2441967971921741047">"حافظهٔ پنهان"</string>
<string name="clear_cache_btn_text" msgid="8597272828928143723">"پاک کردن حافظهٔ پنهان"</string>
<string name="cache_size_label" msgid="313456088966822757">"حافظهٔ پنهان"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"استفاده از دکمه دسترسپذیری برای باز کردن"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"نگهداشتن کلیدهای میزان صدا برای باز کردن"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"برای باز کردن، روی صفحهنمایش سه ضربه سریع بزنید"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"برای باز شدن، سه ضربه با دو انگشت رو صفحهنمایش بزنید"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"استفاده از اشاره برای باز کردن"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"استفاده از اشاره دسترسپذیری"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"برای استفاده از این ویژگی، روی دکمه دسترسپذیری <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> در پایین صفحه ضربه بزنید.\n\nبرای جابهجایی بین ویژگیها، دکمه دسترسپذیری را لمس کنید و نگه دارید."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"برای استفاده از این ویژگی، روی دکمه دسترسپذیری در صفحهنمایش ضربه بزنید."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"برای استفاده از این ویژگی، هر دو کلید میزان صدا را فشار دهید و نگه دارید."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"برای راهاندازی یا متوقف کردن درشتنمایی، روی جایی از صفحهنمایش سه ضربه بزنید."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"برای راهاندازی یا متوقف کردن درشتنمایی، روی جایی از صفحهنمایش با دو انگشت سه ضربه بزنید."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"برای استفاده از این ویژگی، با ۲ انگشت از پایین صفحه تند بهبالا بکشید.\n\nبرای جابهجایی بین ویژگیها، با ۲ انگشت تند بهبالا بکشید و نگه دارید."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"برای استفاده از این ویژگی، با ۳ انگشت از پایین صفحه تند بهبالا بکشید.\n\nبرای جابهجایی بین ویژگیها، با ۳ انگشت تند بهبالا بکشید و نگه دارید."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"برای استفاده از ویژگی دسترسپذیری، با ۲ انگشت از پایین صفحه تند بهبالا بکشید.\n\nبرای جابهجایی بین ویژگیها، با ۲ انگشت تند بهبالا بکشید و نگه دارید."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"نگهداشتن کلیدهای میزان صدا"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"نگه داشتن کلیدهای میزان صدا"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"هردو کلید میزان صدا را فشار دهید و نگه دارید"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"سه ضربه با دو انگشت روی صفحه"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"سه ضربه با دو انگشت روی صفحه"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"با دو انگشت {0,number,integer} بار بهسرعت روی صفحه ضربه بزنید"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"روی صفحهنمایش سه ضربه سریع بزنید"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"سه ضربه سریع روی صفحه"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"سریع روی صفحهنمایش {0,number,integer} بار ضربه بزنید. ممکن است این میانبر سرعت دستگاه را کاهش دهد"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"استفاده از لرزش و فناوری لمسی"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"لرزش هشدار"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"لرزش رسانهها"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"لرزش صفحهکلید"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"لرزش هنگام زنگ خوردن"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"لرزش برای اعلان"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"بازخورد لمسی"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"محدود کردن فعالیت پسزمینه برای برنامه ممکن است باعث عملکرد نادرست آن شود."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"از آنجا که این برنامه برای بهینه کردن باتری تنظیم نشده است، نمیتوانید آن را محدود کنید.\n\nبرای محدود کردن برنامه، ابتدا بهینهسازی باتری را روشن کنید."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"مدیریت مصرف باتری"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"نامحدود"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"بهینهسازیشده"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"محدودشده"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"اندازه نوشتار، چاپ درشت، قلم بزرگ، نوشتار بزرگ، کمبینا، بزرگ کردن نوشتار، بزرگکننده قلم، بزرگ کردن قلم"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"نمایشگر محیطی همیشه روشن، AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc، برچسب، خوانشگر"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"صفحهکلید، فناوری لمسی، لرزش،"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"میزان صدا، لرزش، «مزاحم نشوید»"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"میزان صدای رسانه"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"میزان صدای محتوای ارسالی"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"دسترسی دادن برای مدیریت همه فایلها"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"به این برنامه اجازه میدهد همه فایلهای موجود در این دستگاه یا فضاهای ذخیرهسازی متصلشده به آن را بخواند، تغییر دهد، و حذف کند. اگر این مجوز به برنامه داده شود، ممکن است بدون اطلاع صریح شما به فایلها دسترسی یابد."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"میتوانند به همه فایلها دسترسی داشته باشند"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"اعلانهای تمامصفحه"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"اجازه دادن به اعلانهای تمامصفحه از این برنامه"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"به این برنامه اجازه میدهد وقتی دستگاه قفل است، اعلانها را روی کل صفحه نشان دهد. برنامهها ممکن است از این قابلیت برای برجسته کردن هشدارها، تماس ورودی، یا دیگر اعلانهای فوری استفاده کنند."</string>
@@ -3821,9 +3882,9 @@
<string name="disabled_by_policy_parental_consent" msgid="9166060049019018978">"تلفن را دراختیار ولیتان قرار دهید تا تغییر این تنظیم را مجاز کند."</string>
<string name="default_admin_support_msg" msgid="8816296554831532033">"برای کسب اطلاعات بیشتر، با سرپرست فناوری اطلاعات تماس بگیرید"</string>
<string name="admin_support_more_info" msgid="8407433155725898290">"جزئیات بیشتر"</string>
- <string name="admin_profile_owner_message" msgid="8860709969532649195">"سرپرستتان میتواند بر برنامهها و دادههای مرتبط با این نمایه کاری (ازجمله تنظیمات، مجوزها، دسترسی شرکتی، فعالیت شبکه و اطلاعات مکان دستگاه) نظارت داشته باشد و آنها را مدیریت کنید."</string>
- <string name="admin_profile_owner_user_message" msgid="4929926887231544950">"سرپرستتان میتواند بر برنامهها و دادههای مرتبط با این کاربر (ازجمله تنظیمات، مجوزها، دسترسی شرکتی، فعالیت شبکه و اطلاعات مکان دستگاه) نظارت داشته باشد و آنها را مدیریت کنید."</string>
- <string name="admin_device_owner_message" msgid="5503131744126520590">"سرپرستتان میتواند بر برنامهها و دادههای مرتبط با این دستگاه (ازجمله تنظیمات، مجوزها، دسترسی شرکتی، فعالیت شبکه و اطلاعات مکان دستگاه) نظارت داشته باشد و آنها را مدیریت کنید."</string>
+ <string name="admin_profile_owner_message" msgid="8860709969532649195">"سرپرستتان میتواند بر برنامهها و دادههای مرتبط با این نمایه کاری (ازجمله تنظیمات، اجازهها، دسترسی شرکتی، فعالیت شبکه و اطلاعات مکان دستگاه) نظارت داشته باشد و آنها را مدیریت کنید."</string>
+ <string name="admin_profile_owner_user_message" msgid="4929926887231544950">"سرپرستتان میتواند بر برنامهها و دادههای مرتبط با این کاربر (ازجمله تنظیمات، اجازهها، دسترسی شرکتی، فعالیت شبکه و اطلاعات مکان دستگاه) نظارت داشته باشد و آنها را مدیریت کنید."</string>
+ <string name="admin_device_owner_message" msgid="5503131744126520590">"سرپرستتان میتواند بر برنامهها و دادههای مرتبط با این دستگاه (ازجمله تنظیمات، اجازهها، دسترسی شرکتی، فعالیت شبکه و اطلاعات مکان دستگاه) نظارت داشته باشد و آنها را مدیریت کنید."</string>
<string name="admin_financed_message" msgid="1156197630834947884">"سرپرست دستگاهتان میتواند به دادههای مرتبط با این دستگاه دسترسی داشته باشد، برنامهها را مدیریت کند، و تنظیمات این دستگاهها را تغییر دهد."</string>
<string name="condition_turn_off" msgid="402707350778441939">"خاموش کردن"</string>
<string name="condition_turn_on" msgid="3911077299444314791">"روشن کردن"</string>
@@ -3979,7 +4040,7 @@
<string name="keywords_long_background_tasks" msgid="5788956269136054574">"کارهای طولانی، انتقال داده، کارهای پسزمینه"</string>
<string name="reset_shortcut_manager_throttling" msgid="2183940254903144298">"بازنشانی محدودکننده سرعت ShortcutManager"</string>
<string name="reset_shortcut_manager_throttling_complete" msgid="8949943009096885470">"محدودکننده سرعت ShortcutManager بازنشانی شد"</string>
- <string name="notification_suggestion_title" msgid="6309263655965785411">"کنترل اطلاعات روی صفحه قفل"</string>
+ <string name="notification_suggestion_title" msgid="6309263655965785411">"کنترل بافت صفحه قفل"</string>
<string name="notification_suggestion_summary" msgid="7615611244249276113">"نمایش یا پنهان کردن محتوای اعلان"</string>
<string name="page_tab_title_support" msgid="3235725053332345773">"نکتهها و پشتیبانی"</string>
<string name="developer_smallest_width" msgid="632354817870920911">"کوچکترین عرض"</string>
@@ -4473,7 +4534,7 @@
<string name="hwui_force_dark_title" msgid="4256904905631994219">"لغو اجبار حالت تاریک"</string>
<string name="hwui_force_dark_summary" msgid="6515748781487952769">"ویژگی اجبار حالت تاریک را برای همیشه روشن بودن لغو میکند"</string>
<string name="privacy_dashboard_title" msgid="6845403825611829558">"حریم خصوصی"</string>
- <string name="privacy_dashboard_summary" msgid="5775090172422786808">"مجوزها، فعالیت حساب، دادههای شخصی"</string>
+ <string name="privacy_dashboard_summary" msgid="5775090172422786808">"اجازهها، فعالیت حساب، دادههای شخصی"</string>
<string name="privacy_controls_title" msgid="1383047169455206604">"کنترلها"</string>
<string name="contextual_card_dismiss_remove" msgid="8636557343011606722">"حذف"</string>
<string name="contextual_card_dismiss_keep" msgid="440516181066490747">"حفظ شود"</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"بررسی فعالیت برنامه ازنظر رمزگیری"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"استفاده از اسکن"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"استفاده از اسکن برای برنامههای کاری"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"اسکن بهصورت خصوصی روی دستگاهتان اجرا میشود و فعالیت برنامهها را ازنظر رمزگیری یا سایر رفتارهای گمراهکننده بررسی میکند. درصورت شناسایی، برخیاز اطلاعات برنامه برای تأیید تهدید و ارسال هشدار به کاربران برنامه به «سپر ایمنی Google Play» ارسال میشود."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"این یک ویژگی امنیتی محافظتشده است. هیچگونه اطلاعات دستگاه یا اطلاعات شخصی با Google همرسانی نمیشود. \n\nرمزگیری تلاشی برای سرقت اطلاعات اعتباری ورود به سیستم یا سایر اطلاعات شخصی است."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index a84d572..bfe4d40 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Poista Bluetooth LE audio käytöstä"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Poistaa Bluetooth LE ‑audio-ominaisuuden käytöstä, jos laite tukee LE-audiolaitteistoja"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Näytä LE Audio ‑valitsin laitetiedoissa"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Ohita Bluetooth LE Audio ‑sallitut"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Käytä oletuksena LE Audiota, vaikka LE Audio ‑lisälaitteen ei olisi vahvistettu täyttävän sallitut-listan kriteerejä."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medialaitteet"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Soittolaitteet"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Muut laitteet"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Tallennetut laitteet"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Liitetty tiliin"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Käytetty viimeksi tilillä"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth käynnistetään parinmuodostusta varten"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Yhteysasetukset"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Aiemmin liitetyt"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Kirjoittaminen tekstikenttiin"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ohita kaikki näyttökynäpainikkeen painallukset"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Näyttökynä"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audion jakaminen"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Audion jakaminen"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Puhelut ja hälytykset"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Päivämäärä ja aika"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Välityspalvelin"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Tyhjennä"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Yksityinen tila"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Piilota sovellukset yksityiseen kansioon"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Avaaminen näytön lukituksella"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Näytä yksityinen tila"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Piilottaminen lukittuna"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Yksityisen tilan piilottaminen, kun se on lukittuna"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Piilota yksityinen tila piilottamalla se sovelluslistalta"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Pääsy yksityiseen tilaan, kun se on piilotettuna"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Hae hakukentästä \"Yksityinen tila\""</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Napauta Yksityinen tila ‑laattaa"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Avaa yksityisen tilan lukitus"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Pois päältä"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Päällä"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Järjestelmä"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Yksityisen tilan luominen"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Yksityisen tilan poistaminen"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Yksityistä tilaa ei voitu luoda"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Yksityinen tila poistettu"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Yksityistä tilaa ei voitu poistaa"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Näytön lukituksen asettaminen"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Jos haluat käyttää yksityistä tilaa, aseta näytön lukitus."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Aseta näytön lukitus"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Peruuta"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Peruuta"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Ota käyttöön"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Yksityisen tilan ottaminen käyttöön"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Piilota suojatun tilan yksityiset sovellukset, joihin vain sinulla on pääsy"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Näin se toimii"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Saat pääsyn yksityiseen tilaan sovelluslistan alareunasta"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Yksityisen tilan sovelluksia suojataan lukolla"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Ilmoitukset yksityisen tilan sovelluksista ovat piilotettuina, kun se on lukittu"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Yksityisen tilan sovellukset eivät näy lupienhallinnassa, yksityisyydenhallintapaneelissa tai muissa asetuksissa, kun yksityinen tila on lukittuna"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Yksityistä tilaa otetaan käyttöön…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Yksityinen tila suojataan lukolla"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Yksityisen tilan sovellusten käyttötiedot piilotetaan, kun se on lukittu"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Yksityisen tilan käyttö sovelluslistalta"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Yksityisen tilan käyttöönotto epäonnistui"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Yritä uudelleen nyt tai palaa myöhemmin"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Yritä uudelleen"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Käytetäänkö avaamiseen näytön lukitusta?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Voit avata yksityisen tilan lukituksen samaan tapaan kuin avaat laitteen lukituksen tai voit valita eri lukon"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Käytä näytön lukitusta"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Valitse uusi lukko"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Valmis"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Voit käyttää yksityistä tilaa pyyhkäisemällä ylös aloitusnäytön alareunasta ja vierittämällä alas"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Valmis"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Vieritä alas käyttääksesi yksityistä tilaa"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Voit lisätä korkeintaan <xliff:g id="COUNT">%d</xliff:g> sormenjälkeä"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Et voi lisätä useampia sormenjälkiä."</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Enempää sormenjälkiä ei voi lisätä."</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Jatka sovellusten käyttöä taitetussa tilassa"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Nostaa tietyn sisällön päivitysvälin automaattisesti 60 hertsistä <xliff:g id="ID_1">%1$s</xliff:g> hertsiin. Lisää akun käyttöä."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Nostaa tietyn sisällön päivittymistiheyden automaattisesti <xliff:g id="ID_1">%1$d</xliff:g> hertsiin. Lisää akun käyttöä."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Pakota suurin mahdollinen päivitysväli"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Korkein päivitysväli parantaa kosketukseen vastaamista ja animaatioiden laatua. Lisää akun käyttöä."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Huomionäyttö"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Yhteiskäytön asetukset"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN:t"</string>
<string name="apn_edit" msgid="2003683641840248741">"Muokkaa tukiasemaa"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ei asetettu"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ei valittu"</string>
<string name="apn_name" msgid="6677695784108157953">"Nimi"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Avaa saavutettavuuspainikkeella"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Avaa painamalla äänenvoimakkuuspainikkeita"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Avaa kolmoisnapauttamalla näyttöä"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Avaa napauttamalla näyttöä kolmesti kahdella sormella"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Avaa eleellä"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Käytä esteettömyyselettä"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Laita ominaisuus päälle napauttamalla näytön alareunassa olevaa esteettömyyspainiketta <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nVaihda ominaisuudesta toiseen painamalla esteettömyyspainiketta pitkään."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Ota ominaisuus käyttöön napauttamalla näytöllä näkyvää saavutettavuuspainiketta."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Laita tämä ominaisuus päälle painamalla pitkään molempia äänenvoimakkuuspainikkeita."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Aloita tai lopeta suurennus kolmoisnapauttamalla missä vain näytöllä."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Aloita tai lopeta suurennus kolmoisnapauttamalla kahdella sormella missä tahansa näytöllä."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Laita ominaisuus päälle pyyhkäisemällä näytön alalaidasta ylös kahdella sormella.\n\nVaihda ominaisuudesta toiseen pyyhkäisemällä ylös kahdella sormella ja koskettamalla pitkään."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Laita ominaisuus päälle pyyhkäisemällä näytön alalaidasta ylös kolmella sormella.\n\nVaihda ominaisuudesta toiseen pyyhkäisemällä ylös kolmella sormella ja koskettamalla pitkään."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Laita esteettömyysominaisuus päälle pyyhkäisemällä näytön alalaidasta ylös kahdella sormella.\n\nVaihda ominaisuudesta toiseen pyyhkäisemällä ylös kahdella sormella ja koskettamalla pitkään."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Paina äänenvoimakkuuspainikkeita pitkään"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"paina äänenvoimakkuuspainikkeita pitkään"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Paina molempia äänenvoimakkuuspainikkeita pitkään"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Kolmoisnapauta näyttöä kahdella sormella"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"kolmoisnapauta näyttöä kahdella sormella"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Napauta näyttöä {0,number,integer} kertaa nopeasti kahdella sormella"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Kolmoisnapauta näyttöä"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"kolmoisnapauta näyttöä"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Napauta näyttöä nopeasti {0,number,integer} kertaa. Tämän pikanäppäimen käyttö voi hidastaa laitettasi."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Käytä värinää ja haptista palautetta"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Värinähälytys"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Median värinä"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Näppäimistön värinä"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Soittoäänen värinä"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Ilmoitusvärinä"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Kosketuspalaute"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Jos rajoitat sovelluksen toimintaa taustalla, se voi alkaa toimia virheellisesti."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Sovellusta ei voi rajoittaa, koska akun optimointi ei ole käytössä.\n\nOta optimointi käyttöön rajoittamista varten."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Rajaa akunkäyttöä"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Ei rajoituksia"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimoitu"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Rajoitettu"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tekstin koko, suurikokoinen teksti, suuri fontti, suuri teksti, heikko näkö, suurenna tekstiä, fontin suurentaja, fontin suurennus"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"aina päällä oleva näyttö, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tagi, lukija"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"näppäimistö, haptinen teknologia, värinä,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Äänenvoimakkuus, värinä, Älä häiritse"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Median äänenvoimakkuus"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Suoratoiston äänenvoimakkuus"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Salli pääsy tiedostojen ylläpitoa varten"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Salli sovelluksen lukea, muokata ja poistaa kaikkia tiedostoja tällä laitteella ja yhdistetyillä tallennuslaitteilla. Jos sallit tämän, sovelluksella on pääsy tiedostoihin ilman, että sinulle ilmoitetaan asiasta erikseen."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Voi päästä kaikkiin tiedostoihin"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Koko näytön ilmoitukset"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Salli sovelluksen lähettää koko näytön ilmoituksia"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Salli sovelluksen näyttää koko näytön ilmoituksia, kun laite on lukittu. Sovellukset voivat käyttää tällaisia ilmoituksia hälytyksistä, saapuvista puheluista tai muista tärkeistä asioista ilmoittamiseen."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Tarkista sovellustoiminta tietojenkalastelun osalta"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Käytä tarkistusta"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Käytä tarkistusta työsovelluksiin"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Tarkistus tapahtuu yksityisesti laitteellasi. Siinä tarkistetaan sovellustoiminta tietojenkalastelun tai muun petollisen toiminnan varalta. Jos sellaista havaitaan, joitakin sovelluksen tietoja lähetetään Google Play Protectille uhkien varmistamiseksi ja käyttäjien varoittamiseksi."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Tämä on suojattu turvaominaisuus. Yhtäkään laitetta tai henkilökohtaisia tietoja ei jaeta Googlelle. \n\nTietojenkalastelu on yritys varastaa kirjautumistietoja tai muita henkilökohtaisia tietoja."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 8919049..107ae4d 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Désactiver le Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Désactive la fonctionnalité Bluetooth LE Audio si l\'appareil prend en charge les capacités matérielles LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Afficher comm. LE Audio dans les détails"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Contourner la liste verte du Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Utiliser LE Audio par défaut même si le périphérique LE Audio n\'a pas été vérifié en fonction des critères de la liste verte."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Appareils de stockage multimédia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Appareils avec fonctionnalités d\'appel"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Autres appareils"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Appareils enregistrés"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associé au compte"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Utilisés précédemment avec ce compte"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Le Bluetooth s\'activera pour l\'association"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Préférences de connexion"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Connecté précedemment"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Écrire dans les champs de texte"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorer toutes les pressions sur les boutons du stylet"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylet"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Partage du son"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Partager le son"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Appels et alarmes"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Date et heure"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Serveur mandataire"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Effacer"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espace privé"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Masquer des applications dans un dossier privé"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Déverrouiller avec le Verrouillage de l\'écran"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Afficher l\'espace privé"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Masquer lorsque verrouillé"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Masquer l\'Espace privé lorsqu\'il est verrouillé"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Masquez l\'Espace privé dans votre liste d\'applications pour préserver votre confidentialité"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Accéder à l\'Espace privé lorsqu\'il est masqué"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Recherchez « Espace privé » dans la barre de recherche"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Touchez la tuile Espace privé"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Déverrouillez votre Espace privé"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Désactivé"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Activé"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Système"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Créer un espace privé"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Supprimer l\'espace privé"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Impossible de créer un espace privé"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"L\'espace privé a bien été supprimé"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Impossible de supprimer l\'espace privé"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Définir Verrouillage d\'écran"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Réglez le Verrouillage d\'écran pour utiliser l\'espace privé."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Définir Verrouillage d\'écran"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Annuler"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Annuler"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configuration"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurer l\'Espace privé"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Masquez les applications privées dans un espace sécurisé dont l\'accès vous est réservé"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Fonctionnement"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Vous pouvez accéder à l\'Espace privé en bas de votre liste d\'applications"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Les applications de l\'Espace privé sont protégées par un verrou"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Les notifications des applications de l\'Espace privé sont masquées lorsqu\'il est verrouillé"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Les applications de l\'Espace privé ne figureront pas dans le gestionnaire des autorisations, dans le Tableau de bord de confidentialité ni dans d\'autres paramètres lorsque l\'Espace privé est verrouillé"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configuration de l\'Espace privé en cours…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"L\'Espace privé est protégé par un verrou"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Les informations d\'utilisation des applications de l\'Espace privé sont masquées lorsque celui-ci est verrouillé"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accéder à l\'Espace privé à partir de votre liste d\'applis"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Impossible de configurer l\'Espace privé"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Réessayez maintenant ou revenez plus tard"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Réessayer"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Utiliser Verrouillage d\'écran pour déverrouiller?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Vous pouvez déverrouiller l\'Espace privé de la même manière que votre appareil ou choisir un autre type de verrou"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Utiliser le Verrouillage d\'écran"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Sélectionner un nouveau verrou"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Tout est prêt!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Pour accéder à l\'Espace privé, balayez votre écran d\'accueil du bas vers le haut, puis faites défiler l\'écran vers le bas"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Terminé"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Faire défiler vers le bas pour accéder à l\'Espace privé"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Vous pouvez ajouter jusqu\'à <xliff:g id="COUNT">%d</xliff:g> empreintes digitales"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Vous avez ajouté le nombre maximal d\'empreintes digitales"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Impossible d\'ajouter des empreintes digitales"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuer à utiliser les applications lorsque l\'appareil est plié"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Affichage fluide"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Augmente automatiquement la fréquence d\'actualisation de 60 Hz à <xliff:g id="ID_1">%1$s</xliff:g> Hz pour certains contenus. Augmente l\'utilisation de la pile."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Augmente automatiquement la fréquence d\'actualisation jusqu\'à <xliff:g id="ID_1">%1$d</xliff:g> Hz pour certains contenus. Augmente l\'utilisation de la pile."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forcer la fréquence d\'actualisation de pointe"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Taux d\'actualisation supérieur pour une amélioration de la réactivité tactile et de la fluidité des animations. Cette fonction sollicite davantage la pile de l\'appareil."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Écran attentif"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Paramètres communs"</string>
<string name="apn_settings" msgid="4295467389400441299">"Noms des points d\'accès"</string>
<string name="apn_edit" msgid="2003683641840248741">"Modifier le point d\'accès"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Non défini"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Non configuré"</string>
<string name="apn_name" msgid="6677695784108157953">"Nom"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Utiliser le bouton d\'accessibilité pour ouvrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Maintenez les touches de volume enfoncées pour l\'ouvrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Touchez l\'écran trois fois pour l\'ouvrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Ouvrir en touchant l\'écran trois fois avec deux doigts"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Utiliser un geste pour activer le service"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Utiliser le geste d\'accessibilité"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Pour utiliser cette fonctionnalité, touchez le bouton d\'accessibilité <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> dans le bas de l\'écran.\n\nPour basculer entre les fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Pour utiliser cette fonctionnalité, touchez le bouton d\'accessibilité sur votre écran."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Pour utiliser cette fonctionnalité, maintenez les deux touches de volume enfoncées."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Pour démarrer et arrêter l\'agrandissement, touchez l\'écran trois fois n\'importe où."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Pour démarrer et arrêter l\'Agrandissement, touchez l\'écran trois fois avec deux doigts."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Pour utiliser cette fonctionnalité, balayez l\'écran de bas en haut avec deux doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez la pression."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Pour utiliser cette fonctionnalité, balayez l\'écran de bas en haut avec trois doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec trois doigts et maintenez-les-y."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Pour utiliser une fonctionnalité d\'accessibilité, balayez l\'écran de bas en haut avec deux doigts.\n\nPour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec deux doigts et maintenez-la pression."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Maintenir enfoncées les touches de volume"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"maintenir enfoncées les touches de volume"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Maintenez enfoncées les deux touches de volume"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Toucher l\'écran trois fois avec deux doigts"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"toucher l\'écran trois fois avec deux doigts"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Touchez rapidement l\'écran {0,number,integer} fois avec deux doigts"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Toucher l\'écran trois fois"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"toucher l\'écran trois fois"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Touchez rapidement l\'écran {0,number,integer} fois. Ce raccourci peut ralentir votre appareil"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Utiliser les vibrations et les effets tactils"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibration pour les alarmes"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibration multimédia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibration du clavier"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibration pour la sonnerie"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibration pour les notifications"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Retour tactile"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Si vous limitez l\'activité en arrière-plan d\'une application, cela peut provoquer un fonctionnement instable"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Comme cette appli n\'est pas config. pour optim. la pile, vous ne pouvez pas la restr.\n\nPour la restr., activez l\'optim. de pile."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gérer l\'utilisation de la pile"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Aucune restriction"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimisée"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Limitée"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"taille du texte, grands caractères, police de grande taille, texte de grande taille, vision faible, agrandir le texte, agrandisseur de police, agrandissement de la police"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"affichage en mode Veille toujours activé, affichage toujours activé"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"ccp, balise, lecteur"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"clavier, haptique, vibrer"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibration, Ne pas déranger"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume du contenu multimédia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume de diffusion"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Autorisez l\'accès pour gérer tous les fichiers"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Autoriser cette application à lire, à modifier et à supprimer tous les fichiers qui se trouvent sur cet appareil ou sur des volumes de stockage connectés. Si vous accordez cette autorisation, l\'application pourra accéder à des fichiers sans que vous le sachiez."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Peuvent accéder à tous les fichiers"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notifications en plein écran"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Autoriser les notifications en plein écran de cette application"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Autoriser cette application à afficher des notifications en plein écran lorsque l\'appareil est verrouillé. Les applications peuvent s\'en servir pour mettre en évidence des alarmes, des appels entrants ou d\'autres notifications urgentes."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Le nom de votre appareil est visible aux applications que vous avez installées. Il est également possible que d\'autres personnes voient le nom de votre appareil lorsque vous vous connectez à des appareils Bluetooth ou à un réseau Wi-Fi, ou lorsque vous configurez un point d\'accès Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Genre grammatical"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Sélectionnez un genre grammatical"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Analyse d\'applications trompeuses"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Vérifier l\'activité des applications pour détecter les tentatives d\'hameçonnage"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Activer l\'analyse"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Activer l\'analyse pour les applications professionnelles"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index e537439..1d2a375 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Désactiver Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Désactiver la fonctionnalité Bluetooth LE Audio si l\'appareil accepte les capacités matérielles LE Audio"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Voir LE Audio dans Détails de l\'appareil"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Liste d\'autorisation de contournement Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Utilisez LE Audio par défaut même si le périphérique LE Audio n\'a pas été vérifié pour remplir les critères de la liste d\'autorisation."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Périphériques multimédias"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Appareils servant pour les appels"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Autres appareils"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Appareils enregistrés"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associé au compte"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Utilisé précédemment avec le compte"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Le Bluetooth sera activé pour permettre l\'association"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Préférences de connexion"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Connecté précédemment"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Écrire dans les champs de texte"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorer toutes les pressions sur les boutons du stylet"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylet"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Partage du contenu audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Partager le contenu audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Appels et alarmes"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Date et heure"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Effacer"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espace privé"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Cachez vos applications dans un dossier privé"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Déverrouiller avec le verrouillage de l\'écran"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Afficher l\'espace privé"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Masquer lorsque l\'application est verrouillée"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Masquer Espace privé lorsque l\'application est verrouillée"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Vous pouvez masquer Espace privé de votre liste d\'applis pour éviter les regards indiscrets"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Accéder à Espace privé lorsque l\'application est masquée"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Rechercher \"Private Space\" dans la barre de recherche"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Appuyer sur le bloc Espace privé"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Déverrouiller votre Espace privé"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Désactivé"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Activé"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Système"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Créer un espace privé"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Supprimer l\'espace privé"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Impossible de créer l\'espace privé"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"L\'espace privé a bien été supprimé"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Impossible de supprimer l\'espace privé"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Définir le verrouillage de l\'écran"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Pour utiliser Espace privé, définissez un verrouillage de l\'écran sur cet appareil."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Activer le verrouillage de l\'écran"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Annuler"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Annuler"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configuration"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurer Espace privé"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Masquez les applications privées dans un espace sécurisé qui n\'est accessible que par vous"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Comment ça marche"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Vous pouvez accéder à Espace privé à partir du bas de votre liste d\'applications"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Les applis dans Espace privé sont protégées par un verrou"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Les notifications des applis dans Espace privé sont masquées lorsque cette application est verrouillée"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Les applis contenues dans Espace privé n\'apparaîtront pas dans le gestionnaire d\'autorisations, dans le tableau de bord Confidentialité ni dans d\'autres paramètres lorsque l\'application Espace privé est verrouillée"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configuration d\'Espace privé…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"L\'application Espace privé est protégée par un verrouillage"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Les informations d\'utilisation des applis contenues dans Espace privé sont masquées lorsque l\'application est verrouillée"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accéder à Espace privé depuis votre liste d\'applications"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Impossible de configurer Espace privé"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Réessayer maintenant ou revenir plus tard"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Réessayer"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Déverrouiller avec le verrouillage de l\'écran ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Vous pouvez déverrouiller Espace privé de la même manière que vous déverrouillez votre appareil ou bien choisir un verrouillage différent"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Utiliser le verrouillage de l\'écran"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Choisir un nouveau verrouillage"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Tout est prêt !"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Pour accéder à Espace privé, balayez votre écran d\'accueil de bas en haut, puis faites défiler vers le bas"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"OK"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Faites défiler vers le bas pour accéder à Espace privé"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Vous pouvez ajouter jusqu\'à <xliff:g id="COUNT">%d</xliff:g> empreintes digitales"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Vous avez ajouté le nombre maximal autorisé d\'empreintes digitales"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Impossible d\'ajouter d\'autres empreintes digitales"</string>
@@ -716,12 +762,12 @@
<string name="bluetooth_device_keyboard_settings_preference_title" msgid="3411693160917620519">"Paramètres du clavier"</string>
<string name="bluetooth_device_mac_address" msgid="4873325074786732703">"Adresse Bluetooth de l\'appareil : <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
<string name="bluetooth_multuple_devices_mac_address" msgid="4974301550897923376">"Adresse Bluetooth de l\'appareil :\n<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
- <string name="bluetooth_unpair_dialog_title" msgid="6943633443716052995">"Oublier l\'appareil ?"</string>
+ <string name="bluetooth_unpair_dialog_title" msgid="6943633443716052995">"Dissocier l\'appareil ?"</string>
<string name="remove_association_button" msgid="5004208145998061135">"Supprimer l\'association"</string>
<string name="bluetooth_companion_app_remove_association_dialog_title" msgid="1344518601377991897">"Dissocier l\'appli ?"</string>
<string name="bluetooth_companion_app_body" msgid="8442643629075687761">"L\'appli <xliff:g id="APP_NAME">%1$s</xliff:g> ne s\'associera plus à votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="device_details_leaudio_toggle_summary" msgid="7684848254433230809">"Expérimental. Améliore la qualité audio."</string>
- <string name="bluetooth_unpair_dialog_forget_confirm_button" msgid="9184489424930549015">"Oublier l\'appareil"</string>
+ <string name="bluetooth_unpair_dialog_forget_confirm_button" msgid="9184489424930549015">"Dissocier l\'appareil"</string>
<string name="bluetooth_companion_app_remove_association_confirm_button" msgid="76323555527926915">"Dissocier l\'appli"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="3114156958598821615">"Nombre maximal d\'appareils audio Bluetooth connectés"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="4056811727247312473">"Sélectionner le nombre maximal d\'appareils audio Bluetooth connectés"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuer à utiliser les applis sur Fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Affichage fluide"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Augmente automatiquement la fréquence d\'actualisation de 60 à <xliff:g id="ID_1">%1$s</xliff:g> Hz pour certains contenus. Sollicite davantage la batterie."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Augmente automatiquement la fréquence d\'actualisation jusqu\'à <xliff:g id="ID_1">%1$d</xliff:g> Hz pour certains contenus. Sollicite davantage la batterie."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forcer la fréquence d\'actualisation crête"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Fréquence d\'actualisation la plus élevée pour améliorer la réactivité au toucher et la qualité d\'animation. La batterie est davantage sollicitée."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Regard sur écran"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Paramètres communs"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Modifier le point d\'accès"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Non défini"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Non défini"</string>
<string name="apn_name" msgid="6677695784108157953">"Nom"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Utiliser le bouton Accessibilité pour ouvrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Maintenir enfoncés les boutons de volume pour ouvrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Appuyez trois fois sur l\'écran pour ouvrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Appuyer trois fois sur l\'écran avec deux doigts pour ouvrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Utiliser un geste pour ouvrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Utiliser le geste d\'accessibilité"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Pour utiliser cette fonctionnalité, appuyez sur le bouton Accessibilité <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> en bas de l\'écran.\n\nPour changer de fonctionnalité, appuyez dessus de manière prolongée."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Pour utiliser cette fonctionnalité, appuyez sur le bouton Accessibilité sur l\'écran."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Pour utiliser cette fonctionnalité, appuyez de manière prolongée sur les deux boutons de volume."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Pour lancer ou arrêter l\'agrandissement, appuyez trois fois n\'importe où sur l\'écran."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Pour commencer et arrêter l\'agrandissement, appuyez trois fois sur votre écran avec deux doigts."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Pour utiliser cette fonctionnalité, balayez l\'écran vers le haut avec deux doigts.\n\nPour changer de fonctionnalité, balayez l\'écran vers le haut avec deux doigts et appuyez de manière prolongée."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Pour utiliser cette fonctionnalité, balayez l\'écran vers le haut avec trois doigts.\n\nPour changer de fonctionnalité, balayez l\'écran vers le haut avec trois doigts et appuyez de manière prolongée."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Pour utiliser une fonctionnalité d\'accessibilité, balayez l\'écran vers le haut avec deux doigts.\n\nPour changer de fonctionnalité, balayez l\'écran vers le haut avec deux doigts et appuyez de manière prolongée."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Maintenir enfoncés les boutons de volume"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"maintenir enfoncés les boutons de volume"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Appuyer de manière prolongée sur les deux boutons de volume"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Appuyer trois fois sur l\'écran avec deux doigts"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"appuyer trois fois sur l\'écran avec deux doigts"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Appuyer rapidement sur l\'écran {0,number,integer} fois avec deux doigts"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Appuyer trois fois sur l\'écran"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"appuyer trois fois sur l\'écran"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Appuyer rapidement {0,number,integer} fois sur l\'écran. Ce raccourci peut ralentir votre appareil."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Utiliser le vibreur et le retour haptique"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibreur des alarmes"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibreur des contenus multimédias"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibration du clavier"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibreur de la sonnerie"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibreur des notifications"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Retour tactile"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Si vous limitez l\'activité en arrière-plan d\'une application, cela peut provoquer son dysfonctionnement"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Cette appli n\'étant pas configurée pour optimiser batterie, vous ne pouvez pas la limiter.\n\nActivez optimisation batterie."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gérer l\'utilisation de la batterie"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sans restriction"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimisée"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Limitée"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"taille du texte, gros caractères, grande police, gros texte, déficience visuelle, agrandir le texte, agrandisseur de police, agrandissement de la police"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"Mode Always-on affichage ambiant, mode Always-on"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, tag, lecteur"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"clavier, technologies haptiques, vibreur"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibreur, Ne pas déranger"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume des contenus multimédias"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume de diffusion"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Autoriser l\'accès pour gérer tous les fichiers"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Autoriser cette appli à lire, modifier et supprimer tous les fichiers sur cet appareil ou sur n\'importe quel volume de stockage connecté. Si cette option est activée, l\'appli pourra accéder à des fichiers à votre insu."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Peut peut accéder à tous les fichiers"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notifications en plein écran"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Autoriser l\'appli à afficher les notifications en plein écran"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Autoriser cette appli à afficher des notifications occupant tout l\'écran lorsque l\'appareil est verrouillé. Les applis peuvent les utiliser pour mettre en avant les alarmes, les appels entrants ou d\'autres notifications urgentes."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Les applis que vous avez installées ont accès au nom de votre appareil. D\'autres personnes peuvent aussi le voir lorsque vous vous connectez à des appareils Bluetooth ou à un réseau Wi-Fi, ou lorsque vous configurez un point d\'accès Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Genre grammatical"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Sélectionner le genre grammatical"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Analyse des applications trompeuses"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Vérifier l\'activité de l\'application pour détecter un éventuel hameçonnage"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Utiliser l\'analyse"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Utiliser l\'analyse pour les applications professionnelles"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 4314c4f..2da0b81 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth de baixo consumo (audio): Non"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Desactiva a función de audio por Bluetooth de baixo consumo se o dispositivo é compatible coas funcións do hardware de audio de baixo consumo."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Botón Audio de baixo consumo en detalles"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Sortear lista de entidades permitidas para o audio por Bluetooth de baixo consumo"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Usa o audio de baixo consumo de forma predeterminada mesmo no caso de que non se verificase se o seu dispositivo periférico cumpre os criterios da lista de entidades permitidas."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivos multimedia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivos de chamada"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Outros dispositivos"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivos gardados"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Asociado coa conta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Utilizouse anteriormente coa conta"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Activarase o Bluetooth para permitir a vinculación"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferencias de conexión"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Conectados anteriormente"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escribir en campos de texto"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorar todas as presións de botóns do lapis óptico"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Lapis óptico"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Uso compartido do audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Compartir audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Chamadas e alarmas"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Data e hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Borrar"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espazo privado"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Oculta as aplicacións nun cartafol privado"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloquear mediante o bloqueo de pantalla"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostrar espazo privado"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ocultar cando estea bloqueado"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ocultar o espazo privado cando estea bloqueado"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Para que non saiban que o espazo privado está no teu dispositivo, ocúltao na lista de aplicacións"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Acceso ao espazo privado cando está oculto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Escribe \"espazo privado\" na barra de busca"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Toca o atallo do espazo privado"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloquea o espazo privado"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Opción desactivada"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Opción activada"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Crear espazo privado"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Eliminar espazo privado"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Non se puido crear o espazo privado"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Eliminouse correctamente o espazo privado"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Non se puido eliminar o espazo privado"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Definir un bloqueo de pantalla"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para usar o espazo privado, define un bloqueo de pantalla."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Definir bloqueo de pantalla"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancelar"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancelar"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configurar"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurar o espazo privado"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Oculta as aplicacións privadas nun espazo seguro ao que só ti poidas acceder"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Como funciona?"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Podes acceder ao espazo privado desde a parte inferior da túa lista de aplicacións"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"As aplicacións do espazo privado están protexidas cun bloqueo"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Cando o espazo privado está bloqueado, ocúltanse as notificacións das súas aplicacións"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"As aplicacións do espazo privado non aparecerán no xestor de permisos, no panel de privacidade nin noutras opcións de configuración cando o espazo privado estea bloqueado"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configurando espazo privado…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"O espazo privado está protexido por un bloqueo"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"A información de uso das aplicacións do espazo privado ocúltase cando está bloqueado"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accede ao espazo privado desde a lista de aplicacións"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Produciuse un erro ao configurar o espazo privado"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Téntao de novo agora ou volve máis tarde"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Tentar de novo"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Queres usar bloqueo de pantalla para desbloquear?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Podes desbloquear o espazo privado do mesmo xeito que fas co teu dispositivo ou elixir outro bloqueo"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usar bloqueo de pantalla"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Elixir outro bloqueo"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Todo listo"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para acceder ao espazo privado, pasa o dedo cara arriba desde a parte inferior da pantalla de inicio e desprázate cara abaixo"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Feito"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Desprázate cara abaixo para acceder ao espazo privado"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Podes engadir ata <xliff:g id="COUNT">%d</xliff:g> impresións dixitais"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Engadiches o número máximo de impresións dixitais"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Non se poden engadir máis impresións dixitais"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Seguir usando aplicacións co dispositivo pregado"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Pantalla fluída"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Incrementa automaticamente a frecuencia de actualización de 60 a <xliff:g id="ID_1">%1$s</xliff:g> Hz en determinados tipos de contido. Aumenta o uso da batería."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Incrementa automaticamente a frecuencia de actualización ata <xliff:g id="ID_1">%1$d</xliff:g> Hz en determinados tipos de contido. Aumenta o uso da batería."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forzar taxa de actualización máxima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"A taxa de actualización máis alta para mellorar a resposta táctil e a calidade das animacións. Aumenta o uso da batería."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atención á pantalla"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Opcións de configuración comúns"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editar punto de acceso"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Sen configurar"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Sen configurar"</string>
<string name="apn_name" msgid="6677695784108157953">"Nome"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Utilizar o botón de accesibilidade para abrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mantén premidas as teclas de volume para abrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Toca tres veces a pantalla para abrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Toca a pantalla tres veces con dous dedos para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Utilizar un xesto para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usa o xesto de accesibilidade"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Toca o botón Accesibilidade <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> na parte inferior da pantalla para utilizar esta función.\n\nPara cambiar de función, mantén premido o botón Accesibilidade."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para utilizar esta función, toca na pantalla o botón Accesibilidade."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Mantén premidas as dúas teclas de volume para utilizar esta función."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para iniciar e deter a ampliación, toca tres veces en calquera parte da pantalla."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para iniciar e deter a ampliación, toca tres veces en calquera parte da pantalla con dous dedos."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Pasa 2 dedos cara arriba desde a parte inferior da pantalla para utilizar esta función.\n\nPara cambiar de función, pasa 2 dedos cara arriba e mantén premida a pantalla."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Pasa 3 dedos cara arriba desde a parte inferior da pantalla para utilizar esta función.\n\nPara cambiar de función, pasa 3 dedos cara arriba e mantén premida a pantalla."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Pasa 2 dedos cara arriba desde a parte inferior da pantalla para utilizar unha función de accesibilidade.\n\nPara cambiar de función, pasa 2 dedos cara arriba e mantén premida a pantalla."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Manter premidas as teclas de volume"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"manter premidas as teclas de volume"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Mantén premidas as dúas teclas de volume."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Toque triplo na pantalla con dous dedos"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"toque triplo na pantalla con dous dedos"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Toca a pantalla rapidamente {0,number,integer} veces con dous dedos"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tres toques na pantalla"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tocar tres veces a pantalla"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Toca a pantalla {0,number,integer} veces rapidamente. Este atallo pode reducir a velocidade do dispositivo"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Utilizar vibración e tecnoloxía háptica"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibración das alarmas"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibración do contido multimedia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibración do teclado"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibración do ton"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibración das notificacións"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Reacción aos toques"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Si limitas a actividade en segundo plano para unha aplicación, é posible que non funcione correctamente"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Non podes limitar a aplicación porque non se configurou para optimizar a batería.\n\nPrimeiro activa a optimización da batería."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Xestionar o uso da batería"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sen restricións"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizado"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restrinxido"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tamaño do texto, letra grande, tipo de letra grande, texto grande, visión reducida, agrandar texto, función para aumentar o tamaño da letra, aumento do tamaño da letra"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"pantalla en suspensión sempre acendida, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiqueta, lector"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclado, tecnoloxía háptica, vibrar,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibración, Non molestar"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume dos elementos multimedia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume da emisión"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Permitir xestionar todos os ficheiros"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permite que esta aplicación lea, modifique e elimine todos os ficheiros deste dispositivo ou de calquera unidade de almacenamento conectada. Se lle dás permiso, a aplicación poderá acceder aos ficheiros sen que se che notifique explicitamente."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Poden acceder a todos os ficheiros"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificacións en pantalla completa"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permitir notificacións en pantalla completa procedentes desta aplicación"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permite que esta aplicación amose notificacións en pantalla completa cando o dispositivo estea bloqueado. A aplicación pode usar esta opción para destacar alarmas, chamadas entrantes ou outras notificacións urxentes."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"As aplicacións que teñas instaladas poderán consultar o nome do teu dispositivo. Tamén poderán velo outros usuarios cando te conectes a dispositivos Bluetooth ou a redes wifi, así como cando configures zonas wifi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Xénero gramatical"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Seleccionar o xénero gramatical"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Buscando aplicacións enganosas"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Revisa a actividade das aplicacións para detectar phishing"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usar análise"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usar análise en aplicacións do traballo"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 78aa6e1..336205b 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"બ્લૂટૂથ LE ઑડિયો બંધ કરો"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"જો ડિવાઇસ LE ઑડિયો હાર્ડવેર ક્ષમતાઓને સપોર્ટ કરતું હોય, તો બ્લૂટૂથ LE ઑડિયો સુવિધા બંધ કરે છે."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ડિવાઇસની વિગતોમાં LE ઑડિયો ટૉગલ બતાવો"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"બ્લૂટૂથ LE ઑડિયો માટેની વ્હાઇટલિસ્ટને બાયપાસ કરો"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"વ્હાઇટલિસ્ટના માપદંડનું પાલન કરવા માટે LE ઑડિયો પેરિફેરલની ચકાસણી કરવામાં આવી ન હોય, તો પણ ડિફૉલ્ટ તરીકે LE ઑડિયોનો ઉપયોગ કરો."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"મીડિયા ડિવાઇસ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"કૉલ ડિવાઇસ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"અન્ય ડિવાઇસ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"સાચવેલા ડિવાઇસ"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"એકાઉન્ટ સાથે સંકળાયેલું"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"અગાઉ એકાઉન્ટ સાથે વાપરેલું"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"બ્લૂટૂથ જોડી બનાવવાનું ચાલુ કરશે"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"કનેક્શનની પસંદગીઓ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"પહેલાં કનેક્ટ કરેલા"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ટેક્સ્ટ ફીલ્ડમાં લખો"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"તમામ સ્ટાઇલસ બટન દબાવવાને અવગણો"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"સ્ટાઇલસ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ઑડિયો શેરિંગ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ઑડિયો શેર કરો"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"કૉલ અને અલાર્મ"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE ઑડિયો સ્ટ્રીમ સાથે કનેક્ટ કરો"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"નજીકના ઑડિયો સ્ટ્રીમ"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ઑડિયો સ્ટ્રીમ"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR કોડનો ઉપયોગ કરીને કોઈ ઑડિયો સ્ટ્રીમ સાથે કનેક્ટ કરો"</string>
<string name="date_and_time" msgid="1788358029823431692">"તારીખ અને સમય"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"પ્રૉક્સી"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"સાફ કરો"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ખાનગી સ્પેસ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ખાનગી ફોલ્ડરમાં ઍપ છુપાવો"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"સ્ક્રીન લૉકનો ઉપયોગ કરીને અનલૉક કરો"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ખાનગી સ્પેસ બતાવો"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"લૉક કરેલી હોય, ત્યારે છુપાવો"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ખાનગી સ્પેસ લૉક કરેલી હોય, ત્યારે છુપાવો"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ડિવાઇસની ખાનગી સ્પેસ અન્યોથી છુપાવવા તેને ઍપની સૂચિથી છુપાવો"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"છુપાવેલી હોય, ત્યારે પણ ખાનગી સ્પેસ ઍક્સેસ કરો"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"શોધ બારમાં \'ખાનગી સ્પેસ\' શોધો"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ખાનગી સ્પેસ ટાઇલ પર ટૅપ કરો"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"તમારી ખાનગી સ્પેસ અનલૉક કરો"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"બંધ છે"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ચાલુ છે"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"સિસ્ટમ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ખાનગી સ્પેસ બનાવો"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ખાનગી સ્પેસ ડિલીટ કરી"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ખાનગી સ્પેસ બનાવી શકાઈ નથી"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ખાનગી સ્પેસ સફળતાપૂર્વક ડિલીટ કરી"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ખાનગી સ્પેસ ડિલીટ કરી શકાઈ નથી"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"કોઈ સ્ક્રીન લૉક સેટ કરો"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ખાનગી સ્પેસનો ઉપયોગ કરવા, આ ડિવાઇસ પર સ્ક્રીન લૉક સેટ કરો."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"સ્ક્રીન લૉક સેટ કરો"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"રદ કરો"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"રદ કરો"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"સેટઅપ કરો"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ખાનગી સ્પેસનું સેટઅપ કરો"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"માત્ર તમે ઍક્સેસ કરી શકો એવી કોઈ સુરક્ષિત સ્પેસમાં ખાનગી ઍપ છુપાવો"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"તેની કામ કરવાની રીત"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"તમે તમારી ઍપની સૂચિમાં સૌથી નીચેથી ખાનગી સ્પેસ ઍક્સેસ કરી શકશો"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ખાનગી સ્પેસમાંની ઍપ કોઈ લૉક વડે સુરક્ષિત રાખવામાં આવે છે"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"જ્યારે ખાનગી સ્પેસ લૉક કરવામાં આવી હોય, ત્યારે ખાનગી સ્પેસ સંબંધિત ઍપના નોટિફિકેશન છુપાવવામાં આવે છે"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"જ્યારે ખાનગી સ્પેસ લૉક કરવામાં આવી હોય, ત્યારે પરવાનગી મેનેજર, પ્રાઇવસી ડૅશબોર્ડ અને અન્ય સેટિંગમાં ખાનગી સ્પેસ સંબંધી ઍપ દેખાશે નહીં"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"ખાનગી સ્પેસનું સેટઅપ કરી રહ્યાં છીએ…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"કોઈ લૉક વડે ખાનગી સ્પેસ સુરક્ષિત રાખવામાં આવે છે"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"જ્યારે ખાનગી સ્પેસ લૉક કરવામાં આવી હોય, ત્યારે તેમાં રહેલી ઍપના વપરાશની માહિતી છુપાવવામાં આવે છે"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"તમારી ઍપની સૂચિમાંથી ખાનગી સ્પેસ ઍક્સેસ કરો"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ખાનગી સ્પેસનું સેટઅપ કરી શકાતું નથી"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"હમણાં ફરીથી પ્રયાસ કરો અથવા થોડા સમય પછી પાછા આવો"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ફરી પ્રયાસ કરો"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"શું અનલૉક કરવા માટે, સ્ક્રીન લૉકનો ઉપયોગ કરીએ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"તમે તમારા ડિવાઇસને જે રીતે અનલૉક કરો છો તે જ રીતે તમે ખાનગી સ્પેસને અનલૉક કરી શકો છો અથવા કોઈ અલગ લૉક પસંદ કરી શકો છો"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"નવું લૉક પસંદ કરો"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"બધું સેટ થઈ ગયું!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ખાનગી સ્પેસ ઍક્સેસ કરવા માટે, તમારી હોમ સ્ક્રીનની સૌથી નીચેથી ઉપર તરફ સ્વાઇપ કરો, પછી નીચે સ્ક્રોલ કરો"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"થઈ ગયું"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"ખાનગી સ્પેસને ઍક્સેસ કરવા માટે નીચે સ્ક્રોલ કરો"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"તમે <xliff:g id="COUNT">%d</xliff:g> જેટલી ફિંગરપ્રિન્ટ ઉમેરી શકો છો"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"તમે મહત્તમ ફિંગરપ્રિન્ટ્સ ઉમેર્યા છે"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"વધુ ફિંગરપ્રિન્ટ્સ ઉમેરી શકતાં નથી"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ફોલ્ડ હોવા પર ઍપનો ઉપયોગ કરવાનું ચાલુ રાખો"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"અમુક કન્ટેન્ટ માટે રિફ્રેશ થવાનો રેટ ઑટોમૅટિક રીતે 60થી વધારીને <xliff:g id="ID_1">%1$s</xliff:g> Hz કરે છે. બૅટરીના વપરાશમાં વધારો કરે છે."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"અમુક કન્ટેન્ટ માટે રિફ્રેશ થવાનો રેટ ઑટોમૅટિક રીતે <xliff:g id="ID_1">%1$d</xliff:g> Hz સુધી વધે છે. બૅટરીના વપરાશમાં વધારો કરે છે."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"રિફ્રેશ થવાનો રેટ ફરજિયાત પણે મહત્તમ લેવલે કરો"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"સ્પર્શના પ્રતિભાવમાં સુધારણા અને ઍનિમેશનની ક્વૉલિટી માટે ઉચ્ચતમ રિફ્રેશ રેટ. આ સુવિધા બૅટરીનો વપરાશ વધારે છે."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"સ્ક્રીન અટેન્શન"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"કૉમ્યુનલ સેટિંગ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"અૅક્સેસ પૉઇન્ટમાં ફેરફાર કરો"</string>
+ <string name="apn_add" msgid="9069613192201630934">"ઍક્સેસ પૉઇન્ટ ઉમેરો"</string>
<string name="apn_not_set" msgid="8246646433109750293">"સેટ નથી"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"સેટ નથી"</string>
<string name="apn_name" msgid="6677695784108157953">"નામ"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ખોલવા માટે ઍક્સેસિબિલિટી બટનનો ઉપયોગ કરો"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"ખોલવા માટે વૉલ્યૂમ કીને દબાવી રાખો"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ખોલવા માટે સ્ક્રીનને ત્રણ વાર ટૅપ કરો"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ખોલવા માટે, સ્ક્રીન પર બે આંગળી વડે ત્રણ વાર ટૅપ કરો"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ખોલવા માટે સંકેતનો ઉપયોગ કરો"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ઍક્સેસિબિલિટી સંકેતનો ઉપયોગ કરો"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"આ સુવિધાનો ઉપયોગ કરવા માટે, તમારી સ્ક્રીનમાં નીચેની બાજુએ રહેલા ઍક્સેસિબિલિટી બટન <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>ને ટૅપ કરો.\n\nકોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, ઍક્સેસિબિલિટી બટનને ટચ કરીને થોડીવાર દબાવી રાખો."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"આ સુવિધાનો ઉપયોગ કરવા માટે, તમારી સ્ક્રીન પરના ઍક્સેસિબિલિટી બટનને ટૅપ કરો."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"આ સુવિધાનો ઉપયોગ કરવા માટે, વૉલ્યૂમની બન્ને કીને દબાવી રાખો."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"મોટું કરવાનું શરૂ કરવા અને બંધ કરવા માટે, તમારી સ્ક્રીન પર ગમે-ત્યાં ત્રણ વાર ટૅપ કરો."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"મોટું કરવાનું શરૂ અને બંધ કરવા માટે, બે આંગળી વડે તમારી સ્ક્રીન પર ગમે ત્યાં ત્રણ વાર ટૅપ કરો."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"આ સુવિધાનો ઉપયોગ કરવા માટે, 2 આંગળી વડે સ્ક્રીનની નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરો.\n\nકોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, 2 આંગળી વડે ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"આ સુવિધાનો ઉપયોગ કરવા માટે, 3 આંગળી વડે સ્ક્રીનની નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરો.\n\nકોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, 3 આંગળી વડે ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"કોઈ ઍક્સેસિબિલિટી સુવિધાનો ઉપયોગ કરવા માટે, 2 આંગળી વડે સ્ક્રીનની નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરો.\n\nકોઈ એક સુવિધાથી બીજી સુવિધા પર સ્વિચ કરવા માટે, 2 આંગળી વડે ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"વૉલ્યૂમ કી દબાવી રાખો"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"વૉલ્યૂમ કી દબાવી રાખો"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"વૉલ્યૂમની બન્ને કીને દબાવી રાખો"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"સ્ક્રીન પર બે આંગળી વડે ત્રણ વાર ટૅપ કરો"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"સ્ક્રીન પર બે આંગળી વડે ત્રણ વાર ટૅપ કરો"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"બે આંગળી વડે સ્ક્રીન પર ઝડપથી {0,number,integer} વાર ટૅપ કરો"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"સ્ક્રીનને ત્રણ વાર ટૅપ કરો"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"સ્ક્રીનને ત્રણ વાર ટૅપ કરો"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ઝડપથી સ્ક્રીન પર {0,number,integer} વાર ટૅપ કરો. આ શૉર્ટકટ તમારા ડિવાઇસને ધીમું કરી શકે છે"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"વાઇબ્રેશન અને હેપ્ટિકનો ઉપયોગ કરો"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"અલાર્મ વાઇબ્રેશન"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"મીડિયા વાઇબ્રેશન"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"કીબોર્ડ માટે વાઇબ્રેશન"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"રિંગ વાઇબ્રેશન"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"નોટિફિકેશન વાઇબ્રેશન"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"પ્રતિસાદને ટચ કરો"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"જો તમે બૅકગ્રાઉન્ડ પ્રવૃત્તિને એક ઍપ માટે મર્યાદિત કરો છો, તો તે અયોગ્ય વર્તન કરી શકે છે"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"આ ઍપ બૅટરી ઑપ્ટિમાઇઝ કરવા સેટ નથી તેથી તમે તેને પ્રતિબંધિત કરી શકશો નહીં.\n\nએને પ્રતિબંધિત કરવા, પહેલાં બૅટરી ઑપ્ટિમાઇઝ કરવાનું ચાલુ કરો."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"બૅટરીનો વપરાશ મેનેજ કરો"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"બૅકગ્રાઉન્ડમાં ઉપયોગ કરવાની મંજૂરી આપો"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"રિઅલ-ટાઇમ અપડેટ માટે, બૅકગ્રાઉન્ડમાં ઉપયોગ કરવાની સુવિધા ચાલુ કરો, બૅટરી બચાવવા તેને બંધ કરો"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"અમર્યાદિત"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ઑપ્ટિમાઇઝ કરેલો"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"પ્રતિબંધિત"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ટેક્સ્ટનું કદ, મોટી પ્રિન્ટ, મોટા ફૉન્ટ, મોટી ટેક્સ્ટ, ઓછું વિઝન, ટેક્સ્ટને મોટી બનાવો, ફૉન્ટ મોટા બનાવનાર, ફૉન્ટની વૃદ્ધિ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"હંમેશાં ચાલુ રહેતું ઍમ્બિઅન્ટ ડિસ્પ્લે, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ટૅગ, રીડર"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"કીબોર્ડ, હેપ્ટિક, વાઇબ્રેટ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"વૉલ્યૂમ, વાઇબ્રેશન, ખલેલ પાડશો નહીં"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"મીડિયા વૉલ્યૂમ"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"કાસ્ટનું વૉલ્યૂમ"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"બધી ફાઇલોને મેનેજ કરવા ઍક્સેસની મંજૂરી આપો"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"આ ઍપને આ ડિવાઇસ અથવા કોઈપણ કનેક્ટેડ સ્ટોરેજ વૉલ્યૂમ પરની બધી ફાઇલો વાંચવા, ફેરફાર કરવા અને ડિલીટ કરવાની મંજૂરી આપો. જો મંજૂરી આપવામાં આવે, તો ઍપ તમને જાણ કર્યા વિના ફાઇલોને ઍક્સેસ કરી શકે છે."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"બધી ફાઇલો ઍક્સેસ કરી શકે છે"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"પૂર્ણ સ્ક્રીનના નોટિફિકેશન"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"આ ઍપમાંથી પૂર્ણ સ્ક્રીનના નોટિફિકેશનને મંજૂરી આપો"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"જ્યારે ડિવાઇસ લૉક કરેલું હોય, ત્યારે આ ઍપને પૂર્ણ સ્ક્રીનમાં નોટિફિકેશન બતાવવાની મંજૂરી આપો. ઍપ આનો ઉપયોગ અલાર્મ, ઇનકમિંગ કૉલ અથવા અન્ય તાકીદના નોટિફિકેશન હાઇલાઇટ કરવા માટે કરી શકે છે."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ફિશિંગ માટે ઍપ પ્રવૃત્તિ ચેક કરો"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"સ્કૅનિંગનો ઉપયોગ કરો"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ઑફિસ માટેની ઍપ માટે સ્કૅનિંગનો ઉપયોગ કરો"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"ફિશિંગ અથવા અન્ય છેતરામણા વર્તન માટે ઍપ પ્રવૃત્તિ ચેક કરીને, સ્કૅનિંગ સીધા તમારા ડિવાઇસ પર ખાનગી રીતે ચલાવવામાં આવે છે. જો તેની ભાળ મળે, તો જોખમને કન્ફર્મ કરવા અને ઍપના વપરાશકર્તાઓને ચેતવણી આપવા માટે ઍપની કેટલીક માહિતી Google Play Protectને મોકલવામાં આવે છે."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"આ સુરક્ષિત કરેલી સુરક્ષા સંબંધિત સુવિધા છે. Google સાથે ડિવાઇસની કે વ્યક્તિગત માહિતી શેર કરવામાં આવતી નથી. \n\nફિશિંગ એ સાઇન ઇન માટેની વિગતો અથવા અન્ય વ્યક્તિગત માહિતી ચોરવાનો પ્રયાસ છે."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 02fe6fa..0e3907b 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"\'ब्लूटूथ LE Audio\' को बंद करें"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"अगर डिवाइस पर LE Audio हार्डवेयर चलता है, तो \'ब्लूटूथ LE Audio\' को बंद करें."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"डिवाइस डिटेल में LE Audio टॉगल दिखाएं"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ब्लूटूथ LE Audio के लिए, जिन लोगों या संगठनों को अनुमति मिली है उनकी सूची बायपास करें"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"डिफ़ॉल्ट रूप से LE Audio का इस्तेमाल करें. भले ही, जिन लोगों या संगठनों को अनुमति मिली है उनकी सूची में शामिल करने के लिए, LE Audio के साथ काम करने वाले डिवाइस की पुष्टि न की गई हो."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"मीडिया डिवाइस"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"कॉल की सुविधा वाले डिवाइस"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"दूसरे डिवाइस"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"सेव किए गए डिवाइस"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"इस खाते से जुड़े डिवाइस"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"डिवाइस को इस खाते से पहले भी कनेक्ट किया गया है"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"दूसरे डिवाइस से जुड़ने के लिए ब्लूटूथ चालू हो जाएगा"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"कनेक्शन की सेटिंग"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"पहले कनेक्ट किए गए डिवाइस"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"टेक्स्ट फ़ील्ड में कुछ लिखें"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"स्टाइलस के बटन के सभी इनपुट को नज़रअंदाज़ करें"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"स्टाइलस"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ऑडियो शेयर करने की सुविधा"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ऑडियो शेयर करें"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"कॉल और अलार्म"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE Audio स्ट्रीम से कनेक्ट करें"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"आस-पास होने वाली ऑडियो स्ट्रीम"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ऑडियो स्ट्रीम"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"क्यूआर कोड का इस्तेमाल करके ऑडियो स्ट्रीम से कनेक्ट करें"</string>
<string name="date_and_time" msgid="1788358029823431692">"तारीख और समय"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"प्रॉक्सी"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"साफ़ करें"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"प्राइवेट स्पेस"</string>
<string name="private_space_summary" msgid="8237652417163408001">"प्राइवेट फ़ोल्डर में ऐप्लिकेशन छिपाएं"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"अनलॉक करने के लिए, स्क्रीन लॉक का इस्तेमाल करें"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"प्राइवेट स्पेस दिखाएं"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"लॉक होने पर छिपाएं"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"लॉक होने पर प्राइवेट स्पेस छिपाएं"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"डिवाइस पर प्राइवेट स्पेस छिपाने के लिए, अपने ऐप्लिकेशन सूची से इसे छिपाएं"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"छिपाए जाने पर प्राइवेट स्पेस ऐक्सेस करें"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"खोज बार में \'प्राइवेट स्पेस\' को खोजें"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"प्राइवेट स्पेस के टाइल पर टैप करें"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"अपना प्राइवेट स्पेस अनलॉक करें"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"बंद है"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"चालू है"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"सिस्टम"</string>
<string name="private_space_create_title" msgid="47273568884806726">"प्राइवेट स्पेस बनाएं"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"प्राइवेट स्पेस मिटाएं"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"प्राइवेट स्पेस नहीं बनाया जा सका"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"प्राइवेट स्पेस को मिटा दिया गया है"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"प्राइवेट स्पेस को मिटाया नहीं जा सका"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"स्क्रीन लॉक सेट करें"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"डिवाइस पर स्क्रीन लॉक सेट करके प्राइवेट स्पेस इस्तेमाल करें."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"स्क्रीन लॉक सेट करें"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"अभी नहीं"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"रद्द करें"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"सेट अप करें"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"प्राइवेट स्पेस सेट अप करें"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"निजी ऐप्लिकेशन को उस सुरक्षित स्पेस में छिपाएं जिसका ऐक्सेस सिर्फ़ आपके पास हो"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"यह सुविधा कैसे काम करती है"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ऐप्लिकेशन की सूची के नीचे मौजूद प्राइवेट स्पेस को ऐक्सेस किया जा सकता है"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"लॉक के ज़रिए, प्राइवेट स्पेस में ऐप्लिकेशन सुरक्षित रखे जाते हैं"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"लॉक होने पर, प्राइवेट स्पेस में ऐप्लिकेशन की सूचनाएं छिपी रहती हैं"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"प्राइवेट स्पेस लॉक होने पर, प्राइवेट स्पेस के ऐप्लिकेशन अनुमतियों को मैनेज करने की सेटिंग, प्राइवसी डैशबोर्ड, और अन्य सेटिंग में नहीं दिखेंगे"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"प्राइवेट स्पेस सेट अप किया जा रहा है…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"लॉक के ज़रिए, प्राइवेट स्पेस सुरक्षित रखा जाता है"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"लॉक होने पर, प्राइवेट स्पेस वाले ऐप्लिकेशन के इस्तेमाल से जुड़ी जानकारी छिपा दी जाती है"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ऐप्लिकेशन की सूची से प्राइवेट स्पेस को ऐक्सेस करें"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"प्राइवेट स्पेस को सेट अप नहीं किया जा सका"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"फिर से कोशिश करें या बाद में करके देखें"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"फिर से कोशिश करें"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"अनलॉक करने के लिए स्क्रीन लॉक का इस्तेमाल करना है?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"डिवाइस की तरह ही प्राइवेट स्पेस को अनलॉक किया जा सकता है या कोई दूसरा लॉक सेट किया जा सकता है"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"स्क्रीन लॉक का इस्तेमाल करें"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"नया लॉक चुनें"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"हो गया!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"प्राइवेट स्पेस को ऐक्सेस करने के लिए, होम स्क्रीन पर नीचे से ऊपर की ओर स्वाइप करें. इसके बाद, नीचे की ओर स्क्रोल करें"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"हो गया"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"प्राइवेट स्पेस ऐक्सेस करने के लिए नीचे की ओर स्क्रोल करें"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"ज़्यादा से ज़्यादा <xliff:g id="COUNT">%d</xliff:g> फ़िंगरप्रिंट जोड़े जा सकते हैं"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"आप अधिकतम संख्या में फ़िंगरप्रिंट जोड़ चुके हैं"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"और ज़्यादा फ़िंगरप्रिंट नहीं जोड़े जा सकते"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"फ़ोल्ड करने पर भी, ऐप्लिकेशन का इस्तेमाल जारी रखें"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"स्मूद डिसप्ले"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"कुछ कॉन्टेंट के लिए, यह अपने-आप ही रीफ़्रेश दर को 60 से बढ़ाकर <xliff:g id="ID_1">%1$s</xliff:g> हर्ट्ज़ कर देता है. इसे चालू करने पर, बैटरी ज़्यादा खर्च होती है."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"इस सेटिंग को चालू करने पर, कुछ कॉन्टेंट के लिए रीफ़्रेश दर अपने-आप <xliff:g id="ID_1">%1$d</xliff:g> हर्ट्ज़ तक बढ़ जाती है. इसमें ज़्यादा बैटरी खर्च होती है."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"रीफ़्रेश दर को सबसे ज़्यादा पर सेट करें"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"रीफ़्रेश होने की सबसे ज़्यादा दर जिसके लागू होने के बाद छूकर की जाने वाली कार्रवाइयां तेज़ हो जाती हैं. साथ ही, ऐनिमेशन की क्वालिटी बेहतर हो जाती है. इसमें बैटरी ज़्यादा खर्च होती है."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"स्क्रीन चालू रखने की सुविधा"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"कम्यूनिटी सेटिंग"</string>
<string name="apn_settings" msgid="4295467389400441299">"ऐक्सेस पॉइंट नाम"</string>
<string name="apn_edit" msgid="2003683641840248741">"ऐक्सेस पॉइंट में बदलाव करें"</string>
+ <string name="apn_add" msgid="9069613192201630934">"ऐक्सेस पॉइंट जोड़ें"</string>
<string name="apn_not_set" msgid="8246646433109750293">"सेट नहीं है"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"सेट नहीं है"</string>
<string name="apn_name" msgid="6677695784108157953">"नाम"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"इसे खोलने के लिए सुलभता बटन का इस्तेमाल करें"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"खोलने के लिए, आवाज़ वाले दोनों बटन दबाकर रखें"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"खोलने के लिए स्क्रीन पर तीन बार टैप करें"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"खोलने के लिए, स्क्रीन पर दो उंगलियों से तीन बार टैप करें"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"इसे खोलने के लिए हाथ के जेस्चर का इस्तेमाल करें"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"सुलभता से जुड़े हाथ के जेस्चर का इस्तेमाल करें"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"इस सुविधा का इस्तेमाल करने के लिए, स्क्रीन पर सबसे नीचे मौजूद सुलभता बटन <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> पर टैप करें.\n\nएक सुविधा से दूसरी सुविधा पर जाने के लिए, सुलभता बटन को दबाकर रखें."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"इस सुविधा का इस्तेमाल करने के लिए, स्क्रीन पर मौजूद सुलभता बटन पर टैप करें."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"इस सुविधा का इस्तेमाल करने के लिए, आवाज़ वाले दोनों बटन दबाकर रखें."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ज़ूम करने की सुविधा को शुरू और बंद करने के लिए, स्क्रीन पर कहीं भी तीन बार टैप करें."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ज़ूम करने की सुविधा को शुरू और बंद करने के लिए, स्क्रीन पर कहीं भी दो उंगलियों से तीन बार टैप करें."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"इस सुविधा का इस्तेमाल करने के लिए, स्क्रीन पर नीचे से ऊपर की ओर, दो उंगलियों से स्वाइप करें.\n\nएक सुविधा से दूसरी सुविधा पर जाने के लिए, दो उंगलियों से ऊपर की ओर स्वाइप करें और स्क्रीन को थोड़ी देर दबाकर रखें."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"इस सुविधा का इस्तेमाल करने के लिए, स्क्रीन पर नीचे से ऊपर की ओर, तीन उंगलियों से स्वाइप करें.\n\nएक सुविधा से दूसरी सुविधा पर जाने के लिए, दो उंगलियों से ऊपर की ओर स्वाइप करें और स्क्रीन को थोड़ी देर दबाकर रखें."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"सुलभता सुविधा का इस्तेमाल करने के लिए, स्क्रीन पर नीचे से ऊपर की ओर, दो उंगलियों से स्वाइप करें.\n\nएक सुविधा से दूसरी सुविधा पर जाने के लिए, दो उंगलियों से ऊपर की ओर स्वाइप करें और स्क्रीन को थोड़ी देर दबाकर रखें."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"आवाज़ वाले बटन दबाकर रखें"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"आवाज़ कम-ज़्यादा करने वाले दोनों बटन दबाकर रखें"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"आवाज़ वाले दोनों बटन दबाकर रखें"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"स्क्रीन पर दो उंगलियों से तीन बार टैप करें"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"स्क्रीन पर दो उंगलियों से तीन बार टैप करें"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"स्क्रीन पर तुरंत दो उंगलियों से {0,number,integer} बार टैप करें"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"स्क्रीन पर तीन बार टैप करें"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"स्क्रीन पर तीन बार टैप करें"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"स्क्रीन पर जल्दी-जल्दी {0,number,integer} बार टैप करें. इस शॉर्टकट के इस्तेमाल से आपके डिवाइस की रफ़्तार धीमी हो सकती है"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"वाइब्रेशन और हैप्टिक का इस्तेमाल करें"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"अलार्म के लिए वाइब्रेशन"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"मीडिया के लिए वाइब्रेशन"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"कीबोर्ड के लिए वाइब्रेशन"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"रिंग के लिए वाइब्रेशन"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"सूचना के लिए वाइब्रेशन"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"टच के लिए वाइब्रेशन"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"अगर आप ऐप की बैकग्राउंड गतिविधि को सीमित करते हैं, तो हो सकता है यह ठीक ढंग से काम न करे"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ऐप्लिकेशन पर रोक नहीं लगेगी क्योंकि यह बैटरी ऑप्टिमाइज़ नहीं कर सकता.\n\nबैटरी ऑप्टिमाइज़ेशन चालू करके ही ऐसा हो सकता है."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"बैटरी खर्च को मैनेज करें"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"\'ऐप्लिकेशन को बैकग्राउंड में चलने\' की सुविधा को चालू करें"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"रीयल-टाइम अपडेट पाने के लिए, \'ऐप्लिकेशन को बैकग्राउंड में चलने\' की सुविधा चालू करें और बैटरी बचाने के लिए इस सुविधा को बंद करें"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"कोई पाबंदी नहीं"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ऑप्टिमाइज़ की गई सेटिंग"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"पाबंदी लगी है"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"टेक्स्ट का साइज़, बड़ा प्रिंट, बड़ा फ़ॉन्ट, बड़ा टेक्स्ट, कम दृष्टि, टेक्स्ट बड़ा करना, फ़ॉन्ट बड़ा करने वाला टूल, फ़ॉन्ट बड़ा करना"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"हमेशा चालू रहने वाला ऐंबियंट डिसप्ले, एओडी"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"एनएफ़सी, टैग, रीडर"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"कीबोर्ड, हैप्टिक, वाइब्रेट,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"आवाज़, वाइब्रेशन, परेशान न करें"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"मीडिया की आवाज़"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"आवाज़ कास्ट करें"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"सभी फ़ाइलों को मैनेज करने की अनुमति दें"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"इस ऐप्लिकेशन को अनुमति दें, ताकि वह इस डिवाइस और इससे जुड़े स्टोरेज पर मौजूद फ़ाइलों को पढ़ सके, उनमें बदलाव कर सके, और उन्हें मिटा सके. अनुमति दिए जाने पर, यह ऐप्लिकेशन आपको सूचना दिए बिना फ़ाइलों को ऐक्सेस कर सकता है."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"सभी फ़ाइलें ऐक्सेस कर सकते हैं"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"फ़ुल स्क्रीन पर दिखने वाली सूचनाएं"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"इस ऐप्लिकेशन से सूचनाओं को फ़ुल स्क्रीन में दिखाने की अनुमति दें"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"इस ऐप्लिकेशन को, डिवाइस लॉक होने पर सूचनाओं को फ़ुल स्क्रीन पर दिखाने की अनुमति दें. ऐसा हो सकता है कि ऐप्लिकेशन इनका इस्तेमाल अलार्म, आने वाले (इनकमिंग) कॉल या अन्य ज़रूरी सूचनाओं को हाइलाइट करने के लिए करें."</string>
@@ -4086,7 +4140,7 @@
<string name="account_for_section_header" msgid="7466759342105251096">"<xliff:g id="USER_NAME">%1$s</xliff:g> के खाते"</string>
<string name="auto_sync_account_title" msgid="1070908045600374254">"ऐप्लिकेशन का डेटा अपने-आप सिंक होने की सुविधा चालू करें"</string>
<string name="auto_sync_account_summary" msgid="7580352130028957346">"ऐप्लिकेशन को डेटा अपने-आप रीफ्रे़श करने दें"</string>
- <string name="account_sync_title" msgid="7036067017433297574">"खाता सिंक"</string>
+ <string name="account_sync_title" msgid="7036067017433297574">"खाता सिंक करें"</string>
<string name="account_sync_summary_some_on" msgid="911460286297968724">"<xliff:g id="ID_2">%2$d</xliff:g> में से <xliff:g id="ID_1">%1$d</xliff:g> आइटम के लिए सिंक करने की सुविधा चालू है"</string>
<string name="account_sync_summary_all_on" msgid="2953682111836599841">"सभी आइटम के लिए सिंक करने की सुविधा चालू है"</string>
<string name="account_sync_summary_all_off" msgid="6378301874540507884">"सभी आइटम के लिए सिंक होने की सुविधा बंद है"</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"आपके इंस्टॉल किए गए ऐप्लिकेशन, आपके डिवाइस के नाम की जानकारी ऐक्सेस कर सकते हैं. इसके अलावा, ब्लूटूथ डिवाइसों या वाई-फ़ाई नेटवर्क से कनेक्ट करने पर या वाई-फ़ाई हॉटस्पॉट सेट अप करने पर, अन्य लोग भी इसे देख सकते हैं."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"व्याकरण के हिसाब से लिंग"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"व्याकरण के हिसाब से लिंग चुनें"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"ऐप्लिकेशन में धोखाधड़ी वाले व्यवहार का पता लगाने के लिए, स्कैनिंग की जा रही है"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"फ़िशिंग का पता लगाने के लिए, ऐप्लिकेशन में की गई गतिविधि की जांच करें"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"स्कैन करने की सुविधा इस्तेमाल करें"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"वर्क ऐप्लिकेशन के लिए स्कैन करने की सुविधा इस्तेमाल करें"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 5c78cb7..00ea6ff 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Onemogući Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Onemogućuje značajku Bluetooth LE audio ako uređaj podržava mogućnosti za LE audio hardvera."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Prikaži prekidač LE Audio u pojedinostima o uređaju"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Zaobilaženje popisa dopuštenih za Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Upotrebljavajte LE Audio prema zadanim postavkama čak i ako nije potvrđeno da LE Audio periferni uređaj ispunjava kriterije za popis dopuštenih."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medijski uređaji"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Uređaji za pozive"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Ostali uređaji"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Spremljeni uređaji"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Povezano s računom"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Prethodno korišteno s računom"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth će se uključiti radi uparivanja"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Postavke povezivanja"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Prethodno povezano"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Pisanje u tekstualnim poljima"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Zanemari sve pritiske pisaljke na gumb"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Pisaljka"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Dijeljenje audiozapisa"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Podijeli audiozapis"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Pozivi i alarmi"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Povežite se s audiostreamom LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Audiostreamovi u blizini"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audiostreamovi"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Povežite se s audiostreamom pomoću QR koda"</string>
<string name="date_and_time" msgid="1788358029823431692">"Datum i vrijeme"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Očisti"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privatni prostor"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Sakrivanje aplikacija u privatnoj mapi"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Otključavanje pomoću funkcije za zaključavanje zaslona"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Prikaz privatnog prostora"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Sakrij kada je zaključano"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Sakrivanje privatnog prostora kad je zaključan"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Privatni prostor možete sakriti s popisa aplikacija uređaja"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Pristup privatnom prostoru kad je sakriven"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Na traci za pretraživanje pretražite privatni prostor"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Dodirnite pločicu privatnog prostora"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Otključajte privatni prostor"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Isključeno"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Uključeno"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sustav"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Izrada privatnog prostora"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Brisanje privatnog prostora"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Privatni prostor nije moguće izraditi"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privatni prostor uspješno je izbrisan"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Privatni prostor nije moguće izbrisati"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Postavi zaključavanje zaslona"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Za upotrebu Privatnog prostora postavite zaključavanje."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Postavi zaključavanje zaslona"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Odustani"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Odustani"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Postavi"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Postavljanje privatnog prostora"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Sakrivanje privatnih aplikacija na sigurnom mjestu kojem samo vi možete pristupiti"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Kako to funkcionira"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Privatnom prostoru možete pristupiti s dna popisa aplikacija"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikacije u privatnom prostoru zaštićene su zaključavanjem"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Obavijesti aplikacija u privatnom prostoru sakrivene su kada je on zaključan"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikacije privatnog prostora neće se prikazati u Upravitelju dopuštenja, na nadzornoj ploči za privatnost i u drugim postavkama kada je privatni prostor zaključan"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"U tijeku je postavljanje privatnog prostora…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privatni prostor zaštićen je zaključavanjem"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Podaci o upotrebi za aplikacije privatnog prostora sakriveni su kad je privatni prostor zaključan"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Pristup privatnom prostoru s popisa aplikacija"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Postavljanje privatnog prostora nije uspjelo"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Pokušajte sada ili se vratite kasnije"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Pokušajte ponovno"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Koristiti zaključavanje zaslona za otključavanje?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Privatni prostor možete otključati na isti način kao što otključavate uređaj. Ili odaberite drugi način zaključavanja"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Upotreba zaključavanja zaslona"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Odaberite novi način otključavanja"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Sve je spremno!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Da biste pristupili privatnom prostoru, prijeđite prstom s dna zaslona prema gore, a zatim se pomaknite prema dolje"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Gotovo"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Pomaknite se prema dolje za pristup privatnom prostoru"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Maksimalni broj otisaka prstiju koji možete dodati: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Dodali ste maksimalan broj otisaka prstiju"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nije moguće dodati više otisaka prstiju"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Nastavak upotrebe aplikacija pri sklapanju"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Glatki prikaz"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatski povećava učestalost osvježavanja sa 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz za određeni sadržaj. Povećava potrošnju baterije."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatski povećava učestalost osvježavanja do <xliff:g id="ID_1">%1$d</xliff:g> Hz za određeni sadržaj. Povećava potrošnju baterije."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Prisilna maksimalna učestalost osvježavanja"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Najviša učestalost osvježavanja za poboljšano reagiranje na dodir i kvalitetu animacije. Povećava potrošnju baterije."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Pozornost na zaslonu"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Zajedničke postavke"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-ovi"</string>
<string name="apn_edit" msgid="2003683641840248741">"Uređivanje pristupne točke"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Dodajte pristupnu točku"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Nije postavljeno"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nije postavljeno"</string>
<string name="apn_name" msgid="6677695784108157953">"Naziv"</string>
@@ -1601,7 +1644,7 @@
<string name="screen_compatibility_label" msgid="7549658546078613431">"Kompatibilnost zaslona"</string>
<string name="permissions_label" msgid="1708927634370314404">"Dopuštenja"</string>
<string name="cache_header_label" msgid="2441967971921741047">"Predmemorija"</string>
- <string name="clear_cache_btn_text" msgid="8597272828928143723">"Isprazni predmemoriju"</string>
+ <string name="clear_cache_btn_text" msgid="8597272828928143723">"Izbriši predmemoriju"</string>
<string name="cache_size_label" msgid="313456088966822757">"Predmemorija"</string>
<string name="uri_permissions_text" msgid="8406345863117405105">"{count,plural, =1{1 stavka}one{# stavka}few{# stavke}other{# stavki}}"</string>
<string name="clear_uri_btn_text" msgid="4828117421162495134">"Izbriši pristup"</string>
@@ -1616,7 +1659,7 @@
<string name="install_text" msgid="4558333621516996473">"Instaliraj"</string>
<string name="disable_text" msgid="5146002260857428005">"Onemogući"</string>
<string name="enable_text" msgid="8570798764647110430">"Omogući"</string>
- <string name="clear_user_data_text" msgid="6773186434260397947">"Isprazni pohranu"</string>
+ <string name="clear_user_data_text" msgid="6773186434260397947">"Izbriši pohranu"</string>
<string name="app_factory_reset" msgid="8974044931667015201">"Deinstaliraj ažuriranja"</string>
<string name="app_restricted_settings_lockscreen_title" msgid="5993061278264872648">"Dopusti ograničene postavke"</string>
<string name="auto_launch_enable_text" msgid="8912714475823807798">"Neke aktivnosti koje ste odabrali otvaraju se u ovoj aplikaciji prema zadanim postavkama."</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Otvaranje pomoću gumba za pristupačnost"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Zadržite tipke za glasnoću za otvaranje"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Triput dodirnite zaslon za otvaranje"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Triput dodirnite zaslon dvama prstima za otvaranje"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Otvaranje pokretom"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Upotreba pokreta za pristupačnost"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Da biste koristili tu značajku, dodirnite gumb za Pristupačnost <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> pri dnu zaslona.\n\nDa biste prešli na neku drugu značajku, dodirnite i zadržite gumb za Pristupačnost."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Da biste koristili tu značajku, dodirnite gumb za pristupačnost na zaslonu."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Da biste koristili tu značajku, pritisnite i zadržite obje tipke za glasnoću."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Da biste pokrenuli ili zaustavili povećavanje, triput dodirnite bilo gdje na zaslonu."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Da biste pokrenuli i zaustavili povećavanje, triput dodirnite dvama prstima bilo gdje na zaslonu."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Da biste koristili tu značajku, prijeđite s dva prsta prema gore od dna zaslona.\n\nDa biste prešli na neku drugu značajku, prijeđite s dva prsta prema gore i zadržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Da biste koristili tu značajku, prijeđite s tri prsta prema gore od dna zaslona.\n\nDa biste prešli na neku drugu značajku, prijeđite s tri prsta prema gore i zadržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Da biste koristili značajku pristupačnosti, prijeđite s dva prsta prema gore od dna zaslona.\n\nDa biste prešli na neku drugu značajku, prijeđite s dva prsta prema gore i zadržite."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Držite tipke za glasnoću"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"držite tipke za glasnoću"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Pritisnite i zadržite obje tipke za glasnoću"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Triput dodirnite zaslon dvama prstima"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"triput dodirnite zaslon dvama prstima"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Brzo dodirnite zaslon dvama prstima ovoliko puta: {0,number,integer}"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Triput dodirnite zaslon"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triput dodirnite zaslon"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Brzo dodirnite zaslon {0,number,integer} puta. Taj prečac može usporiti uređaj"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Koristi vibraciju i haptiku"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibracija alarma"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibracija medijskih sadržaja"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibracija tipkovnice"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibracija pri zvonjenju"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibracija obavijesti"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Reakcija na dodir"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ako ograničite pozadinsku aktivnost za aplikaciju, možda će se ponašati nepredviđeno"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Aplikacija nije postavljena za optimizaciju baterije, pa je ne možete ograničiti.\n\nZa ograničenje uključite optimizaciju."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Upravljanje potrošnjom baterije"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Omogućivanje upotrebe u pozadini"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Omogućite za ažuriranja u stvarnom vremenu, onemogućite za uštedu baterije"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neograničeno"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizirano"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ograničeno"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"veličina teksta, velika slova, veliki font, veliki tekst, slabovidnost, povećati tekst, povećalo fonta, povećanje fonta"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"uvijek uključen ambijentalni zaslon, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, oznaka, čitač"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tipkovnica, haptika, vibracija,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Glasnoća, vibracija, Ne uznemiravaj"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Glasnoća medija"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Glasnoća emitiranja"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Dopusti pristup za upravljanje svim datot."</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Dopustite toj aplikaciji čitanje, izmjenu i brisanje svih datoteka na ovom uređaju ili drugim povezanim uređajima za pohranu. Ako date to dopuštenje, aplikacija može pristupati datotekama bez vašeg znanja."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Može pristupiti svim datotekama"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Obavijesti na cijelom zaslonu"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Omogući obavijesti te aplikacije na cijelom zaslonu"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Omogućuje aplikaciji da prikazuje obavijesti koje zauzimaju cijeli zaslon kad je uređaj zaključan. Aplikacije na taj način mogu istaknuti alarme, dolazne pozive ili druge hitne obavijesti."</string>
@@ -4885,6 +4939,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Provjera aktivnosti u aplikaciji radi otkrivanja krađe identiteta"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Korištenje provjere"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Korištenje provjere za poslovne aplikacije"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Provjera se provodi privatno izravno na vašem uređaju, a njome se provjerava aktivnost u aplikaciji radi otkrivanja krađe identiteta ili drugih oblika obmanjujućeg djelovanja. U slučaju otkrivanja navedenog neki podaci o aplikaciji šalju se Google Play Protectu radi potvrde prijetnje i upozoravanja korisnika aplikacije."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Ovo je zaštićena sigurnosna značajka. Podaci o uređaju i osobni podaci ne dijele se s Googleom. \n\nKrađa identiteta pokušaj je krađe vjerodajnica za prijavu ili drugih osobnih podataka."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 1aac336..8b1ad17 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE hangátvitel kikapcsolása"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Kikapcsolja a Bluetooth alacsony energiaszintű hangátvitel funkciót, ha az eszköz támogatja az Alacsony energiaszintű hangátvitel hardver működését."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"„Alacsony energiaszintű hangátvitel” az Eszközadatokban"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth alacsony energiaszintű hangátvitel engedélyezőlistájának megkerülése"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Alacsony energiaszintű hangátvitel használata alapértelmezés szerint akkor is, ha az Alacsony energiaszintű hangátvitelt használó periféria nem teljesíti igazoltan az engedélyezőlista feltételeit."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Médiaeszközök"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Hívóeszközök"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Egyéb eszközök"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Mentett eszközök"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Fiókkal társítva"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Korábban használva a fiókkal"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"A Bluetooth bekapcsol a párosítás végrehajtása érdekében"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Kapcsolati beállítások"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Korábban csatlakoztatva"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Írás a szövegmezőkben"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Az érintőceruza összes gombnyomásának figyelmen kívül hagyása"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Érintőceruza"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Hang megosztása"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Hang megosztása"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Hívások és riasztások"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Csatlakozás alacsony energiaszintű hangátvitelt használó streamhez"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Közeli audiostreamek"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audiostreamek"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Csatlakozhat audiostreamhez QR-kóddal"</string>
<string name="date_and_time" msgid="1788358029823431692">"Dátum és idő"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Törlés"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privát terület"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Alkalmazások elrejtése privát mappában"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Feloldás képernyőzárral"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Privát terület mutatása"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Elrejtés lezárt állapotban"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Privát terület elrejtése lezárt állapotban"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"A privát terület elrejthető az applistából, ha titkolná mások előtt"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Hozzáférés a privát területhez rejtett állapotban"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"A „privát terület” kifejezés keresése a keresősávban"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Koppintson a privát terület mozaikjára"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Oldja fel a privát területet"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Ki"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Be"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Rendszer"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Privát terület létrehozása"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Privát terület törlése"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Nem sikerült létrehozni a privát területet"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privát terület sikeresen törölve"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Nem sikerült törölni a privát területet"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Képernyőzár beállítása"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Privát terület használatához állítson be képernyőzárat."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Képernyőzár beállítása"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Mégse"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Mégse"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Beállítás"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Privát terület beállítása"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Elrejtheti a privát alkalmazásokat egy biztonságos helyen, amelyhez csak Ön férhet hozzá"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Hogyan működik?"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"A privát terület az alkalmazások listájának alján érhető el."</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"A privát területen lévő alkalmazásokat zárolás védi"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"A privát területen lévő alkalmazásoktól érkező értesítések rejtve maradnak, amikor le van zárva a privát terület"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"A privát terület alkalmazásai nem jelennek meg az engedélykezelőben, az adatvédelmi irányítópulton és más beállításokban, amikor a privát terület le van zárva"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"A privát terület beállítása…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"A privát területet zárolás védi"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"A privát terület alkalmazásaihoz tartozó használati adatok rejtve vannak, amikor a privát terület le van zárva"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"A privát terület megnyitása az alkalmazáslistából"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Nem sikerült a privát terület beállítása"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Próbálja újra most, vagy térjen vissza később."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Újra"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"A képernyőzárat szeretné használni a feloldáshoz?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"A privát területet feloldhatja ugyanúgy, ahogyan az eszközét is, vagy kiválaszthat másik zárolási lehetőséget."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Képernyőzár használata"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Új zárolás kiválasztása"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Kész is!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"A privát terület megnyitásához csúsztasson felfelé a képernyő aljáról, majd görgessen le."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Kész"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Görgessen le a privát terület megnyitásához"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Legfeljebb <xliff:g id="COUNT">%d</xliff:g> ujjlenyomatot adhat hozzá"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Elérte a hozzáadható ujjlenyomatok maximális számát"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nem lehet több ujjlenyomatot hozzáadni"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Appok megtartása összehajtáskor"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Néhány tartalomnál automatikusan megemeli a frissítési gyakoriságot 60-ról <xliff:g id="ID_1">%1$s</xliff:g> Hz-re. Növeli az akkumulátorhasználatot."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Néhány tartalomnál automatikusan megemeli a frissítési gyakoriságot <xliff:g id="ID_1">%1$d</xliff:g> Hz-re. Növeli az akkumulátorhasználatot."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Legmagasabb frissítési gyakoriság kényszerítése"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Legnagyobb frissítési gyakoriság a kifinomultabb érintési érzékenység és a jobb minőségű animációk érdekében. Növeli az akkumulátorhasználatot."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Képernyőfigyelő"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Közösségi beállítások"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-ek"</string>
<string name="apn_edit" msgid="2003683641840248741">"Hozzáférési pont szerkesztése"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Hozzáférési pont hozzáadása"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Nincs megadva"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nincs beállítva"</string>
<string name="apn_name" msgid="6677695784108157953">"Név"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Megnyitás a kisegítő gombbal"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"A megnyitáshoz tartsa lenyomva a hangerőgombokat"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Koppintson háromszor a képernyőn a megnyitáshoz"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Koppintson két ujjal a képernyőn háromszor a megnyitáshoz"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Megnyitás kézmozdulattal"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Kisegítő kézmozdulat használata"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"A funkció használatához koppintson a képernyő alján megtalálható Kisegítő lehetőségek <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> gombra.\n\nA funkciók közti váltáshoz tartsa lenyomva ujját a Kisegítő lehetőségek gombon."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"A funkció használatához koppintson a képernyőn a Kisegítő lehetőségek gombra."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"A funkció használatához tartsa lenyomva mindkét hangerőszabályzó gombot."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"A nagyítás megkezdéséhez és leállításához koppintson háromszor bárhol a képernyőn."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"A nagyítás megkezdéséhez és leállításához koppintson két ujjal háromszor bárhol a képernyőn."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"A funkció használatához csúsztasson két ujjával felfelé a képernyő aljáról.\n\nA funkciók közötti váltáshoz csúsztasson felfelé két ujjával, és ne emelje fel őket a képernyőről."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"A funkció használatához csúsztasson három ujjával felfelé a képernyő aljáról.\n\nA funkciók közötti váltáshoz csúsztasson felfelé három ujjával, és ne emelje fel őket a képernyőről."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"A Kisegítő lehetőségek valamelyik funkciójának használatához csúsztasson két ujjával felfelé a képernyő aljáról.\n\nA funkciók közötti váltáshoz csúsztasson felfelé két ujjával, és ne emelje fel őket a képernyőről."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hangerőgombok nyomva tartása"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hangerőgombok nyomva tartása"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Tartsa lenyomva mindkét hangerőgombot"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Három koppintás a képernyőn két ujjal"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"három koppintás a képernyőn két ujjal"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Gyors koppintás a képernyőre két ujjal {0,number,integer} alkalommal"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Háromszori koppintás a képernyőre"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"háromszori koppintás a képernyőre"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Koppintson a képernyőre gyorsan, {0,number,integer} alkalommal. Ez a gyorsparancs lelassíthatja az eszközét."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Rezgés és haptikus visszajelzés használata"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Ébresztés rezgése"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Rezgés médiatartalommal"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Billentyűzet rezgése"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Csengés rezgése"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Értesítések rezgése"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Visszajelzés az érintésekről"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ha korlátozza az alkalmazások háttértevékenységét, lehetséges, hogy hibásan fognak működni"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Az alkalmazás nem korlátozható, mert nincs beállítva az akkumulátor optimalizálására.\n\nA korlátozáshoz kapcsolja be az akkumulátoroptimalizálást."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Akkumulátorhasználat kezelése"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Háttérbeli futtatás engedélyezése"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Engedélyezze a valós idejű frissítésekhez, vagy tiltsa le az akkumulátor kíméléséhez"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Korlátlan"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimalizált"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Korlátozott"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"betűméret, nagybetű, nagy betűtípus, nagy szöveg, gyengénlátó, szöveg nagyítása, betűtípusnagyító, betűtípus-nagyítás"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"Mindig bekapcsolt környezeti kijelző (Always on Ambient Display, AOD)"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, címke, olvasó"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"billentyűzet, rezgés, vibrálás,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Hangerő, rezgés, Ne zavarjanak"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Média hangereje"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Átküldés hangereje"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Hozzáférés megadása minden fájl kezeléséhez"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Engedélyezi ennek az alkalmazásnak az eszközön és a csatlakoztatott tárolóköteteken található összes fájl olvasását, módosítását és törlését. Ha engedélyezve van, az alkalmazás anélkül férhet hozzá a fájlokhoz, hogy Önt külön tájékoztatná róla."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Minden fájlhoz hozzáférhet"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Teljes képernyős értesítések"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Teljes képernyős értesítések engedélyezése ettől az alkalmazástól"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Teljes képernyős értesítések megjelenítésének engedélyezése az alkalmazásnak, amikor az eszköz zárolva van. Az alkalmazások ébresztések, bejövő hívások vagy más sürgős értesítések kiemelésére használhatják ezt a funkciót."</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Eszköze neve látható a telepített alkalmazások számára. Mások is láthatják, ha csatlakoztatja telefonját más Bluetooth-eszközökhöz, Wi-Fi-hálózathoz, vagy ha Wi-Fi-hotspotot állít be."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Nyelvtani nem"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Nyelvtani nem kiválasztása"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Megtévesztő alkalmazások keresése…"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Adathalászat keresése az alkalmazástevékenységekben"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Ellenőrzés"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Ellenőrzés munkahelyi alkalmazásoknál"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 9bbafc9..a340a88 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Անջատել Bluetooth LE Audio-ն"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Անջատում է Bluetooth LE Audio գործառույթը, եթե սարքն այն աջակցում է։"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Տեսնել LE Audio-ն սարքի տվյալներում"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Շրջանցել Bluetooth LE Audio-ի թույլատրվածների ցուցակը"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Օգտագործել LE Audio-ն ըստ կանխադրման, անգամ եթե LE Audio-ի արտաքին սարքի համապատասխանությունը թույլատրվածների ցուցակի չափանիշներին չի հաստատվել։"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Մեդիա սարքեր"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Հեռախոսային սարքեր"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Այլ սարքեր"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Պահված սարքեր"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Կապված է հաշվի հետ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Նախկինում օգտագործվել են այս հաշվի հետ"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth-ը կմիանա զուգակցման համար"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Միացման կարգավորումներ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Նախկինում միացված սարքեր"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Գրել տեքստային դաշտերում"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Անտեսել կոճակների ստիլուսով սեղմումները"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Ստիլուս"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Աուդիոյի փոխանցում"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Փոխանցել աուդիո"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Զանգեր և զարթուցիչներ"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Ամսաթիվ և ժամ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Պրոքսի"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Մաքրել"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Անձնական տարածք"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Անձնական պանակ, որտեղ կարող եք հավելվածներ թաքցնել"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Բացել՝ օգտագործելով էկրանի ապակողպման եղանակը"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Ցուցադրել անձնական տարածքը"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Թաքցնել, երբ կողպված է"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Թաքցնել Անձնական տարածքը, երբ այն կողպված է"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Որպեսզի այլ մարդիկ չիմանան ձեր Անձնական տարածքի մասին, կարող եք այն թաքցնել հավելվածների ցանկից"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Անձնական տարածքի հասանելիություն, երբ այն թաքցված է"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Որոնման տողում մուտքագրեք «Անձնական տարածք» հարցումը"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Հպեք «Անձնական տարածք» սալիկին"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Ապակողպել Անձնական տարածքը"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Անջատված է"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Միացված է"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Համակարգ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Ստեղծել անձնական տարածք"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Ջնջել անձնական տարածքը"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Չհաջողվեց ստեղծել անձնական տարածք"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Անձնական տարածքը ջնջվեց"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Անձնական տարածքը չհաջողվեց ջնջել"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Կարգավորեք էկրանի կողպումը"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Սահմանեք էկրանի կողպում և օգտագործեք Անձնական տարածքը։"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Կարգավորել էկրանի կողպումը"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Չեղարկել"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Չեղարկել"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Կարգավորել"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Անձնական տարածքի կարգավորում"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Թաքցրեք անձնական հավելվածներն ապահով տեղում, որտեղ դրանք հասանելի են միայն ձեզ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Ինչպես է դա աշխատում"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Անձնական տարածք կարող եք անցնել հավելվածների ցանկի ներքևից"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Անձնական տարածքում հավելվածները պաշտպանված են կողպեքի միջոցով"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Անձնական տարածքում հավելվածներից ծանուցումները թաքցված են, երբ այն կողպված է"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Անձնական տարածքի հավելվածները չեն ցուցադրվի թույլտվությունների կառավարչում, թույլտվությունների կառավարման վահանակում և այլ կարգավորումներում, երբ Անձնական տարածքը կողպված է"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Անձնական տարածքի ստեղծում…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Անձնական տարածքը պաշտպանված է կողպեքի միջոցով"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Երբ անձնական տարածքը կողպված է, հավելվածների օգտագործման մասին տվյալները թաքցված են այնտեղ"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Անցեք անձնական տարածք հավելվածների ցանկից"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Չհաջողվեց ստեղծել անձնական տարածք"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Փորձեք նորից կամ վերադարձեք ավելի ուշ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Նորից փորձել"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Օգտագործե՞լ էկրանի կողպումը"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Դուք կարող եք օգտագործել ապակողպման նույն եղանակը, որն օգտագործվում է էկրանի համար, կամ ընտրել մեկ ուրիշը"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Օգտագործել էկրանի կողպումը"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Ընտրել այլ եղանակ"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Պատրա՛ստ է"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Անձնական տարածք անցնելու համար մատը սահեցրեք հիմնական էկրանի ներքևից վերև և ոլորեք էջը ներքև"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Պատրաստ է"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Անձնական տարածք անցնելու համար ոլորեք ներքև"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Կարող եք ավելացնել առավելագույնը <xliff:g id="COUNT">%d</xliff:g> մատնահետք"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Դուք ավելացրել եք մատնահետքերի առավելագույն թույլատրելի քանակը"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Հնարավոր չէ ավելացնել այլ մատնահետքեր"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Շարունակել օգտագործել հավելվածները ծալված սարքում"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Սահուն պատկեր"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Որոշակի բովանդակության համար թարմացման հաճախականությունը 60-ից կդառնա <xliff:g id="ID_1">%1$s</xliff:g> Հց։ Մարտկոցի լիցքն ավելի արագ է սպառվում։"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Որոշակի բովանդակության համար թարմացման հաճախականությունն ավտոմատ բարձրանում է մինչև <xliff:g id="ID_1">%1$d</xliff:g> Հց։ Մարտկոցի լիցքն ավելի արագ է սպառվում։"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Պարտադիր թարմացման առավելագույն հաճախականությունը"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Էկրանի թարմացման բարձր հաճախականությունը լավացնում է հապտիկ արձագանքը և շարժանկարների որակը։ Այն նաև երկարացնում է մարտկոցի օգտագործման ժամանակը։"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Ադապտիվ քնի ռեժիմ"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Ընդհանուր կարգավորումներ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-ներ"</string>
<string name="apn_edit" msgid="2003683641840248741">"Խմբագրել մուտքի կետը"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Կարգավորված չէ"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Նշված չէ"</string>
<string name="apn_name" msgid="6677695784108157953">"Անուն"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Բացեք «Հատուկ գործառույթներ» կոճակի միջոցով"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Բացելու համար սեղմած պահեք ձայնի կոճակները"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Բացելու համար երեք անգամ հպեք էկրանին"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Բացելու համար երկու մատով եռակի հպեք էկրանին"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Բացեք ձեռքի շարժումով"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Հատուկ գործառույթների ժեստի օգտագործում"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Այս գործառույթն օգտագործելու համար էկրանի ներքևում հպեք «Հատուկ գործառույթներ» <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> կոճակին։\n\nՄի գործառույթից մյուսին անցնելու համար հպեք «Հատուկ գործառույթներ» կոճակին և պահեք։"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Այս գործառույթն օգտագործելու համար հպեք ձեր էկրանի «Հատուկ գործառույթներ» կոճակին։"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Այս գործառույթն օգտագործելու համար սեղմեք և պահեք ձայնի ուժգնության երկու կոճակները։"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Խոշորացումը միացնելու և անջատելու համար երեք անգամ հպեք էկրանի ցանկացած հատվածին։"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Խոշորացումը միացնելու և անջատելու համար երկու մատով երեք անգամ հպեք էկրանի ցանկացած հատվածին։"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Այս գործառույթն օգտագործելու համար երկու մատը սահեցրեք էկրանի ներքևից վերև։\n\nՄի գործառույթից մյուսին անցնելու համար երկու մատը սահեցրեք էկրանի ներքևից վերև և պահեք։"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Այս գործառույթն օգտագործելու համար երեք մատը սահեցրեք էկրանի ներքևից վերև։\n\nՄի գործառույթից մյուսին անցնելու համար երեք մատը սահեցրեք էկրանի ներքևից վերև և պահեք։"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Որևէ հատուկ գործառույթ օգտագործելու համար երկու մատը սահեցրեք էկրանի ներքևից վերև։\n\nՄի գործառույթից մյուսին անցնելու համար երկու մատը սահեցրեք էկրանի ներքևից վերև և պահեք։"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Սեղմած պահել ձայնի ուժգնության ստեղները"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ձայնի կարգավորման կոճակների սեղմում"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Սեղմեք և պահեք ձայնի ուժգնության երկու կոճակները"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Երկու մատով եռակի հպում էկրանին"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"երկու մատով եռակի հպում էկրանին"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Երկու մատով {0,number,integer} անգամ արագ հպեք էկրանին"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Եռակի հպեք էկրանին"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"եռակի հպում էկրանին"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Արագ հպեք էկրանին {0,number,integer} անգամ։ Այս դյուրանցումը կարող է դանդաղեցնել սարքի աշխատանքը։"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Օգտագործել թրթռոցը և հապտիկ արձագանքը"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Զարթուցիչի թրթռոց"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Մեդիա բովանդակության թրթռոց"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Ստեղնաշարի թրթռոց"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Թրթռազանգ"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Թրթռոց ծանուցման ժամանակ"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Հապտիկ արձագանք"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Հավելվածի ֆոնային գործողությունների սահմանափակումը կարող է ազդել վերջինիս աշխատանքի վրա"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Մարտկոցի օպտիմալացումն այս հավելվածի համար կարգավորված չէ։\n\nՄիացրեք այն՝ հավելվածը սահմանափակելու համար։"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Մարտկոցի օգտագործման կառավարում"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Անսահմանափակ"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Օպտիմալացված"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Սահմանափակ"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"տեքստի չափը, մեծ տառատեսակ, խոշոր տառատեսակ, մեծ տեքստ, թույլ տեսողություն, մեծացնել տեքստը, մեծացնել տառատեսակը, տառատեսակի մեծացում"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"միշտ միացված անգործուն էկրան, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, պիտակ, ընթերցիչ"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ստեղնաշար, հապտիկ արձագանք, թրթռոց,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Ձայնի ուժգնություն, թրթռոց, Չանհանգստացնել ռեժիմ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Մուլտիմեդիա"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Հեռարձակման ձայնի ուժգնություն"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Բոլոր ֆայլերը կառավարելու թույլտվություն տալ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Դուք կարող եք թույլատրել այս հավելվածին կարդալ, փոփոխել և ջնջել այս սարքի կամ միացված կրիչների բոլոր ֆայլերը։ Եթե թույլատրեք, հավելվածը կկարողանա օգտվել ֆայյլերից առանց ձեր իմացության։"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Հասանելիություն ունեն բոլոր ֆայլերին"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Ծանուցումներ լիաէկրան ռեժիմում"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Թույլատրել այս հավելվածին ցույց տալ ծանուցումներ լիաէկրան ռեժիմում"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Թույլատրել այս հավելվածին ցույց տալ ծանուցումներ լիաէկրան ռեժիմում, երբ սարքը կողպված է։ Հավելվածները կարող են օգտագործել այս գործառույթը՝ զարթուցիչներ, մուտքային զանգեր և այլ շտապ ծանուցումներ ցուցադրելու համար։"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Ձեր սարքի անունը տեսանելի է ձեր տեղադրած հավելվածներին։ Այն կարող են տեսնել օգտատերերը, երբ միանում եք Bluetooth սարքերի, Wi-Fi ցանցի, կամ կարգավորում եք Wi-Fi թեժ կետ։"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Քերականական սեռ"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Ընտրեք քերականական սեռը"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Սկանավորել՝ խարդախություն պարունակող հավելվածներ գտնելու համար"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Ստուգել հավելվածի օգտագործման պատմությունը՝ ֆիշինգ հայտնաբերելու նպատակով"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Սկանավորել"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Սկանավորել աշխատանքային հավելվածները"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 8affd29..3bd4c44 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Nonaktifkan Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Nonaktifkan fitur Bluetooth LE Audio jika perangkat mendukung kemampuan hardware LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Tampilkan tombol LE audio di Detail Perangkat"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Abaikan Daftar yang Diizinkan Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Gunakan LE Audio secara default meskipun periferal LE Audio belum diverifikasi untuk memenuhi kriteria Daftar yang diizinkan."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Perangkat Media"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Perangkat panggilan telepon"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Perangkat lain"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Perangkat tersimpan"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Dikaitkan dengan akun"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Sebelumnya digunakan dengan akun"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth akan diaktifkan untuk menyambungkan"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferensi koneksi"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Terhubung sebelumnya"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Menulis di kolom teks"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Abaikan semua penekanan tombol dengan stilus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stilus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Berbagi audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Bagikan audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Panggilan dan alarm"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Tanggal & waktu"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Bersihkan"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Ruang Pribadi"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Sembunyikan aplikasi di folder pribadi"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Buka menggunakan kunci layar"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Tampilkan Ruang Pribadi"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Sembunyikan saat terkunci"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Sembunyikan Ruang Pribadi jika dikunci"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Agar orang lain tidak dapat melihat Ruang Pribadi di perangkat, Anda dapat menyembunyikannya dari daftar aplikasi"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Akses Ruang Pribadi jika disembunyikan"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Telusuri \'Ruang Pribadi\' di kotak penelusuran"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Ketuk kartu Ruang Pribadi"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Buka kunci Ruang Pribadi"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Nonaktif"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Aktif"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Buat Ruang Pribadi"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Hapus Ruang Pribadi"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Ruang Pribadi tidak dapat dibuat"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Ruang Pribadi berhasil dihapus"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Ruang Pribadi tidak dapat dihapus"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Setel kunci layar"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Untuk menggunakan Ruang Pribadi, setel kunci layar di perangkat ini."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Setel kunci layar"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Batal"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Batal"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Siapkan"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Siapkan Ruang Pribadi"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Sembunyikan aplikasi pribadi di ruang aman yang hanya dapat diakses oleh Anda"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Cara kerjanya"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Anda dapat mengakses Ruang Pribadi dari bagian bawah daftar aplikasi"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikasi di Ruang Pribadi dilindungi dengan kunci"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notifikasi dari aplikasi di Ruang Pribadi disembunyikan saat Ruang Pribadi dikunci"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikasi Ruang Pribadi tidak akan muncul di pengelola izin, dasbor privasi, dan setelan lainnya jika Ruang Pribadi dikunci"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Menyiapkan Ruang Pribadi…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Ruang Pribadi dilindungi oleh kunci"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Info penggunaan aplikasi Ruang Pribadi disembunyikan saat Ruang Pribadi dikunci"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Akses Ruang Pribadi dari daftar aplikasi"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Tidak dapat menyiapkan Ruang Pribadi"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Coba lagi sekarang, atau kembali lagi nanti"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Coba Lagi"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Gunakan kunci layar untuk membuka kunci?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Anda dapat membuka kunci Ruang Pribadi dengan cara yang sama seperti membuka kunci perangkat, atau memilih kunci lain"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Gunakan layar kunci"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Pilih kunci baru"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Semua siap."</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Untuk mengakses Ruang Pribadi, geser ke atas dari bagian bawah layar utama, lalu scroll ke bawah"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Selesai"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll ke bawah untuk mengakses Ruang Pribadi"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Anda dapat menambahkan maksimal <xliff:g id="COUNT">%d</xliff:g> sidik jari"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Anda telah menambahkan jumlah maksimum sidik jari"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Tidak dapat menambahkan sidik jari lagi"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Terus pakai aplikasi saat dilipat"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Otomatis meningkatkan kecepatan refresh dari 60 menjadi <xliff:g id="ID_1">%1$s</xliff:g> Hz untuk beberapa konten. Meningkatkan penggunaan baterai."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Otomatis meningkatkan kecepatan refresh hingga <xliff:g id="ID_1">%1$d</xliff:g> Hz untuk beberapa konten. Meningkatkan penggunaan baterai."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Paksa kecepatan refresh tertinggi"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Kecepatan refresh tertinggi untuk memperbaiki respons sentuhan & kualitas animasi. Meningkatkan penggunaan baterai."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Fokus ke layar"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Setelan umum"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit titik akses"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Tidak disetel"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Belum disetel"</string>
<string name="apn_name" msgid="6677695784108157953">"Nama"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Gunakan tombol aksesibilitas untuk membuka"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Tahan tombol volume untuk membuka"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Ketuk tiga kali pada layar untuk membuka"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Ketuk layar tiga kali dengan dua jari untuk membuka"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Menggunakan gestur untuk membuka"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Gunakan gestur aksesibilitas"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Untuk menggunakan fitur ini, ketuk tombol aksesibilitas <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> di bagian bawah layar.\n\nUntuk beralih antarfitur, sentuh lama tombol aksesibilitas."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Untuk menggunakan fitur ini, ketuk tombol aksesibilitas di layar."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Untuk menggunakan fitur ini, tekan dan tahan kedua tombol volume."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Untuk memulai dan menghentikan pembesaran, ketuk tiga kali di mana saja pada layar Anda."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Untuk memulai dan menghentikan pembesaran, ketuk tiga kali dengan dua jari di mana saja pada layar."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Untuk menggunakan fitur ini, geser ke atas dari bawah layar dengan 2 jari.\n\nUntuk beralih antarfitur, geser ke atas dengan 2 jari dan tahan."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Untuk menggunakan fitur ini, geser ke atas dari bawah layar dengan 3 jari.\n\nUntuk beralih antarfitur, geser ke atas dengan 3 jari dan tahan."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Untuk menggunakan fitur aksesibilitas, geser ke atas dari bawah layar dengan 2 jari.\n\nUntuk beralih antarfitur, geser ke atas dengan 2 jari dan tahan."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Tahan tombol volume"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"tahan tombol volume"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Tekan dan tahan kedua tombol volume"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Ketuk layar tiga kali dengan dua jari"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ketuk layar tiga kali dengan dua jari"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Ketuk cepat layar sebanyak {0,number,integer} kali dengan dua jari"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ketuk layar tiga kali"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ketuk layar tiga kali"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ketuk layar dengan cepat {0,number,integer} kali. Pintasan ini mungkin memperlambat perangkat Anda"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Gunakan getaran & sentuhan"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Getaran alarm"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Getaran media"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Getaran keyboard"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Getaran dering"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Getaran notifikasi"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Respons sentuhan"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Jika aktivitas background aplikasi dibatasi, mungkin fungsinya terganggu."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Anda tidak dapat membatasi aplikasi karena tidak disetel untuk mengoptimalkan baterai.\n\nAktifkan pengoptimalan baterai untuk membatasi aplikasi."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Kelola penggunaan baterai"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Tidak dibatasi"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Dioptimalkan"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Dibatasi"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ukuran teks, hasil cetak besar, font besar, teks besar, gangguan penglihatan, buat teks lebih besar, pembesar font, pembesaran font"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"tampilan standby selalu aktif, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, pembaca"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"keyboard, haptic, getar,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, getar, Jangan Ganggu"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume media"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume transmisi"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Izinkan akses untuk mengelola semua file"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Mengizinkan aplikasi ini untuk membaca, mengubah, dan menghapus semua file di perangkat ini atau media penyimpanan yang terpasang. Jika diberikan, aplikasi dapat mengakses file tanpa sepengetahuan Anda."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Dapat mengakses semua file"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notifikasi layar penuh"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Izinkan notifikasi layar penuh dari aplikasi ini"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Izinkan aplikasi ini menampilkan notifikasi dalam layar penuh ketika perangkat terkunci. Aplikasi mungkin menggunakan tindakan ini untuk memperjelas alarm, panggilan masuk, atau notifikasi penting lainnya."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Nama perangkat Anda dapat dilihat oleh aplikasi yang diinstal. Juga mungkin dilihat oleh orang lain saat Anda terhubung ke perangkat Bluetooth atau jaringan Wi-Fi, atau saat menyiapkan hotspot Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Gender gramatikal"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Pilih Gender gramatikal"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Pemindaian aplikasi yang menipu"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Periksa aktivitas aplikasi untuk menemukan phishing"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Gunakan pemindaian"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Gunakan pemindaian untuk aplikasi kerja"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 721a46c..71547db 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Slökkva á Bluetooth LE-hljóði"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Slekkur á Bluetooth LE-hljóðeiginleika ef tækið styður vélbúnaðareiginleika LE-hljóðs."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Sýna rofa LE-hljóðs í tækjaupplýsingum"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Sneiða hjá hvítum lista Bluetooth LE-hljóðs"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Nota LE-hljóð sjálfkrafa jafnvel þótt jaðartæki LE-hljóðs hafi ekki verið staðfest með tilliti til skilyrða hvíta listans."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Geymslumiðlar"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Símtæki"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Önnur tæki"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Vistuð tæki"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Tengt reikningi"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Notað áður með reikningi"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Kveikt verður á Bluetooth til að para"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Tengingarstillingar"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Áður tengt"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Skrifa í textareiti"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Hunsa þegar ýtt er á pennahnapp"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Penni"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Hljóði deilt"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Deila hljóði"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Símtöl og vekjarar"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Dagsetning og tími"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy-þjónn"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Hreinsa"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Einkarými"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Fela forrit í lokaðri möppu"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Taka úr lás með skjálás"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Sýna einkarými"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Fela þegar læst"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Fela einkarými þegar það er læst"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Til að aðrir sjái ekki einkarými tækisins geturðu falið það á forritalistanum"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Aðgangur að einkarými þegar það er falið"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Leitaðu að „Einkarými“ á leitarstikunni"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Ýttu á reitinn „Einkarými“"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Taktu einkarýmið úr lás"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Slökkt"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Kveikt"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Kerfi"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Búa til einkarými"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Eyða einkarými"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Ekki tókst að búa til einkarými"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Einkarými var eytt"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Ekki tókst að eyða einkarými"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Setja upp skjálás"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Stilltu skjálás í tækinu til að nota einkarými."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Stilla skjálás"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Hætta við"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Hætta við"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Setja upp"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Setja upp einkarými"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Feldu einkaforrit í öruggu rými sem enginn getur opnað nema þú"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Svona virkar þetta"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Þú getur nálgast einkarými neðst á forritalistanum"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Forrit í einkarými eru varin með lás"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Tilkynningar forrita í einkarými eru faldar þegar það er læst"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Forrit í einkarými birtast ekki í leyfisstjóra, á persónuverndarstjórnborði og í öðrum stillingum þegar einkarými er læst"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Setur upp einkarými…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Einkarými er varið með lás"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Notkunarupplýsingar einkarýmisforrita eru faldar þegar það er læst"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Opnaðu einkarými á forritalistanum"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Ekki tókst að setja upp einkarými"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Prófaðu aftur núna eða komdu aftur síðar"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Reyna aftur"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Nota skjálás til að taka úr lás?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Hægt er að taka einkarými úr lás á sama hátt og tækið en einnig er hægt að velja annan lás"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Nota skjálás"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Velja nýjan lás"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Allt tilbúið!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Til að opna einkarými skaltu strjúka upp frá neðri hluta heimaskjásins og fletta svo niður"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Lokið"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Flettu niður til að opna einkarými"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Þú getur bætt við allt að <xliff:g id="COUNT">%d</xliff:g> fingraförum"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Þú hefur bætt við hámarksfjölda fingrafara"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Ekki er hægt að bæta fleiri fingraförum við"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Halda áfram að nota forrit þegar tæki er brotið saman"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Hnökralaus skjár"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Breytir endurnýjunarhraða sjálfkrafa úr 60 í <xliff:g id="ID_1">%1$s</xliff:g> Hz fyrir sumt efni. Eykur rafhlöðunotkun."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Hækkar endurnýjunartíðni sjálfkrafa upp í <xliff:g id="ID_1">%1$d</xliff:g> Hz fyrir sumt efni. Eykur rafhlöðunotkun."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Þvinga fram mesta endurnýjunarhraða"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Mesti endurnýjunarhraði fyrir bætta snertisvörun og gæði hreyfimynda. Eykur rafhlöðunotkun."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Skjáskynjun"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Sameiginlegar stillingar"</string>
<string name="apn_settings" msgid="4295467389400441299">"Aðgangsstaðir"</string>
<string name="apn_edit" msgid="2003683641840248741">"Breyta aðgangsstað"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ekki stillt"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ekki stillt"</string>
<string name="apn_name" msgid="6677695784108157953">"Heiti"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Notaðu aðgengishnappinn til að opna"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Haltu hljóðstyrkstökkunum inni til að opna"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Ýttu þrisvar á skjáinn til að opna"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Ýtt þrisvar á skjáinn með tveimur fingrum til að opna"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Nota bendingu til að opna"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Nota aðgengisbendingu"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Til að nota þennan eiginleika skaltu ýta á aðgengishnappinn <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> neðst á skjánum.\n\nTil að skipta á milli eiginleika skaltu halda inni aðgengishnappinum."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Ýttu á aðgengishnappinn á skjánum til að nota þennan eiginleika."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Til að nota þennan eiginleika heldurðu inni báðum hljóðstyrkstökkunum."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Til að ræsa og stöðva stækkun skaltu ýta þrisvar einhvers staðar á skjáinn."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Til að ræsa og stöðva stækkun skaltu ýta þrisvar einhversstaðar á skjáinn með tveimur fingrum."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Til að nota þennan eiginleika skaltu strjúka upp frá neðri hluta skjásins með tveimur fingrum.\n\nTil að skipta á milli eiginleika skaltu strjúka upp með tveimur fingrum og halda inni."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Til að nota þennan eiginleika skaltu strjúka upp frá neðri hluta skjásins með þremur fingrum.\n\nTil að skipta á milli eiginleika skaltu strjúka upp með þremur fingrum og halda inni."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Til að nota aðgengiseiginleika skaltu strjúka upp frá neðri hluta skjásins með tveimur fingrum.\n\nTil að skipta á milli eiginleika skaltu strjúka upp með tveimur fingrum og halda inni."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Halda inni hljóðstyrkstökkum"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"halda inni hljóðstyrkstökkum"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Haltu báðum hljóðstyrkstökkunum inni"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Ýtt þrisvar á skjáinn með tveimur fingrum"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ýtt þrisvar á skjáinn með tveimur fingrum"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Ýtt hratt á skjáinn {0,number,integer} sinnum með tveimur fingrum"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ýta þrisvar á skjá"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ýta þrisvar á skjá"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ýttu snögglega á skjáinn {0,number,integer} sinnum. Þessi flýtileið kann að hægja á tækinu"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Nota titring og snertisvörun"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Titringur viðvarana"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Titringur margmiðlunarefnis"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Lyklaborðstitringur"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Titringur hringingar"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Titringur tilkynninga"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Snertisvörun"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ef þú takmarkar bakgrunnsvirkni forrits gæti það látið illa"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Forrit notar ekki fínstillingu á rafhlöðu og því er ekki hægt að takmarka það.\n\nKveiktu á fínstillingu til að takmarka."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Stjórna rafhlöðunotkun"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Ótakmörkuð"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Fínstillt"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Takmarkað"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"textastærð, stórt letur, stór leturgerð, stór texti, sjónskerðing, stækka texta, leturstækkari, leturstækkun"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"alltaf kveikt á hvíldarskjá, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, merki, lesari"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"lyklaborð, snertisvörun, titra,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Hljóðstyrkur, titringur, ónáðið ekki"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Hljóðstyrkur margmiðlunarefnis"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Hljóðstyrkur sendingar"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Leyfa aðgang til að stjórna öllum skrám"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Leyfa þessu forriti að lesa, breyta og eyða öllum skrám í þessu tæki eða tengdum geymsludrifum. Ef heimild er veitt fær forritið aðgang að skránum þínum án þess að þér sé tilkynnt sérstaklega um það."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Hefur aðgang að öllum skrám"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Tilkynningar á öllum skjánum"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Leyfa tilkynningar á öllum skjánum frá þessu forriti"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Leyfa forritinu að birta tilkynningar á öllum skjánum þegar tækið er læst. Forrit kunna að nota þennan eiginleika til að leggja áherslu á vekjara, móttekin símtöl og aðrar áríðandi tilkynningar."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Heiti tækisins er sýnilegt uppsettum forritum. Heiti þess er hugsanlega einnig sýnilegt öðru fólki þegar þú tengist Bluetooth-tækjum, WiFi-neti eða setur upp heitan WiFi-reit."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Kyn"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Veldu kyn"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Leitar að sviksamlegum forritum"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Leita að vefveiðum í forritavirkni"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Nota leit"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Nota leit í vinnuforritum"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index fe5c169..2c24505 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Disattiva Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Disattiva la funzionalità Bluetooth LE audio se il dispositivo supporta funzioni hardware LE audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Mostra comandi LE audio nei dettagli dispositivo"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Ignora lista consentita Bluetooth LE audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Usa LE audio per impostazione predefinita anche se non è stato verificato che la periferica LE audio soddisfa i criteri della lista consentita."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivi multimediali"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivi di chiamata"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Altri dispositivi"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivi salvati"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associato all\'account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Utilizzato in precedenza con l\'account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Il Bluetooth verrà attivato per consentire l\'accoppiamento"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferenze di connessione"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Connessi in precedenza"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Scrivi nei campi di testo"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignora tutti i pulsanti premuti con lo stilo"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stilo"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Condivisione audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Condividi audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Chiamate e sveglie"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Data e ora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Cancella"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Spazio privato"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Nascondi le app in una cartella privata"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Sblocca usando il blocco schermo"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostra Spazio privato"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Nascondi quando è bloccato"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Nascondi Spazio privato quando è bloccato"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Per evitare che altre persone sappiano che lo Spazio privato è sul tuo dispositivo, puoi nasconderlo dal tuo elenco di app"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Accedi allo Spazio privato quando è nascosto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Cerca \"Spazio privato\" nella barra di ricerca"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tocca il riquadro Spazio privato"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Sblocca il tuo Spazio privato"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"On"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Crea Spazio privato"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Elimina Spazio privato"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Impossibile creare lo Spazio privato"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Spazio privato eliminato"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Impossibile eliminare lo Spazio privato"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Imposta un blocco schermo"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Per utilizzare Spazio privato, imposta un blocco schermo."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Imposta blocco schermo"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Annulla"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Annulla"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configura"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configura Spazio privato"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Nascondi le app private in uno spazio sicuro a cui puoi accedere soltanto tu"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Come funziona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Puoi accedere allo Spazio privato dalla parte inferiore del tuo elenco di app"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Le app nello Spazio privato sono protette da un blocco"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Le notifiche delle app nello Spazio privato vengono nascoste quando quest\'ultimo è bloccato"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Quando lo Spazio privato è bloccato, le relative app non vengono visualizzate in gestione autorizzazioni, dashboard della privacy e altre impostazioni"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configurazione dello Spazio privato in corso…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Lo Spazio privato è protetto da un blocco"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Le informazioni sull\'utilizzo delle app dello Spazio privato vengono nascoste quando quest\'ultimo è bloccato"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accedi allo Spazio privato dal tuo elenco di app"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Impossibile configurare lo Spazio privato"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Riprova adesso o in un secondo momento"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Riprova"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Utilizzare il blocco schermo per sbloccare?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Puoi sbloccare lo Spazio privato nello stesso modo in cui sblocchi il tuo dispositivo oppure scegliere un blocco diverso"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usa il blocco schermo"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Scegli un nuovo blocco"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Fatto."</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Per accedere allo Spazio privato, scorri verso l\'alto dalla parte inferiore della schermata Home, quindi scorri verso il basso"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Fine"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scorri verso il basso per accedere allo Spazio privato"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Puoi aggiungere fino a <xliff:g id="COUNT">%d</xliff:g> impronte digitali"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Hai aggiunto il numero massimo di impronte digitali"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Impossibile aggiungere ulteriori impronte digitali"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continua a usare le app quando chiuso"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Display fluido"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Aumenta automaticamente la frequenza di aggiornamento da 60 a <xliff:g id="ID_1">%1$s</xliff:g> Hz per alcuni contenuti. Comporta un maggior utilizzo della batteria"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Aumenta automaticamente la frequenza di aggiornamento fino a <xliff:g id="ID_1">%1$d</xliff:g> Hz per alcuni contenuti. Comporta un maggior utilizzo della batteria."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forza frequenza di aggiornamento massima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Massima frequenza di aggiornamento per migliore reattività al tocco e qualità dell\'animazione; aumenta il consumo della batteria"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Schermo vigile"</string>
@@ -1198,7 +1244,7 @@
<string name="device_info_not_available" msgid="4804474466616712326">"Non disponibile"</string>
<string name="storage_settings" msgid="7472188817781592677">"Spazio di archiviazione"</string>
<string name="storage_settings_for_app" msgid="229425418984637483">"Spazio di archiviazione e cache"</string>
- <string name="storage_settings_title" msgid="486118156723194815">"Impostazioni memoria"</string>
+ <string name="storage_settings_title" msgid="486118156723194815">"Impostazioni spazio di archiviazione"</string>
<string name="status_eid" msgid="7532406028683438634">"EID"</string>
<string name="eid_multi_sim" msgid="9087924808336397804">"EID (slot per la SIM <xliff:g id="EID_SLOT_ID">%1$d</xliff:g>)"</string>
<string name="imei_multi_sim" msgid="9001570420423929507">"IMEI (slot SIM <xliff:g id="IMEI_SLOT_ID">%1$d</xliff:g>)"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Impostazioni comuni"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Modifica punto di accesso"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nessuna impostazione"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nessuna impostazione"</string>
<string name="apn_name" msgid="6677695784108157953">"Nome"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Usa il pulsante Accessibilità per aprire"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Tieni premuti i tasti del volume per aprire"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Tocca tre volte lo schermo per aprire"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Tocca tre volte lo schermo con due dita per aprire"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Usa un gesto per aprire"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usa il gesto di accessibilità"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Per usare questa funzione, tocca il pulsante Accessibilità <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> nella parte inferiore dello schermo.\n\nPer spostarti tra le funzioni, tocca e tieni premuto il pulsante Accessibilità."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Per usare questa funzione, tocca il pulsante Accessibilità sullo schermo."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Per usare questa funzionalità, tieni premuti entrambi i tasti del volume."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Per avviare e interrompere l\'ingrandimento, tocca tre volte un punto qualsiasi dello schermo."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Per avviare e interrompere l\'ingrandimento, tocca tre volte un punto dello schermo con due dita."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Per usare questa funzione, scorri verso l\'alto dalla parte inferiore dello schermo con due dita.\n\nPer spostarti tra le funzioni, scorri verso l\'alto con due dita e tieni premuto."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Per usare questa funzione, scorri verso l\'alto dalla parte inferiore dello schermo con tre dita.\n\nPer spostarti tra le funzioni, scorri verso l\'alto con tre dita e tieni premuto."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Per usare una funzione di accessibilità, scorri verso l\'alto dalla parte inferiore dello schermo con due dita.\n\nPer spostarti tra le funzioni, scorri verso l\'alto con due dita e tieni premuto."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Tieni premuti i tasti del volume"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"tieni premuti i tasti del volume"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Tieni premuti entrambi i tasti del volume"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Tocca tre volte lo schermo con due dita"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"tocca tre volte lo schermo con due dita"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Tocca rapidamente lo schermo {0,number,integer} volte con due dita"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tocca 3 volte lo schermo"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tocca tre volte lo schermo"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Tocca lo schermo {0,number,integer} volte in rapida successione. Questa scorciatoia potrebbe rallentare il dispositivo."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Usa vibrazione e feedback aptico"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibrazione sveglia"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibrazione contenuti multimediali"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibrazione tastiera"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibrazione squillo"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibrazione notifiche"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Feedback al tocco"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Se limiti l\'attività in background per un\'app, tale app potrebbe funzionare in modo anomalo"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Per limitare l\'app,\n\ndevi prima attivare l\'ottimizzazione della batteria."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gestisci l\'utilizzo della batteria"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Senza limitazioni"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Ottimizzato"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Con limitazioni"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"dimensioni del testo, stampa grande, carattere grande, testo grande, ipovedente, ingrandimento del testo, ingranditore di carattere, ingrandimento di carattere"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"display Ambient sempre acceso, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, lettore"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastiera, tecnologia aptica, vibrazione,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibrazione, Non disturbare"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume contenuti multimediali"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume di trasmissione"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Consenti l\'accesso per gestire tutti i file"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Consenti a questa app di leggere, modificare ed eliminare tutti i file memorizzati su questo dispositivo o su qualsiasi volume di archiviazione collegato. Se concedi l\'autorizzazione, l\'app potrà accedere ai file senza informarti."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Possono accedere a tutti i file"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notifiche a schermo intero"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Consenti notifiche a schermo intero di questa app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Consenti a questa app di mostrare notifiche a schermo intero quando il dispositivo è bloccato. L\'app potrebbe usarle per mettere in evidenza sveglie, chiamate in arrivo o altre notifiche urgenti."</string>
@@ -4020,7 +4081,7 @@
<string name="system_navigation_title" msgid="4890381153527184636">"Modalità di navigazione"</string>
<string name="swipe_up_to_switch_apps_title" msgid="6677266952021118342">"Navigazione con due pulsanti"</string>
<string name="swipe_up_to_switch_apps_summary" msgid="1415457307836359560">"Per cambiare app, scorri verso l\'alto sul pulsante Home. Scorri ancora verso l\'alto per visualizzare tutte le app. Per tornare indietro, tocca il pulsante Indietro."</string>
- <string name="emergency_settings_preference_title" msgid="6183455153241187148">"Sicurezza ed emergenza"</string>
+ <string name="emergency_settings_preference_title" msgid="6183455153241187148">"Sicurezza ed emergenze"</string>
<string name="emergency_dashboard_summary" msgid="401033951074039302">"SOS emergenze, informazioni mediche, avvisi"</string>
<string name="edge_to_edge_navigation_title" msgid="714427081306043819">"Navigazione tramite gesti"</string>
<string name="edge_to_edge_navigation_summary" msgid="818109176611921504">"Per andare alla schermata Home, scorri verso l\'alto dalla parte inferiore dello schermo. Per cambiare app, scorri verso l\'alto dalla parte inferiore dello schermo, tieni premuto e rilascia. Per tornare indietro, scorri dal bordo sinistro o destro."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Il nome del tuo dispositivo è visibile alle app installate. Potrebbe essere visibile anche ad altre persone quando ti connetti a dispositivi Bluetooth, a una rete Wi-Fi o configuri un hotspot Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Genere grammaticale"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Seleziona genere grammaticale"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Scansione delle app ingannevoli"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Controlla l\'attività delle app per verificare la presenza di phishing"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usa la scansione"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usa la scansione per le app di lavoro"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 6c5195a..a19d5a6 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"השבתה של Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"האפשרות הזו משביתה את התכונה Bluetooth LE Audio אם המכשיר תומך ביכולות חומרה של LE audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"הצגת המתג של LE audio בפרטי המכשיר"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"מעקף רשימת ההיתרים של Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"שימוש ב-LE Audio כברירת מחדל גם אם הציוד ההיקפי של ה-LE Audio לא אומת כעומד בקריטריונים של רשימת ההיתרים."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"מכשירים לאחסון מדיה"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"מכשירי התקשרות"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"מכשירים אחרים"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"מכשירים שמורים"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"מקושר לחשבון"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"נעשה שימוש לאחרונה בחשבון"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth יופעל לצורך התאמה"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"העדפות חיבור"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"מכשירים שחוברו בעבר"</string>
@@ -134,6 +133,18 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"כתיבה בשדות טקסט"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"התעלמות מכל הלחיצות של הסטיילוס"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"סטיילוס"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"שיתוף של אודיו"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"שיתוף האודיו"</string>
+ <!-- no translation found for calls_and_alarms_device_title (6993559028175454198) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"תאריך ושעה"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"שרת Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ניקוי"</string>
@@ -537,7 +548,15 @@
<string name="private_space_title" msgid="7078627930195569767">"מרחב פרטי"</string>
<string name="private_space_summary" msgid="8237652417163408001">"הסתרת אפליקציות בתיקייה פרטית"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ביטול הנעילה באמצעות נעילת מסך"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"הצגה של המרחב הפרטי"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"הסתרה במצב נעילה"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"הסתרת המרחב הפרטי במצב נעילה"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"כדי למנוע מאנשים אחרים לדעת שהמרחב הפרטי מופעל במכשיר, אפשר להסתיר אותו מרשימת האפליקציות"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"גישה למרחב הפרטי כשהוא במצב הסתרה"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"חיפוש \'מרחב פרטי\' בסרגל החיפוש"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"מקישים על פקד ההגדרה המהירה \'מרחב פרטי\'"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ביטול הנעילה של המרחב הפרטי"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"מצב מושבת"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"מצב פעיל"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"מערכת"</string>
<string name="private_space_create_title" msgid="47273568884806726">"יצירת מרחב פרטי"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"מחיקת מרחב פרטי"</string>
@@ -546,6 +565,51 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"לא ניתן היה ליצור מרחב פרטי"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"מחקת את המרחב הפרטי"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"לא ניתן היה למחוק את המרחב הפרטי"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"הגדרת נעילת מסך"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"כדי להשתמש במרחב הפרטי, עליך להגדיר נעילת מסך במכשיר הזה."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"הגדרה של נעילת מסך"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ביטול"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ביטול"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"הגדרה"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"הגדרה של מרחב פרטי"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"הסתרה של אפליקציות פרטיות במרחב מאובטח שרק לך יש גישה אליו"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"איך זה עובד"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"אפשר לגשת למרחב הפרטי בחלק התחתון של רשימת האפליקציות שלך"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"אפליקציות במרחב הפרטי מוגנות באמצעות נעילה"</string>
+ <!-- no translation found for privatespace_hidden_notifications_text (8121285743543004812) -->
+ <skip />
+ <!-- no translation found for privatespace_apps_permission_text (4418511924151828812) -->
+ <skip />
+ <!-- no translation found for privatespace_setting_up_text (8532777749891406509) -->
+ <skip />
+ <!-- no translation found for privatespace_lock_protected_title (7409801274869666860) -->
+ <skip />
+ <!-- no translation found for privatespace_apps_hidden_title (6146605677591599107) -->
+ <skip />
+ <!-- no translation found for privatespace_access_from_apps_title (6787000636686810564) -->
+ <skip />
+ <!-- no translation found for privatespace_error_screen_title (8658511165913662275) -->
+ <skip />
+ <!-- no translation found for privatespace_error_screen_summary (5679626031159521676) -->
+ <skip />
+ <!-- no translation found for privatespace_tryagain_label (4091466165724929876) -->
+ <skip />
+ <!-- no translation found for privatespace_lockscreen_title (7459425150560213662) -->
+ <skip />
+ <!-- no translation found for privatespace_lockscreen_summary (980268845497843861) -->
+ <skip />
+ <!-- no translation found for privatespace_use_screenlock_label (2775404941450049991) -->
+ <skip />
+ <!-- no translation found for privatespace_set_lock_label (6277529807188602545) -->
+ <skip />
+ <!-- no translation found for privatespace_success_title (4854425684898602993) -->
+ <skip />
+ <!-- no translation found for privatespace_access_text (8756118686974614618) -->
+ <skip />
+ <!-- no translation found for privatespace_done_label (5534818213879562387) -->
+ <skip />
+ <!-- no translation found for scrolldown_to_access (5160743933093369151) -->
+ <skip />
<string name="fingerprint_add_max" msgid="8639321019299347447">"אפשר להוסיף עד <xliff:g id="COUNT">%d</xliff:g> טביעות אצבע"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"הוספת את המספר המרבי של טביעות אצבע."</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"לא ניתן להוסיף עוד טביעות אצבע"</string>
@@ -1063,7 +1127,8 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"המשך שימוש באפליקציות כשהמכשיר מקופל"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"תצוגה חלקה"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"קצב הרענון עולה באופן אוטומטי מ-60 ל-Hz<xliff:g id="ID_1">%1$s</xliff:g> לחלק מהתוכן. השימוש בסוללה יוגבר."</string>
+ <!-- no translation found for peak_refresh_rate_summary (3212309985294885790) -->
+ <skip />
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"אילוץ לקצב הרענון המקסימלי"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"קצב הרענון הגבוה ביותר לתגובה משופרת למגע ולאיכות אנימציה טובה יותר. פעולה זו מגבירה את השימוש בסוללה."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"המסך יישאר דלוק בזמן צפייה"</string>
@@ -1299,6 +1364,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"הגדרות שיתופיות"</string>
<string name="apn_settings" msgid="4295467389400441299">"פריטי APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"עריכת נקודת גישה"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"לא בוצעה הגדרה"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"לא הוגדר"</string>
<string name="apn_name" msgid="6677695784108157953">"שם"</string>
@@ -1933,12 +2000,16 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"שימוש בלחצן הנגישות לצורך פתיחה"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"לחיצה ארוכה על לחצני עוצמת הקול כדי לפתוח"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"מקישים שלוש פעמים על המסך כדי לפתוח"</string>
+ <!-- no translation found for accessibility_tutorial_dialog_title_two_finger_triple (1090593773487065541) -->
+ <skip />
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"שימוש בתנועה לצורך פתיחה"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"שימוש בתנועה להפעלת תכונות הנגישות"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"כדי להשתמש בתכונה זו, יש להקיש על לחצן הנגישות <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> שבתחתית המסך.\n\nכדי לעבור בין התכונות השונות, יש ללחוץ לחיצה ארוכה על לחצן הנגישות."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"כדי להשתמש בתכונה הזו, יש להקיש על לחצן הנגישות במסך."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"כדי להשתמש בתכונה הזו, יש ללחוץ לחיצה ארוכה על שני הלחצנים של עוצמת הקול."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"כדי להפעיל הגדלה ולהפסיק אותה, יש להקיש שלוש פעמים במיקום כלשהו במסך."</string>
+ <!-- no translation found for accessibility_tutorial_dialog_message_two_finger_triple (6205072282308562361) -->
+ <skip />
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"כדי להשתמש בתכונה זו, יש להחליק כלפי מעלה מתחתית המסך באמצעות שתי אצבעות.\n\nכדי לעבור בין התכונות השונות, יש להחליק כלפי מעלה באמצעות שתי אצבעות ולהחזיק."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"כדי להשתמש בתכונה זו, יש להחליק כלפי מעלה מתחתית המסך באמצעות שלוש אצבעות.\n\nכדי לעבור בין התכונות השונות, יש להחליק כלפי מעלה באמצעות שלוש אצבעות ולהחזיק."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"כדי להשתמש בתכונת הנגישות, יש להחליק כלפי מעלה מתחתית המסך באמצעות שתי אצבעות.\n\nכדי לעבור בין התכונות השונות, יש להחליק כלפי מעלה באמצעות שתי אצבעות ולהחזיק."</string>
@@ -1960,6 +2031,12 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"לחיצה ארוכה על לחצני עוצמת הקול"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"לחיצה ארוכה על לחצני עוצמת הקול"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"יש ללחוץ לחיצה ארוכה על שני הלחצנים של עוצמת הקול"</string>
+ <!-- no translation found for accessibility_shortcut_edit_dialog_title_two_finger_triple_tap (6687765191490040899) -->
+ <skip />
+ <!-- no translation found for accessibility_shortcut_two_finger_triple_tap_keyword (4200744613585702430) -->
+ <skip />
+ <!-- no translation found for accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap (2631127444247448793) -->
+ <skip />
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"הקשה על המסך 3 פעמים"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"הקשה שלוש פעמים על המסך"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"מקישים במהירות על המסך {0,number,integer} פעמים. קיצור הדרך הזה עלול להאט את פעולת המכשיר"</string>
@@ -2047,8 +2124,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"שימוש ברטט ובמשוב פיזי"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"רטט של שעון מעורר"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"רטט של פריט מדיה"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"רטט של המקלדת"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"רטט הצלצול"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"רטט של התראה"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"משוב מגע"</string>
@@ -2258,6 +2334,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"הגבלת הפעילות של אפליקציה ברקע עלולה לשבש את פעולתה"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"מכיוון שהאפליקציה לא מוגדרת לאופטימיזציה של הסוללה, לא ניתן להגבילה.\n\nכדי להגביל אותה, תחילה יש להפעיל אופטימיזציה של הסוללה."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ניהול השימוש בסוללה"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ללא הגבלות"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"אופטימיזציה"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"מוגבל"</string>
@@ -3059,8 +3139,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"גודל הטקסט, אותיות גדולות, גופן גדול, טקסט גדול, לקוי ראייה, הגדלת טקסט, מגדיל טקסט"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"תצוגת אווירה פועלת כל הזמן (AOD)"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"תג NFC, nfc, תג, קורא"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"מקלדת, משוב פיזי, רטט,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"עוצמת קול, רטט ומצב \'נא לא להפריע\'"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"עוצמת קול של מדיה"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"עוצמת הקול בהעברה"</string>
@@ -3769,6 +3848,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"הרשאת גישה לניהול כל הקבצים"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"לאפליקציה הזו תהיה הרשאה לקרוא, לשנות ולמחוק את כל הקבצים במכשיר הזה או בכל אחסון שמחובר אליו. אם ההרשאה ניתנת, האפליקציה תורשה לגשת לקבצים מבלי ליידע אותך במפורש."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"יכולת גישה לכל הקבצים"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"התראות במסך מלא"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"מתן הרשאה להצגת התראות במסך מלא מהאפליקציה הזו"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"מתן הרשאה לאפליקציה הזו להציג התראות במסך מלא כשהמכשיר נעול. אפליקציות יכולות להשתמש בהרשאה הזו כדי להציג התראות, שיחות נכנסות או הודעות דחופות אחרות."</string>
@@ -4841,8 +4926,8 @@
<string name="flash_notifications_note" msgid="2426125248448055075">"אם יש לך רגישות לאור, כדאי להשתמש בהתראות הבהוב בזהירות"</string>
<string name="flash_notifications_keywords" msgid="2458759275318514836">"פלאש, אור, כבד שמיעה, אובדן שמיעה"</string>
<string name="flash_notifications_preview" msgid="5320176885050440874">"תצוגה מקדימה"</string>
- <string name="camera_flash_notification_title" msgid="2475084876382922732">"הפלאש של המצלמה"</string>
- <string name="screen_flash_notification_title" msgid="3773100725793316708">"הבזק מסך"</string>
+ <string name="camera_flash_notification_title" msgid="2475084876382922732">"הבהוב פלאש"</string>
+ <string name="screen_flash_notification_title" msgid="3773100725793316708">"הבהוב במסך"</string>
<string name="screen_flash_notification_color_title" msgid="7213407653340970790">"צבע להבזק מסך"</string>
<string name="screen_flash_color_blue" msgid="3585766657607931371">"כחול"</string>
<string name="screen_flash_color_azure" msgid="8691198532944992243">"תכלת"</string>
@@ -4885,6 +4970,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"בדיקת הפעילות באפליקציה לאיתור פישינג"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"שימוש בסריקה"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"שימוש בסריקה באפליקציה לעבודה"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"הסריקה פועלת ישירות במכשיר באופן פרטי ובודקת את הפעילות באפליקציה לאיתור פישינג או התנהגות מטעה אחרת. במקרה שהתנהגות כזו אותרה, חלק מהמידע של האפליקציה נשלח אל Google Play Protect כדי לאשר שנמצא איום ולהזהיר את משתמשי האפליקציה."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"זהו אמצעי אבטחה מוגן. אף אחד מפרטי המכשיר או הפרטים האישיים לא משותף עם Google. \n\nפישינג הוא ניסיון לגנוב פרטי כניסה או פרטים אישיים אחרים."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 5fb8249..132a735 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audio を無効にする"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"デバイスが LE オーディオ ハードウェア機能に対応している場合に、Bluetooth LE Audio 機能を無効にします。"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE Audio の切替をデバイスの詳細に表示"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio の許可リストを回避する"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio の周辺機器が許可リストの基準を満たしていない場合でも、デフォルトで LE Audio を使用します。"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"メディア デバイス"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"通話デバイス"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"その他のデバイス"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"保存済みのデバイス"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"アカウントと関連付けられています"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"アカウントで以前使用していたもの"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ペア設定できるよう Bluetooth が ON になります"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"接続の詳細設定"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ペア設定済み"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"テキスト フィールドに入力"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"タッチペンのボタン押下をすべて無視する"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"タッチペン"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"音声の共有"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"音声を共有"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"通話とアラーム"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE Audio ストリームへの接続"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"付近の音声ストリーム"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"音声ストリーム"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR コードを使用して音声ストリームに接続します"</string>
<string name="date_and_time" msgid="1788358029823431692">"日付と時刻"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"プロキシ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"消去"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"プライベート スペース"</string>
<string name="private_space_summary" msgid="8237652417163408001">"プライベート フォルダ内のアプリを非表示にする"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"画面ロックを使用してロックを解除する"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"プライベート スペースの表示"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ロック時に表示しない"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ロック時にプライベート スペースを表示しない"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"プライベート スペースがデバイスにあることを秘密にするために、アプリのリストで非表示にできます"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"非表示にプライベート スペースにアクセスする"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"検索バーで「プライベート スペース」を検索する"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"[プライベート スペース] のタイルをタップする"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"プライベート スペースをロック解除する"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"OFF"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ON"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"システム"</string>
<string name="private_space_create_title" msgid="47273568884806726">"プライベート スペースの作成"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"プライベート スペースの削除"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"プライベート スペースを作成できませんでした"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"プライベート スペースを削除しました"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"プライベート スペースを削除できませんでした"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"画面ロックの設定"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"プライベート スペースを使うにはデバイスに画面ロックが必要です"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"画面ロックを設定"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"キャンセル"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"キャンセル"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"設定"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"プライベート スペースの設定"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"あなただけがアクセスできる安全な領域に限定公開アプリは表示されません"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"仕組み"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"アプリのリストの下部からプライベート スペースにアクセスできます"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"プライベート スペースのアプリはロックによって保護されます"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"プライベート スペースがロックされているときは、プライベート スペースにアプリからの通知は表示されません"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"プライベート スペースがロックされているときは、権限マネージャ、プライバシー ダッシュボード、その他の設定にプライベート スペース アプリは表示されません"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"プライベート スペースを設定しています…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"プライベート スペースはロックによって保護されています"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"プライベート スペースがロックされているときは、プライベート スペース アプリの使用状況に関する情報は表示されません"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"アプリのリストからプライベート スペースにアクセス"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"プライベート スペースを設定できませんでした"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"今すぐもう一度試すか、後でやり直してください"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"再試行"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ロック解除に画面ロックを使用しますか?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"デバイスのロック解除と同じ方法でプライベート スペースのロックを解除するか、別のロックを選択できます"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"画面ロックを使用"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"新しいロックを選択"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"設定完了"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"プライベート スペースにアクセスするには、ホーム画面を下から上にスワイプし、下にスクロールします"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"完了"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"プライベート スペースにアクセスするには下にスクロールします"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"最大で <xliff:g id="COUNT">%d</xliff:g> 件の指紋を追加できます"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"追加された指紋の数が上限に達しました"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"これ以上、指紋を追加できません"</string>
@@ -574,7 +616,7 @@
<string name="setup_lock_settings_options_dialog_title" msgid="7985107300517468569">"画面ロックの方法"</string>
<string name="lock_screen_auto_pin_confirm_title" msgid="3012128112186088375">"ロック解除を自動で確認する"</string>
<string name="lock_screen_auto_pin_confirm_summary" msgid="9050818870806580819">"6 桁以上の正しい PIN が入力されると自動的にロック解除します。[入力] をタップして確認するよりも、安全面でやや劣ります。"</string>
- <string name="auto_pin_confirm_user_message" msgid="6194556173488939314">"正しい PIN を自動で確認します"</string>
+ <string name="auto_pin_confirm_user_message" msgid="6194556173488939314">"正しい PIN を自動で確認する"</string>
<string name="auto_pin_confirm_opt_in_security_message" msgid="580773976736184893">"[入力] をタップして PIN を確認するほうが、自動確認を使うよりも安全です"</string>
<string name="auto_confirm_on_pin_verify_description" msgid="2052240431173223502">"自動確認を有効にするには、デバイスの PIN を入力してください"</string>
<string name="auto_confirm_off_pin_verify_description" msgid="4256219155659760047">"自動確認を無効にするには、デバイスの PIN を入力してください"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"折りたたみ時もアプリの使用を継続"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"スムーズ ディスプレイ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"コンテンツに応じて、リフレッシュ レートを自動的に 60 Hz から <xliff:g id="ID_1">%1$s</xliff:g> Hz に変更します。バッテリー使用量が増えます。"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"コンテンツに応じて、リフレッシュ レートを自動的に <xliff:g id="ID_1">%1$d</xliff:g> Hz に変更します。バッテリー使用量が増えます。"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ピーク時のリフレッシュ レートの適用"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"最高のリフレッシュ レートを適用します。タップの反応とアニメーションの品質が向上します。バッテリー使用量が増えます。"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"スクリーン アテンション"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"共用の設定"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"アクセスポイントの編集"</string>
+ <string name="apn_add" msgid="9069613192201630934">"アクセス ポイントの追加"</string>
<string name="apn_not_set" msgid="8246646433109750293">"未設定"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"未設定"</string>
<string name="apn_name" msgid="6677695784108157953">"名前"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ユーザー補助機能ボタンで開く"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"両方の音量ボタンを長押しして開く"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"画面をトリプルタップして開く"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"2 本の指で画面をトリプルタップして開く"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ジェスチャーで開く"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ユーザー補助操作を使用する"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"この機能を使用するには、画面の下部にあるユーザー補助機能ボタン <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> をタップします。\n\n機能を切り替えるには、ユーザー補助機能ボタンを長押しします。"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"この機能を使用するには、画面上のユーザー補助機能ボタンをタップしてください。"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"この機能を使用するには、音量大と音量小の両方のボタンを長押しします。"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"拡大を開始および停止するには、画面をトリプルタップします。"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"拡大を開始および停止するには、2 本の指で画面をトリプルタップします。"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"この機能を使用するには、2 本の指で画面の下から上にスワイプします。\n\n機能を切り替えるには、2 本の指で上にスワイプしたまま長押しします。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"この機能を使用するには、3 本の指で画面の下から上にスワイプします。\n\n機能を切り替えるには、3 本の指で上にスワイプしたまま長押しします。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ユーザー補助機能を使用するには、2 本の指で画面の下から上にスワイプします。\n\n機能を切り替えるには、2 本の指で上にスワイプしたまま長押しします。"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"音量ボタンを長押し"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"音量大と音量小の両方のボタンを長押し"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"音量大と音量小の両方のボタンを長押しします"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"2 本の指で画面をトリプルタップ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"2 本の指で画面をトリプルタップ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"2 本の指で画面を {0,number,integer} 回すばやくタップします"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"画面をトリプルタップ"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"画面をトリプルタップ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"画面をすばやく {0,number,integer} 回タップします。このショートカットを使うと、デバイスの動作が遅くなる場合があります"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"バイブレーションとハプティクスの使用"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"アラームのバイブレーション"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"メディアのバイブレーション"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"キーボードのバイブレーション"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"着信時のバイブレーション"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"通知時のバイブレーション"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"触覚フィードバック"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"アプリのバックグラウンド アクティビティを制限すると、アプリが正常に機能しないことがあります"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"このアプリは、電池の最適化が設定されていないため、制限することはできません。\n\nこのアプリを制限するには、電池の最適化を ON にしてください。"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"バッテリー使用状況の管理"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"バックグラウンドでの使用の許可"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"リアルタイムのアップデートを利用する場合は有効に、バッテリーを節約したい場合は無効にしてください"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"制限なし"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"最適化"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"制限"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"テキスト サイズ, 大きい 活字, 大きい フォント, 大きい テキスト, ロー ビジョン, 切り替え テキスト 大きく, フォント 大きく, フォント 拡大"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"常時オンのアンビエント表示, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, タグ, リーダー"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"キーボード、ハプティクス、振動"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"音量、バイブレーション、サイレント モード"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"メディアの音量"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"キャストの音量"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"全ファイルの管理権を付与"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"このアプリに対して、デバイス内または接続されているストレージ ボリューム内のファイルすべての参照、変更、削除を許可します。許可されている場合、アプリがユーザーの事前の承認なしにファイルにアクセスすることもあります。"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"すべてのファイルにアクセス可能"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"全画面通知"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"このアプリからの全画面通知を許可する"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"デバイスがロックされているときに通知を全画面に表示することを、このアプリに許可します。アプリはこの設定を、アラーム、着信、緊急通知などを強調するために使用することがあります。"</string>
@@ -4809,8 +4863,8 @@
<string name="aspect_ratio_title" msgid="2451826875939676101">"アスペクト比"</string>
<string name="aspect_ratio_summary" msgid="4056406351663726494">"このアプリがお使いの <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 用に設計されていない場合は、新しいアスペクト比で表示してみてください"</string>
<string name="aspect_ratio_main_summary" msgid="4141964559612756940">"このアプリがお使いの <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 用に設計されていない場合は、新しいアスペクト比で表示してみてください。アプリによっては特定のアスペクト比で最適化できない場合があります。"</string>
- <string name="aspect_ratio_summary_text" msgid="4737461467467220325">"このアプリがお使いの <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 用に設計されていない場合は、新しいアスペクト比で表示してみてください"</string>
- <string name="aspect_ratio_main_summary_text" msgid="5544816872094235840">"このアプリがお使いの <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 用に設計されていない場合は、新しいアスペクト比で表示してみてください。アプリによっては特定のアスペクト比で最適化できない場合があります。"</string>
+ <string name="aspect_ratio_summary_text" msgid="4737461467467220325">"アプリがお使いの <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 用に設計されていない場合は、新しいアスペクト比で表示してみてください"</string>
+ <string name="aspect_ratio_main_summary_text" msgid="5544816872094235840">"アプリがお使いの <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 用に設計されていない場合は、新しいアスペクト比で表示してみてください。アプリによっては特定のアスペクト比で最適化できない場合があります。"</string>
<string name="user_aspect_ratio_suggested_apps_label" msgid="8085934042329632039">"候補アプリ"</string>
<string name="user_aspect_ratio_changed_apps_label" msgid="2096614916172567672">"変更したアプリ"</string>
<string name="user_aspect_ratio_app_default" msgid="270065763307617837">"アプリのデフォルト"</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"フィッシングに関するアプリのアクティビティを確認する"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"スキャンを使用する"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"仕事用アプリにスキャンを使用する"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"お使いのデバイス上でスキャンを非公開で実行し、フィッシングなどの不正な動作をアプリが行っていないか確認します。不正な動作を確認した場合は、一部のアプリ情報を Google Play プロテクトに送信し、危険度を判別して、アプリのユーザーに警告を行います。"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"これは保護されたセキュリティ機能です。デバイス情報や個人情報は Google と共有されません。\n\nフィッシングとは、ログイン認証情報などの個人情報を不正に入手しようとする試みのことです。"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 4e30c22..d8cb668 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE-აუდიოს გათიშვა"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Bluetooth LE AUDIO-ს ფუნქცია ითიშება, თუ მოწყობილობას აქვს LE AUDIO-ს აპარატურული გარჩევადობები."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE-აუდიო გადართვის ჩვენება მოწყობილობის დეტალებში"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE-აუდიოს დაშვებულთა სიისთვის გვერდის ავლა"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"გამოიყენეთ LE-აუდიო ნაგულისხმევი სახით, თუნდაც LE-აუდიო პერიფერიული მოწყობილობა არ შეესაბამებოდეს დაშვებულთა სიის კრიტერიუმს."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"მედია მოწყობილობები"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"მოწყობილობებზე დარეკვა"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"სხვა მოწყობილობები"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"შენახული მოწყობილობები"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ანგარიშთან დაკავშირებული"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ადრე გამოიყენებოდა ანგარიშთან"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"დასაწყვილებლად ჩაირთვება Bluetooth"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"კავშირის პარამეტრები"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"წარსულში დაკავშირებული"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"დაწერეთ ტექსტურ ველებში"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"იგნორირება გაუკეთეთ სტილუსის ღილაკების ყველა დაჭერას"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"სტილუსი"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"აუდიოს გაზიარება"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"აუდიოს გაზიარება"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ზარები და მაღვიძარები"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"დაუკავშირდით LE-აუდიო ნაკადს"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"ახლომახლო აუდიო ნაკადები"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"აუდიო ნაკადები"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"დაუკავშირდით აუდიო ნაკადს QR კოდის გამოყენებით"</string>
<string name="date_and_time" msgid="1788358029823431692">"თარიღი და დრო"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"პროქსი"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"გაწმენდა"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"პირადი სივრცე"</string>
<string name="private_space_summary" msgid="8237652417163408001">"აპების დამალვა პირად საქაღალდეში"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ეკრანის დაბლოკვის გამოყენებით განბლოკვა"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"პირადი სივრცის ჩვენება"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"დამალვა ჩაკეტილ მდგომარეობაში"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"პირადი სივრცის დამალვა ჩაკეტილ მდგომარეობაში"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"შეგიძლიათ დამალოთ პირადი სივრცე თქვენი აპების გვერდიდან, თუ არ გსურთ, რომ სხვებმა იცოდნენ, პირად სივრცეს რომ იყენებთ თქვენს მოწყობილობაზე"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"წვდომა პირად სივრცეზე, როცა დამალულია"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"მოძებნეთ „პირადი სივრცე“ ძიების ზოლში"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"შეეხეთ Private Space მოზაიკის ფილას"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"განბლოკეთ თქვენი პირადი სივრცე"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"გამორთული"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ჩართული"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"სისტემა"</string>
<string name="private_space_create_title" msgid="47273568884806726">"პირადი სივრცის შექმნა"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"პირადი სივრცის წაშლა"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"პირადი სივრცის შექმნა ვერ მოხერხდა"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"პირადი სივრცე წარმატებით წაიშალა"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"პირადი სივრცის წაშლა ვერ მოხერხდა"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"დააყენეთ ეკრანის დაბლოკვა"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"პირადი სივრცის გამოსაყენებლად დააყენეთ ეკრანის დაბლოკვა ამ მოწყობილობაზე."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ეკრანის დაბლოკვის დაყენება"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"გაუქმება"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"გაუქმება"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"დაყენება"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"პირადი სივრცის დაყენება"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"დამალეთ პირადი აპები უსაფრთხო სივრცეში, რომელზედაც მხოლოდ თქვენ გაქვთ წვდომა"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"მუშაობის პრინციპი"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"პირად სივრცეზე წვდომა თქვენი აპების გვერდის ბოლოში შეგიძლიათ"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"აპებს პირად სივრცეში იცავს ჩაკეტვა"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"პირად სივრცეში არსებული აპების შეტყობინებები დამალულია, როცა ის ჩაკეტილია"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"პირადი სივრცის აპები არ გამოჩნდება ნებართვების მმართველში, კონფიდენციალურობის საინფორმაციო დაფასა და სხვა პარამეტრებში, როდესაც პირადი სივრცე ჩაკეტილია"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"მიმდინარეობს პირადი სივრცის დაყენება…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"პირად სივრცეს იცავს ჩაკეტვა"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"პირადი სივრცის აპების გამოყენების ინფორმაცია დამალულია, როცა ის ჩაკეტილია"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"მიიღეთ წვდომა პირად სივრცეზე თქვენი აპების გვერდიდან"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"პირადი სივრცის დაყენება ვერ მოხერხდა"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ცადეთ ხელახლა ახლა ან მოგვიანებით"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ხელახლა ცდა"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"განსაბლოკად ეკრანის დაბლოკვას გამოიყენებთ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"განბლოკეთ თქვენი პირადი სივრცე ისევე, როგორ მოწყობილობას განბლოკავთ, ან დააყენეთ განსხვავებული საკეტი"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"გამოიყენეთ ეკრანის დაბლოკვა"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"აირჩიეთ ახალი საკეტი"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"მზადაა!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"პირად სივრცეზე წვდომისთვის გადაფურცლეთ ზემოთ თქვენს მთავარ ეკრანზე, შემდეგ გადაადგილდით ქვემოთ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"მზადაა"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"პირად სივრცეზე წვდომისთვის გადაადგილდით ქვემოთ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"შეგიძლიათ დაამატოთ მაქსიმუმ <xliff:g id="COUNT">%d</xliff:g> თითის ანაბეჭდი"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"თქვენ უკვე დაამატეთ თითის ანაბეჭდების მაქსიმალური რაოდენობა"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"მეტი თითის ანაბეჭდის დამატება ვერ ხერხდება"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"აპების გამოყენების გაგრძელება ჩაკეცვისას"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"გარკვეული კონტენტისთვის განახლების სიხშირის ავტომატურად გაზრდა 60-დან <xliff:g id="ID_1">%1$s</xliff:g> ჰც-მდე. ზრდის ბატარეის მოხმარებას."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"ავტომატურად ზრდის განახლების სიხშირეს <xliff:g id="ID_1">%1$d</xliff:g> ჰც-მდე, გარკვეული კონტენტისთვის. ზრდის ბატარეის მოხმარებას."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"განახლების პიკური სიხშირის იძულება"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"განახლების უმაღლესი სიხშირე შეხებაზე გაუმჯობესებული რეაგირებისთვის და უფრო ერთგვაროვანი ანიმაციისთვის. გაზრდის ბატარეის მოხმარებას."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ეკრანზე ყურადღება"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"საერთო პარამეტრები"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-ები"</string>
<string name="apn_edit" msgid="2003683641840248741">"წვდომის წერტილის რედაქტირება"</string>
+ <string name="apn_add" msgid="9069613192201630934">"დაამატეთ წვდომის წერტილი"</string>
<string name="apn_not_set" msgid="8246646433109750293">"არ არის დაყენებული"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"არ არის დაყენებული"</string>
<string name="apn_name" msgid="6677695784108157953">"სახელი"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"გასახსნელად გამოიყენეთ მარტივი წვდომის ღილაკი"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"გასახსნელად დააჭირეთ ხმის ღილაკებს"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"სამმაგად შეეხეთ ეკრანს გასახსნელად"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"გასახსნელად სამჯერ შეეხეთ ეკრანს ორი თითით"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"გასახსნელად გამოიყენეთ ჟესტი"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"მარტივი წვდომის ჟესტის გამოყენება"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ამ ფუნქციით სარგებლობისთვის შეეხეთ მარტივი წვდომის ღილაკს <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> თქვენი ეკრანის ქვედა ნაწილში.\n\nფუნქციების გადასართავად ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ამ ფუნქციის გამოსაყენებლად შეეხეთ მარტივი წვდომის ღილაკს თქვენს ეკრანზე."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ამ ფუნქციით სარგებლობისთვის ხანგრძლივად დააჭირეთ ხმის ორივე ღილაკს."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"გადიდების დასაწყებად და შესაწყვეტად, სამმაგად შეეხეთ ეკრანს ნებისმიერ ადგილზე."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"გადიდების დასაწყებად და შესაწყვეტად ორი თითით სამჯერ შეეხეთ ეკრანს ნებისმიერ ადგილზე."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ამ ფუნქციით სარგებლობისთვის 2 თითით გადაფურცლეთ ეკრანის ქვედა კიდიდან ზემოთ.\n\nფუნქციების გადასართავად 2 თითით გადაფურცლეთ ზემოთ და დააყოვნეთ."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ამ ფუნქციით სარგებლობისთვის 3 თითით გადაფურცლეთ ეკრანის ქვედა კიდიდან ზემოთ.\n\nფუნქციების გადასართავად 3 თითით გადაფურცლეთ ზემოთ და დააყოვნეთ."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"მარტივი წვდომის ფუნქციით სარგებლობისთვის 2 თითით გადაფურცლეთ ეკრანის ქვედა კიდიდან ზემოთ.\n\nფუნქციების გადასართავად 2 თითით გადაფურცლეთ ზემოთ და დააყოვნეთ."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ხანგრძლივად დააჭირეთ ხმის ღილაკებს"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ხანგრძლივად დააჭირეთ ხმის ღილაკებს"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ხანგრძლივად დააჭირეთ ხმის ორივე ღილაკს"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ეკრანზე ორი თითით სამჯერ შეხება"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ეკრანზე ორი თითით სამჯერ შეხება"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"სწრაფად შეეხეთ ეკრანს {0,number,integer}-ჯერ ორი თითით"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"სამმაგად შეეხეთ ეკრანს"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"სამმაგად შეეხეთ ეკრანს"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"სწრაფად შეეხეთ ეკრანს {0,number,integer}-ჯერ. ამ მალსახმობმა შეიძლება მოწყობილობა შეანელოს"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ვიბრაციის და შეხებისადმი მგრძნობელობის გამოყენება"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"მაღვიძარის ვიბრაცია"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"მედიის ვიბრაცია"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"კლავიატურის ვიბრაცია"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ზარის ვიბრაცია"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"შეტყობინების ვიბრაცია"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"რეაქცია შეხებაზე"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"აპისთვის ფონური აქტივობის შეზღუდვის შემთხვევაში, მან შეიძლება არასათანადოდ იმუშაოს"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"რადგან ეს აპი ბატარეის ოპტიმიზებისთვის დაყენებული არაა, მას ვერ შეზღუდავთ.\n\nჩართეთ ბატარეის ოპტიმიზაცია აპის შესაზღუდავად."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ბატარეის მოხმარების მართვა"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"დაუშვით ფონური გამოყენება"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"ჩართეთ რეალური დროის რეჟიმში განახლებებისთვის, გამორთეთ ბატარეის დასაზოგად"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"შეუზღუდავი"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ოპტიმიზებული"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"შეზღუდული"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ტექსტის ზომა, დიდი ასოები, დიდი შრიფტი, დიდი ზომის ტექსტი, მხედველობადაქვეითებული, ტექსტის გადიდება, შრიფტის გამადიდებელი, შრიფტის გადიდება"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ყოველთვის ჩართული ემბიენტური ეკრანი, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, ტეგი, მკითხველი"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"კლავიატურა, ჰაპტიკა, ვიბრაცია,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ხმა, ვიბრაცია, არ შემაწუხოთ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"მედიის ხმა"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ტრანსლაციის ხმა"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"წვდომის დაშვება ყველა ფაილის სამართავად"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"აპს აძლევს უფლებას, წაიკითხოს, შეცვალოს და წაშალოს ყველა ფაილი ამ მოწყობილობაზე და ნებისმიერ დაკავშირებულ მეხსიერებაზე. ამ უფლების მინიჭების შემთხვევაში, აპს შეიძლება ფაილებზე წვდომა ჰქონდეს ისე, რომ ამის შესახებ არ იცოდეთ."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"შეუძლია ჰქონდეს წვდომა ყველა ფაილზე"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"სრული ეკრანის შეტყობინებები"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ნება დართეთ ამ აპიდან სრული ეკრანის შეტყობინებებს"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ნება დართეთ ამ აპს, აჩვენოს შეტყობინებები, რომლებიც სრულ ეკრანს იკავებს, როდესაც მოწყობილობა ჩაკეტილია. აპმა ისინი შეიძლება გამოიყენოს გამაფრთხილებელი სიგნალების და შემომავალი ზარების გამოყოფისთვის ან სხვა გადაუდებელი შეტყობინებებისთვის."</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"თქვენი მოწყობილობის სახელი ხილულია დაინსტალირებული აპებისთვის. მის დანახვას შეძლებენ სხვა პირებიც, როცა Bluetooth მოწყობილობებს ან Wi-Fi ქსელს დაუკავშირდებით, ან Wi-Fi უსადენო ქსელს დააყენებთ."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"გრამატიკული სქესი"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"აირჩიეთ გრამატიკული სქესი"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"შეცდომაში შემყვანი აპების სკანირება"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"აპში აქტივობის შემოწმება ფიშინგის კუთხით"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"სკანირების გამოყენება"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"სკანირების გამოყენება სამსახურის აპებისთვის"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 6922041..ec0e424 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audio функциясын өшіру"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Құрылғы LE Audio жабдық мүмкіндіктерін қолдайтын болса, Bluetooth LE Audio функциясы өшіріледі."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE audio ауыстырғышын \"Құрылғы туралы мәлімет\" бөлімінде көрсету"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bypass Bluetooth LE Audio рұқсат тізімін айналып өту"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio перифериялық құрылғысының рұқсат тізімі шарттарына сәйкес келуі расталмаса да, LE Audio қолданбасын әдепкісінше пайдаланыңыз."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Сақтау құрылғылары"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Қоңырау шалуға болатын құрылғылар"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Басқа құрылғылар"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Сақталған құрылғылар"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Аккаунтпен байланысқан"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Бұрын аккаунтпен пайдаланылған"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth қосылады."</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Жалғау параметрлері"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Бұрын жалғанған"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Мәтін өрістеріне жазу"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Стилуспен басқан барлық түймені елемеу"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Стилус"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Аудио бөлісу"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Аудионы бөлісу"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Қоңыраулар мен оятқыштар"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Күн және уақыт"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Өшіру"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Жеке бөлме"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Қолданбаларды жеке бөлмеге жасыру"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Экран құлпы арқылы құлыпты ашу"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Жеке бөлмені көрсету"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Құлыптаулы кезде жасыру"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Жеке бөлмені құлыптаулы кезде жасыру"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Құрылғыңызда жеке бөлменің барын басқа адамдар білмес үшін, оны қолданбалар тізімінен жасыра аласыз."</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Жеке бөлмеге жасырулы кезде кіру"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Іздеу жолағында \"Жеке бөлме\" деп іздеңіз."</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Жеке бөлме бөлшегін түртіңіз."</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Жеке бөлменің құлпын ашыңыз."</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Өшірулі"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Қосулы"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Жүйе"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Жеке бөлме жасау"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Жеке бөлмені жою"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Жеке бөлме жасалмады."</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Жеке бөлме жойылды."</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Жеке бөлме жойылмады."</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Экран құлпын орнатыңыз"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Жеке бөлмені қолдану үшін құрылғыға экран құлпын орнатыңыз."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Экран құлпын орнату"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Бас тарту"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Бас тарту"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Реттеу"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Жеке бөлмені реттеу"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Жеке қолданбаларды сіз ғана кіре алатын қауіпсіз бөлмеге жасырып қою"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Бұл қалай жұмыс істейді?"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Қолданбалар тізімінің төменгі жағынан жеке бөлмеге кіруге болады."</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Жеке бөлмедегі қолданбалар құлыппен қорғалады."</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Жеке бөлме құлыптаулы кезде, оның қолданбаларынан келетін хабарландырулар жасырылады."</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Жеке бөлме құлыптаулы кезде, \"Жеке бөлме\" қолданбалары \"Рұқсаттарды басқару\" бөлімінде, құпиялық тақтасында және басқа параметрлерде көрсетілмейді."</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Жеке бөлме реттеліп жатыр…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Жеке бөлме құлыппен қорғалған"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Жеке бөлме құлыптаулы кезде, оның қолданбаларын пайдалану туралы ақпарат жасырылады."</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Жеке бөлмеге қолданбалар тізімінен кіру"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Жеке бөлме реттелмеді."</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Қазір қайталап көріңіз немесе бір айналып келіңіз."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Қайталап көру"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Құлпын ашу үшін экран құлпын пайдалану керек пе?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Жеке бөлме құлпын құрылғы құлпын ашқандай аша аласыз немесе басқа құлып таңдай аласыз."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Экран құлпын пайдалану"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Жаңа құлып таңдау"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Бәрі дайын!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Жеке бөлмеге кіру үшін экранның төменгі жағынан жоғары қарай сырғытып, содан соң төмен айналдырыңыз."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Дайын"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Жеке бөлмеге кіру үшін төмен айналдырыңыз."</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"<xliff:g id="COUNT">%d</xliff:g> саусақ ізіне дейін қосуға болады"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Саусақ іздерінің максималды саны енгізілді"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Қосымша саусақ іздері енгізілмейді"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Қолданбаларды құрылғының бүктелген күйінде пайдалана беру"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Кейбір контент үшін жаңарту жиілігі 60-тан <xliff:g id="ID_1">%1$s</xliff:g> Гц-ке дейін автоматты түрде артады. Мұндайда батарея заряды тезірек таусылады."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Кейбір контент үшін жаңарту жиілігі <xliff:g id="ID_1">%1$d</xliff:g> Гц-ке дейін автоматты түрде артады. Батарея шығынын көбейтеді."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Ең жоғарғы жаңарту жиілігін қолмен қосу"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Жақсартылған датчик сезгіштігі және анимация сапасына арналған ең жоғарғы жаңарту жиілігі. Батарея заряды тезірек таусылады."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Зейінді экран"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Жалпы параметрлер"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Кіру нүктесін өзгерту"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Қойылмаған"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Орнатылмаған"</string>
<string name="apn_name" msgid="6677695784108157953">"Атауы"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Ашу үшін арнайы мүмкіндіктер түймесін қолдану"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Ашу үшін дыбыс деңгейі пернелерін басып тұрыңыз"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Ашу үшін экранды үш рет түртіңіз"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Экранды ашу үшін екі саусақпен үш рет түрту"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Ашу үшін қол қимылын пайдалану"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Арнайы мүмкіндік қимылын қолдану"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Бұл функцияны пайдалану үшін экранның төменгі жағындағы арнайы мүмкіндіктер түймесін <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> түртіңіз.\n\nБір функциядан екінші функцияға ауысу үшін арнайы мүмкіндіктер түймесін басып тұрыңыз."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Бұл функцияны пайдалану үшін экрандағы арнайы мүмкіндіктер түймесін түртіңіз."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Бұл функцияны пайдалану үшін дыбыс деңгейі пернелерін басып тұрыңыз."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Ұлғайтуды бастау және тоқтату үшін экранның кез келген жерін үш рет түртіңіз."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Ұлғайту функциясын қосу және тоқтату үшін экранның кез келген жерін екі саусақпен үш рет түртіңіз."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Бұл функцияны пайдалану үшін экранның төменгі жағынан 2 саусағыңызбен жоғары сырғытыңыз.\n\nБір функциядан екіншісіне ауысу үшін 2 саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Бұл функцияны пайдалану үшін экранның төменгі жағынан 3 саусағыңызбен жоғары сырғытыңыз.\n\nБір функциядан екіншісіне ауысу үшін 3 саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Арнайы мүмкіндіктерді пайдалану үшін экранның төменгі жағынан 2 саусағыңызбен жоғары сырғытыңыз.\n\nБір функциядан екіншісіне ауысу үшін 2 саусақпен жоғары қарай сырғытып, ұстап тұрыңыз."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Дыбыс деңгейі пернелерін басып тұру"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"дыбыс деңгейі пернелерін басып тұру"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Дыбыс деңгейінің екі пернесін бірге басып тұрасыз."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Экранды екі саусақпен үш рет түрту"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"экранды екі саусақпен үш рет түрту"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Экранды екі саусағыңызбен {0,number,integer} рет жылдам түртіңіз."</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Экранды үш рет түрту"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"экранды үш рет түрту"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Экранды {0,number,integer} рет жылдам түртіңіз. Бұл жылдам пәрмен құрылғы жұмысын баяулатуы мүмкін."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Дірілді мен хептиканы пайдалану"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Оятқыш дірілі"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Мультимедиа дірілі"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Пернетақта дірілі"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Қоңырау дірілі"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Хабарландыру дірілі"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Түрту кезіндегі діріл"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Қолданбаның фондық режимдегі әрекетін шектесеңіз, күтпеген әрекет көрсетуі мүмкін."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Бұл қолданба батареяны оңтайландыруға реттелмегендіктен, оны шектей алмайсыз. \n\nБұл үшін батареяны оңтайландыруды қосыңыз."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Батарея шығынын қадағалау"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Шектелмеген"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оңтайландырылған"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Шектелген"</string>
@@ -3004,7 +3060,7 @@
<string name="keywords_app_pinning" msgid="1564144561464945019">"экранды бекіту"</string>
<string name="keywords_profile_challenge" msgid="5135555521652143612">"жұмыс профилін қорғау, жұмыс, профиль"</string>
<string name="keywords_unification" msgid="2677472004971453468">"жұмыс профилі, басқарылатын профиль, бірыңғайлау, жұмыс, профиль"</string>
- <string name="keywords_fold_lock_behavior" msgid="6278990772113341581">"ояу, ұйқы, құлыптамау, бүктемелі құрылғыда құлпы ашылған күйде қалу, бүктеу, жабу, бүктеу мүмкіндігі, жабық, экран өшірулі"</string>
+ <string name="keywords_fold_lock_behavior" msgid="6278990772113341581">"ояу, ұйқы, құлыптамау, құрылғының бүктелген күйінде құлпы ашық қалу, бүктеу, жабу, бүктеу мүмкіндігі, жабық, экран өшірулі"</string>
<string name="keywords_gesture" msgid="3456930847450080520">"қимылдар"</string>
<string name="keywords_wallet" msgid="3757421969956996972">"Wallet"</string>
<string name="keywords_payment_settings" msgid="6268791289277000043">"төлеу, түрту, төлемдер"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"мәтін өлшемі, үлкен жазу, үлкен қаріп, үлкен мәтін, нашар көру қабілеті, мәтінді ұлғайту, қаріпті ұлғайту"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"әрдайым скринсейверде, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, белгі, оқу құралы"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"пернетақта: хептика, діріл"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Дыбыс деңгейі, діріл, Мазаламау режимі"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Mультимeдианың дыбыс деңгейі"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Трансляцияның дыбыс деңгейі"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Барлық файлды пайдалануға рұқсат беру"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Қолданбаға осы құрылғыдағы немесе жалғанған сыртқы жад құрылғыларындағы барлық файлды оқуға, өзгертуге немесе жоюға рұқсат береді. Егер осы рұқсат берілсе, қолданба файлдарды сіздің келісіміңізсіз пайдалана алады."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Барлық файлды пайдалана алатын қолданбалар"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Толық экран хабарландырулары"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Осы қолданбаға толық экранды алып тұратын хабарландыруларды көрсетуге рұқсат беру"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Құрылғы құлыптаулы тұрғанда, осы қолданбаға толық экранды алып тұратын хабарландыруларды көрсетуге рұқсат беріңіз. Соның арқасында қолданбалар оятқыштарды, кіріс қоңырауларын немесе шұғыл хабарландыруларды ерекшелей алады."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Құрылғыңыздың аты орнатылған қолданбаларға көрінеді. Bluetooth құрылғыларына, Wi-Fi желісіне қосылғанда немесе Wi-Fi хотспотын орнатқанда, басқа адамдарға да көрінуі мүмкін."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Грамматикалық тек"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Грамматикалық текті таңдаңыз"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Алдамшы қолданбаларды тексеру"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Қолданбаларды пайдалану тарихында фишинг әрекетінің бар-жоғын тексеру"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Тексеру функциясын пайдалану"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Тексеру функциясын жұмыс қолданбаларына пайдалану"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 29b2bbb..61c2acc 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"បិទប៊្លូធូស LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"បិទមុខងារប៊្លូធូស LE Audio ប្រសិនបើឧបករណ៍អាចប្រើសមត្ថភាពហាតវែរ LE audio បាន។"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"បង្ហាញប៊ូតុងបិទ/បើក LE Audio ក្នុងព័ត៌មានលម្អិតអំពីឧបករណ៍"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"រំលងបញ្ជីអនុញ្ញាតប៊្លូធូស LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ប្រើ LE Audio តាមលំនាំដើម ទោះបីជាមិនបានផ្ទៀងផ្ទាត់ឧបករណ៍ខាងក្រៅ LE Audio ដើម្បីឱ្យបំពេញតាមលក្ខខណ្ឌបញ្ជីអនុញ្ញាតក៏ដោយ។"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"ឧបករណ៍ផ្ទុកទិន្នន័យ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ឧបករណ៍ហៅទូរសព្ទ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ឧបករណ៍ផ្សេងទៀត"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"ឧបករណ៍ដែលបានរក្សាទុក"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"បានភ្ជាប់ជាមួយគណនី"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"បានប្រើជាមួយគណនីកាលពីមុន"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ប៊្លូធូសនឹងបើកដើម្បីផ្គូផ្គង"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"ចំណូលចិត្តនៃការភ្ជាប់"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"បានភ្ជាប់ពីមុន"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"សរសេរក្នុងកន្លែងបញ្ចូលអក្សរ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"កុំអើពើនឹងការសង្កត់ប៊ូតុងប៊ិកទាំងអស់"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ប៊ិក"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ការចែករំលែកសំឡេង"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ចែករំលែកសំឡេង"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ការហៅទូរសព្ទ និងម៉ោងរោទ៍"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"ភ្ជាប់ទៅកាន់ការចាក់សំឡេងលើអ៊ីនធឺណិត LE"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"ការចាក់សំឡេងលើអ៊ីនធឺណិតដែលនៅជិត"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ការចាក់សំឡេងលើអ៊ីនធឺណិត"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"ភ្ជាប់ទៅកាន់ការចាក់សំឡេងលើអ៊ីនធឺណិតដោយប្រើប្រាស់កូដ QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"កាលបរិច្ឆេទ និង ម៉ោង"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ប្រូកស៊ី"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"សម្អាត"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"បន្ទប់ឯកជន"</string>
<string name="private_space_summary" msgid="8237652417163408001">"លាក់កម្មវិធីនៅក្នុងថតឯកជន"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ដោះសោដោយប្រើមុខងារចាក់សោអេក្រង់"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"បង្ហាញបន្ទប់ឯកជន"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"លាក់នៅពេលជាប់សោ"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"លាក់ Private Space នៅពេលជាប់សោ"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ដើម្បីបញ្ឈប់អ្នកដទៃមិនឱ្យដឹងថា Private Space ស្ថិតនៅលើឧបករណ៍របស់អ្នក អ្នកអាចលាក់វាបានពីបញ្ជីកម្មវិធីរបស់អ្នក"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"ចូលប្រើ Private Space នៅពេលលាក់"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ស្វែងរក \'Private Space\' នៅក្នុងរបារស្វែងរក"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ចុចប្រអប់ Private Space"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ដោះសោ Private Space របស់អ្នក"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"បិទ"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"បើក"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ប្រព័ន្ធ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"បង្កើតបន្ទប់ឯកជន"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"លុបបន្ទប់ឯកជន"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"មិនអាចបង្កើតបន្ទប់ឯកជនបានទេ"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"បានលុបបន្ទប់ឯកជនដោយជោគជ័យ"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"មិនអាចលុបបន្ទប់ឯកជនបានទេ"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"កំណត់ការចាក់សោអេក្រង់"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ដើម្បីប្រើបន្ទប់ឯកជន សូមកំណត់ការចាក់សោអេក្រង់នៅលើឧបករណ៍នេះ។"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"កំណត់ការចាក់សោអេក្រង់"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"បោះបង់"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"បោះបង់"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"រៀបចំ"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"រៀបចំ Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"លាក់កម្មវិធីឯកជននៅក្នុងកន្លែងមានសុវត្ថិភាព ដែលអ្នកអាចចូលប្រើតែប៉ុណ្ណោះ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"របៀបដែលវាដំណើរការ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"អ្នកអាចចូលប្រើ Private Space ពីផ្នែកខាងក្រោមនៃបញ្ជីកម្មវិធីរបស់អ្នក"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"កម្មវិធីនៅក្នុង Private Space ត្រូវបានការពារដោយសោ"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"ការជូនដំណឹងពីកម្មវិធីនៅក្នុង Private Space ត្រូវបានលាក់ នៅពេលវាត្រូវបានចាក់សោ"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"កម្មវិធីនៅក្នុង Private Space នឹងមិនបង្ហាញនៅក្នុងមុខងារគ្រប់គ្រងការអនុញ្ញាត ផ្ទាំងគ្រប់គ្រងឯកជនភាព និងការកំណត់ផ្សេងទៀតទេ នៅពេល Private Space ត្រូវបានចាក់សោ"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"កំពុងរៀបចំ Private Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space ត្រូវបានការពារដោយការចាក់សោ"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ព័ត៌មានអំពីការប្រើប្រាស់សម្រាប់កម្មវិធីនៅក្នុង Private Space ត្រូវបានលាក់ នៅពេលវាត្រូវបានចាក់សោ"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ចូលប្រើ Private Space ពីបញ្ជីកម្មវិធីរបស់អ្នក"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"មិនអាចរៀបចំ Private Space បានទេ"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ព្យាយាមម្ដងទៀតឥឡូវនេះ ឬត្រឡប់មកវិញនៅពេលក្រោយ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ព្យាយាមម្ដងទៀត"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ប្រើការចាក់សោអេក្រង់ ដើម្បីដោះសោឬ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"អ្នកអាចដោះសោ Private Space តាមវិធីដូចគ្នាដែលអ្នកដោះសោឧបករណ៍របស់អ្នក ឬជ្រើសរើសការចាក់សោផ្សេង"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ប្រើការចាក់សោអេក្រង់"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"ជ្រើសរើសការចាក់សោថ្មី"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"រួចហើយ!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ដើម្បីចូលប្រើ Private Space សូមអូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ដើមរបស់អ្នក បន្ទាប់មករំកិលចុះក្រោម"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"រួចរាល់"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"រំកិលចុះក្រោម ដើម្បីចូលប្រើ Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"អ្នកអាចបញ្ចូលស្នាមម្រាមដៃបានត្រឹម <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"អ្នកបានបញ្ចូលស្នាមម្រាមដៃដល់ចំនួនអតិបរមាហើយ"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"មិនអាចបញ្ចូលស្នាមម្រាមដៃបានទៀតទេ"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"បន្តប្រើកម្មវិធីនៅពេលបត់"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"បង្កើនអត្រាផ្ទុកឡើងវិញដោយស្វ័យប្រវត្តិពី 60 ទៅ <xliff:g id="ID_1">%1$s</xliff:g> Hz សម្រាប់ខ្លឹមសារមួយចំនួន។ ប្រើប្រាស់ថ្មច្រើនជាងមុន។"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"បង្កើនអត្រាផ្ទុកឡើងវិញដោយស្វ័យប្រវត្តិរហូតដល់ <xliff:g id="ID_1">%1$d</xliff:g> Hz សម្រាប់ខ្លឹមសារមួយចំនួន។ ប្រើប្រាស់ថ្មច្រើនជាងមុន។"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"បង្ខំឱ្យប្រើអត្រាផ្ទុកឡើងវិញអតិបរមា"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"អត្រាផ្ទុកឡើងវិញខ្ពស់បំផុតសម្រាប់គុណភាពនៃរូបមានចលនា និងការឆ្លើយតបនៃការចុចប្រសើរជាងមុន។ ប្រើប្រាស់ថ្មច្រើនជាងមុន។"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ការដឹងថាកំពុងនៅប្រើ"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"ការកំណត់ទូទៅ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"កែចំណុចចូលប្រើប្រាស់"</string>
+ <string name="apn_add" msgid="9069613192201630934">"បញ្ចូលដុំភ្ជាប់បណ្ដាញឥតខ្សែ"</string>
<string name="apn_not_set" msgid="8246646433109750293">"មិនបានកំណត់"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"មិនបានកំណត់"</string>
<string name="apn_name" msgid="6677695784108157953">"ឈ្មោះ"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ប្រើប៊ូតុងភាពងាយស្រួល ដើម្បីបើក"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"សង្កត់ប៊ូតុងកម្រិតសំឡេងឱ្យជាប់ ដើម្បីបើក"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ចុចអេក្រង់បីដង ដើម្បីបើក"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ចុចអេក្រង់បីដងដោយប្រើម្រាមដៃពីរដើម្បីបើក"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ប្រើចលនា ដើម្បីបើក"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ប្រើចលនាភាពងាយស្រួល"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ដើម្បីប្រើមុខងារនេះ សូមចុចប៊ូតុងភាពងាយស្រួល <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> នៅផ្នែកខាងក្រោមនៃអេក្រង់របស់អ្នក។\n\nដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមចុចប៊ូតុងភាពងាយស្រួលឱ្យជាប់។"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ដើម្បីប្រើមុខងារនេះ សូមចុចប៊ូតុងភាពងាយស្រួលនៅលើអេក្រង់របស់អ្នក។"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ដើម្បីប្រើមុខងារនេះ សូមចុចគ្រាប់ចុចកម្រិតសំឡេងទាំងពីរឱ្យជាប់។"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ដើម្បីចាប់ផ្ដើម និងបញ្ឈប់ការពង្រីក សូមចុចបីដងនៅកន្លែងណាមួយនៅលើអេក្រង់របស់អ្នក។"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ដើម្បីចាប់ផ្ដើម និងបញ្ឈប់ការពង្រីក សូមចុចបីដងនៅកន្លែងណាមួយនៅលើអេក្រង់របស់អ្នកដោយប្រើម្រាមដៃពីរ។"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ដើម្បីប្រើមុខងារនេះ សូមអូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ ដោយប្រើម្រាមដៃ 2។\n\nដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមអូសឡើងលើ ដោយប្រើម្រាមដៃ 2 រួចសង្កត់ឱ្យជាប់។"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ដើម្បីប្រើមុខងារនេះ សូមអូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ ដោយប្រើម្រាមដៃ 3។\n\nដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមអូសឡើងលើ ដោយប្រើម្រាមដៃ 3 រួចសង្កត់ឱ្យជាប់។"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ដើម្បីប្រើមុខងារភាពងាយប្រើ សូមអូសឡើងលើពីផ្នែកខាងក្រោមនៃអេក្រង់ ដោយប្រើម្រាមដៃ 2។\n\nដើម្បីប្ដូររវាងមុខងារផ្សេងៗ សូមអូសឡើងលើ ដោយប្រើម្រាមដៃ 2 រួចសង្កត់ឱ្យជាប់។"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"សង្កត់គ្រាប់ចុចកម្រិតសំឡេងឱ្យជាប់"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"សង្កត់គ្រាប់ចុចកម្រិតសំឡេងឱ្យជាប់"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ចុចគ្រាប់ចុចកម្រិតសំឡេងទាំងពីរឱ្យជាប់"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ការចុចអេក្រង់បីដងដោយប្រើម្រាមដៃពីរ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ការចុចអេក្រង់បីដងដោយប្រើម្រាមដៃពីរ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ចុចអេក្រង់យ៉ាងរហ័ស {0,number,integer} ដងដោយប្រើម្រាមដៃពីរ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ចុចអេក្រង់បីដង"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ចុចអេក្រង់បីដង"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ចុចអេក្រង់ {0,number,integer} ដងឱ្យរហ័ស។ ផ្លូវកាត់នេះអាចធ្វើឱ្យឧបករណ៍របស់អ្នកដើរយឺត"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ប្រើការញ័រ និងប្រតិកម្មប៉ះ"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"ការញ័រនៃម៉ោងរោទ៍"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"ការញ័រនៃមេឌៀ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"ការញ័រក្ដារចុច"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"រំញ័រសំឡេងរោទ៍"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"រំញ័រការជូនដំណឹង"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ប្រតិកម្មតបនឹងការប៉ះ"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ប្រសិនបើអ្នកដាក់កម្រិតលើសកម្មភាពផ្ទៃខាងក្រោយសម្រាប់កម្មវិធី វាអាចនឹងដំណើរការខុសប្រក្រតី"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ដោយសារកម្មវិធីនេះមិនត្រូវបានកំណត់ ដើម្បីបង្កើនប្រសិទ្ធភាពថ្ម អ្នកមិនអាចដាក់កំហិតវាបានទេ។\n\nដើម្បីដាក់កំហិតកម្មវិធី សូមបើកការបង្កើនប្រសិទ្ធភាពថ្មជាមុនសិន។"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"គ្រប់គ្រងការប្រើប្រាស់ថ្ម"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"អនុញ្ញាតឱ្យមានការប្រើប្រាស់នៅផ្ទៃខាងក្រោយ"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"បើកដើម្បីទទួលបានព័ត៌មានថ្មីៗក្នុងពេលជាក់ស្ដែង បិទដើម្បីសន្សំសំចៃថ្ម"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"គ្មានការដាក់កំហិត"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"បង្កើនប្រសិទ្ធភាព"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ដាក់កំហិត"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ទំហំអក្សរ ទំហំអក្សរធំ ពុម្ពអក្សរធំ អក្សរធំ ខ្សោយភ្នែក ធ្វើឱ្យអក្សរកាន់តែធំ កម្មវិធីពង្រីកពុម្ពអក្សរ ការពង្រីកពុម្ពអក្សរ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"បើកអេក្រង់សម្ងំជានិច្ច, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, ស្លាក, កម្មវិធីអាន"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ក្ដារចុច, ប្រតិកម្មប៉ះ, ញ័រ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"កម្រិតសំឡេង ការញ័រ កុំរំខាន"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"កម្រិតសំឡេងមេឌៀ"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"កម្រិតសំឡេងនៃការបញ្ជូន"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"អនុញ្ញាតឱ្យចូលប្រើ ដើម្បីគ្រប់គ្រងឯកសារទាំងអស់"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"អនុញ្ញាតឱ្យកម្មវិធីនេះអាន កែសម្រួល និងលុបឯកសារទាំងអស់នៅលើឧបករណ៍នេះ ឬឧបករណ៍ផ្ទុកទាំងឡាយដែលបានភ្ជាប់។ ប្រសិនបើផ្ដល់ការអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើឯកសារ ដោយមិនឱ្យអ្នកដឹង។"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"អាចចូលប្រើឯកសារទាំងអស់បាន"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ការជូនដំណឹងពេញអេក្រង់"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"អនុញ្ញាតឱ្យមានការជូនដំណឹងពេញអេក្រង់ពីកម្មវិធីនេះ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"អនុញ្ញាតឱ្យកម្មវិធីនេះបង្ហាញការជូនដំណឹងពេញអេក្រង់ នៅពេលឧបករណ៍ត្រូវបានចាក់សោ។ កម្មវិធីអាចប្រើការជូនដំណឹងទាំងនេះ ដើម្បីរំលេចម៉ោងរោទ៍ ការហៅចូល ឬការជូនដំណឹងបន្ទាន់ផ្សេងទៀត។"</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ពិនិត្យសកម្មភាពកម្មវិធីរកមើលការដាក់នុយ"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ប្រើការស្កេន"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ប្រើការស្កេនសម្រាប់កម្មវិធីការងារ"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"ការស្កេនដំណើរការជាឯកជនដោយផ្ទាល់នៅលើឧបករណ៍របស់អ្នក ដោយពិនិត្យសកម្មភាពកម្មវិធីរកមើលការដាក់នុយ ឬអាកប្បកិរិយាបោកប្រាស់ផ្សេងទៀត។ ប្រសិនបើរកឃើញ ព័ត៌មានកម្មវិធីមួយចំនួនត្រូវបានផ្ញើទៅ Google Play Protect ដើម្បីបញ្ជាក់ការគំរាមកំហែង និងព្រមានអ្នកប្រើប្រាស់កម្មវិធី។"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"នេះជាមុខងារសុវត្ថិភាពដែលទទួលបានការការពារ។ គ្មានព័ត៌មានអំពីឧបករណ៍ ឬព័ត៌មានផ្ទាល់ខ្លួនណាត្រូវបានចែករំលែកជាមួយ Google ទេ។ \n\nការដាក់នុយគឺជាការព្យាយាមលួចព័ត៌មានផ្ទៀងផ្ទាត់ការចូលគណនី ឬព័ត៌មានផ្ទាល់ខ្លួនផ្សេងទៀត។"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index ff30813..d1673f9 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ಬ್ಲೂಟೂತ್ LE ಆಡಿಯೋವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ಸಾಧನವು LE ಆಡಿಯೋ ಹಾರ್ಡ್ವೇರ್ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಬೆಂಬಲಿಸಿದರೆ ಬ್ಲೂಟೂತ್ LE ಆಡಿಯೋ ಫೀಚರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ಸಾಧನ ವಿವರಗಳಲ್ಲಿ LE ಆಡಿಯೋ ಟಾಗಲ್ ತೋರಿಸಿ"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ಬೈಪಾಸ್ ಬ್ಲೂಟೂತ್ LE ಆಡಿಯೊ ಅನುಮತಿ ಪಟ್ಟಿ"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ಅನುಮತಿ ಪಟ್ಟಿ ಮಾನದಂಡಗಳನ್ನು ಪೂರೈಸಲು, LE ಆಡಿಯೊ ಪೆರಿಫೆರಲ್ ಅನ್ನು ದೃಢೀಕರಿಸಿರದಿದ್ದರೂ ಸಹ ಡೀಫಾಲ್ಟ್ ಆಗಿ LE ಆಡಿಯೊ ಬಳಸಿ."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"ಮೀಡಿಯಾ ಸಾಧನಗಳು"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ಸಾಧನಗಳಿಗೆ ಕರೆಮಾಡಿ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ಇತರ ಸಾಧನಗಳು"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"ಉಳಿಸಿರುವ ಸಾಧನಗಳು"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ಖಾತೆಗೆ ಸಂಬಂಧಿಸಿದೆ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ಈ ಹಿಂದೆ ಖಾತೆಯ ಜೊತೆಗೆ ಬಳಸಲಾಗಿದೆ"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ಜೋಡಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗುತ್ತದೆ"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"ಕನೆಕ್ಷನ್ ಆದ್ಯತೆಗಳು"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ಹಿಂದೆ ಸಂಪರ್ಕಗೊಂಡಿರುವುದು"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ಪಠ್ಯ ಫೀಲ್ಡ್ಗಳಲ್ಲಿ ಬರೆಯಿರಿ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ಎಲ್ಲಾ ಸ್ಟೈಲಸ್ ಬಟನ್ ಒತ್ತುವಿಕೆಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ಸ್ಟೈಲಸ್"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳಿ"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ಕರೆಗಳು ಮತ್ತು ಅಲಾರಾಂಗಳು"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"ಸಮೀಪದ ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್ಗಳು"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR ಕೋಡ್ ಬಳಸಿಕೊಂಡು ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
<string name="date_and_time" msgid="1788358029823431692">"ದಿನಾಂಕ ಮತ್ತು ಸಮಯ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ಪ್ರಾಕ್ಸಿ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ತೆರವುಗೊಳಿಸಿ"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ಖಾಸಗಿ ಸ್ಪೇಸ್"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ಖಾಸಗಿ ಫೋಲ್ಡರ್ನಲ್ಲಿ ಆ್ಯಪ್ಗಳನ್ನು ಮರೆಮಾಡಿ"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಬಳಸಿಕೊಂಡು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ತೋರಿಸಿ"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ಲಾಕ್ ಆಗಿರುವಾಗ ಮರೆಮಾಡಿ"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ಲಾಕ್ ಆಗಿರುವಾಗ ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಮರೆಮಾಡಿ"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿ ಸ್ಪೇಸ್ ಬಗ್ಗೆ ಇತರರಿಗೆ ತಿಳಿಯದಂತೆ ಮಾಡಲು, ಆ್ಯಪ್ ಪಟ್ಟಿಯಿಂದ ಅದನ್ನು ಮರೆಮಾಡಬಹುದು"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"ಮರೆಮಾಡಿರುವಾಗ ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ಹುಡುಕಾಟ ಪಟ್ಟಿಯಲ್ಲಿ \'ಖಾಸಗಿ ಸ್ಪೇಸ್\' ಗಾಗಿ ಹುಡುಕಿ"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಟೈಲ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ನಿಮ್ಮ ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ಆನ್ ಆಗಿದೆ"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ಸಿಸ್ಟಂ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ರಚಿಸಿ"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಅಳಿಸಿ"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸೆಟ್ ಮಾಡಿ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಬಳಸಲು ಈ ಸಾಧನದಲ್ಲಿ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸೆಟ್ ಮಾಡಿ."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸೆಟ್ ಮಾಡಿ"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ರದ್ದುಗೊಳಿಸಿ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ರದ್ದುಗೊಳಿಸಿ"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"ಸೆಟಪ್ ಮಾಡಿ"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ನೀವು ಮಾತ್ರ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದಾದ ಸುರಕ್ಷಿತ ಸ್ಪೇಸ್ನಲ್ಲಿ ಖಾಸಗಿ ಆ್ಯಪ್ಗಳನ್ನು ಮರೆಮಾಡಿ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ಅದು ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ನಿಮ್ಮ ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿಯ ಕೆಳಗಿನಿಂದ ನೀವು ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ಖಾಸಗಿ ಸ್ಪೇಸ್ನಲ್ಲಿರುವ ಆ್ಯಪ್ಗಳನ್ನು ಲಾಕ್ ಮೂಲಕ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಲಾಕ್ ಆಗಿರುವಾಗ ಅದರಲ್ಲಿರುವ ಆ್ಯಪ್ಗಳ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಮರೆಮಾಡಲಾಗುತ್ತದೆ"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಲಾಕ್ ಆಗಿರುವಾಗ ಅನುಮತಿ ನಿರ್ವಾಹಕ, ಗೌಪ್ಯತೆ ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಖಾಸಗಿ ಸ್ಪೇಸ್ ಆ್ಯಪ್ಗಳು ಗೋಚರಿಸುವುದಿಲ್ಲ"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಲಾಕ್ ಬಳಸಿ ರಕ್ಷಿಸಲಾಗಿದೆ"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಆ್ಯಪ್ಗಳ ಬಳಕೆ ಮಾಹಿತಿಯು ಲಾಕ್ ಆಗಿರುವಾಗ ಅದನ್ನು ಮರೆಮಾಡಲಾಗುತ್ತದೆ"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ನಿಮ್ಮ ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿಯಿಂದ ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ಈಗಲೇ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ನಂತರ ಮರಳಿ ಬನ್ನಿ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಬಳಸಬೇಕೆ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡುವ ರೀತಿಯಲ್ಲಿಯೇ ನೀವು ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಬಹುದು ಅಥವಾ ಬೇರೆ ಲಾಕ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"ಹೊಸ ಲಾಕ್ ಆಯ್ಕೆಮಾಡಿ"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"ಎಲ್ಲವೂ ಸಿದ್ಧವಾಗಿದೆ!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ಖಾಸಗಿ ಸ್ಟೇಸ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು, ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ, ನಂತರ ಕೆಳಗೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ಮುಗಿದಿದೆ"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಕೆಳಗೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"ನೀವು ಗರಿಷ್ಠ <xliff:g id="COUNT">%d</xliff:g> ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"ನೀವು ಗರಿಷ್ಠ ಸಂಖ್ಯೆಯ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ಗಳನ್ನು ಸೇರಿಸಿರುವಿರಿ"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"ಹೆಚ್ಚಿನ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ಗಳನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ಫೋಲ್ಡ್ ಮಾಡಿದ ನಂತರ ಆ್ಯಪ್ಗಳ ಬಳಕೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"ಸ್ಮೂಥ್ ಡಿಸ್ಪ್ಲೇ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"ಕೆಲವು ವಿಷಯಗಳಿಗೆ ರಿಫ್ರೆಶ್ ರೇಟ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ 60 ರಿಂದ <xliff:g id="ID_1">%1$s</xliff:g>Hz ಗೆ ಹೆಚ್ಚಿಸುತ್ತದೆ. ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"ಕೆಲವು ವಿಷಯಗಳಿಗೆ ರಿಫ್ರೆಶ್ ರೇಟ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ <xliff:g id="ID_1">%1$d</xliff:g> Hz ವರೆಗೆ ಹೆಚ್ಚಿಸುತ್ತದೆ. ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ಗರಿಷ್ಠ ರಿಫ್ರೆಶ್ ರೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಿ"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"ಸುಧಾರಿತ ಸ್ಪರ್ಶ ಪ್ರತಿಕ್ರಿಯೆ ಮತ್ತು ಆ್ಯನಿಮೇಶನ್ ಗುಣಮಟ್ಟಗಳಿಗಾಗಿ ಅತ್ಯಧಿಕ ರಿಫ್ರೆಶ್ ರೇಟ್. ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ಸ್ಕ್ರೀನ್ ಆನ್ ಆಗಿರುವಿಕೆ"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"ಸಮುದಾಯದ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN ಗಳು"</string>
<string name="apn_edit" msgid="2003683641840248741">"ಆ್ಯಕ್ಸೆಸ್ ಪಾಯಿಂಟ್ ಎಡಿಟ್ ಮಾಡಿ"</string>
+ <string name="apn_add" msgid="9069613192201630934">"ಆ್ಯಕ್ಸೆಸ್ ಪಾಯಿಂಟ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
<string name="apn_not_set" msgid="8246646433109750293">"ಹೊಂದಿಸಿಲ್ಲ"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
<string name="apn_name" msgid="6677695784108157953">"ಹೆಸರು"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ತೆರೆಯಲು ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಬಳಸಿ"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"ತೆರೆಯಲು, ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಒತ್ತಿಹಿಡಿಯಿರಿ"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ತೆರೆಯಲು, ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಟ್ರಿಪಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ತೆರೆಯಲು ಎರಡು-ಬೆರಳಿನಿಂದ ಟ್ರಿಪಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ತೆರೆಯಲು ಗೆಸ್ಚರ್ ಬಳಸಿ"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ಆ್ಯಕ್ಸೆಸ್ಸಿಬಿಲಿಟಿ ಗೆಸ್ಚರ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ಈ ಫೀಚರ್ ಬಳಸಲು, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ಟ್ಯಾಪ್ ಮಾಡಿ.\n\nಫೀಚರ್ಗಳ ನಡುವೆ ಬದಲಾಯಿಸಲು, ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ಈ ಫೀಚರ್ ಬಳಸಲು, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲಿನ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ಈ ಫೀಚರ್ ಬಳಸಲು, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ಹಿಗ್ಗಿಸುವಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ನಿಲ್ಲಿಸಲು, ನಿಮ್ಮ ಪರದೆಯ ಮೇಲೆ ಎಲ್ಲಿಯಾದರೂ ಟ್ರಿಪಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ಹಿಗ್ಗಿಸುವಿಕೆ ಪ್ರಾರಂಭಿಸಲು & ನಿಲ್ಲಿಸಲು, ಎರಡು ಬೆರಳಿನಿಂದ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಎಲ್ಲಿಯಾದರೂ ಟ್ರಿಪಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ಈ ಫೀಚರ್ ಬಳಸಲು, 2 ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಸ್ಕ್ರೀನ್ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ.\n\nವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, 2 ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ಈ ಫೀಚರ್ ಬಳಸಲು, 3 ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಸ್ಕ್ರೀನ್ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ.\n\nವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, 3 ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಫೀಚರ್ ಬಳಸಲು, 2 ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಸ್ಕ್ರೀನ್ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ.\n\nವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, 2 ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ಎರಡು-ಬೆರಳಿನಿಂದ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಟ್ರಿಪಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ಎರಡು-ಬೆರಳಿನಿಂದ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಟ್ರಿಪಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ಎರಡು ಬೆರಳುಗಳಿಂದ ಸ್ಕ್ರೀನ್ ಅನ್ನು {0,number,integer} ಬಾರಿ ತ್ವರಿತವಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಮೂರು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಮೂರು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ಸ್ಕ್ರೀನ್ನ ಮೇಲೆ {0,number,integer} ಸಲ ತ್ವರಿತವಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ. ಈ ಶಾರ್ಟ್ಕಟ್, ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಧಾನಗೊಳಿಸಬಹುದು"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ವೈಬ್ರೇಷನ್ ಮತ್ತು ಹ್ಯಾಪ್ಟಿಕ್ಸ್ ಬಳಸಿ"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"ಅಲಾರಾಂ ವೈಬ್ರೇಷನ್"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"ಮಾಧ್ಯಮ ವೈಬ್ರೇಷನ್"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"ಕೀಬೋರ್ಡ್ ವೈಬ್ರೇಷನ್"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ರಿಂಗ್ನೊಂದಿಗೆ ವೈಬ್ರೇಷನ್"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"ಅಧಿಸೂಚನೆಯ ವೈಬ್ರೇಷನ್"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ಸ್ಪರ್ಶ ಪ್ರತಿಕ್ರಿಯೆ"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ಒಂದು ಅಪ್ಲಿಕೇಶನ್ನ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯನ್ನು ನೀವು ಸೀಮಿತಗೊಳಿಸಿದರೆ, ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ಬ್ಯಾಟರಿ ಅನ್ನು ಆಪ್ಟಿಮೈಜ್ ಮಾಡಲು ಈ ಅಪ್ಲಿಕೇಶನ್ ಹೊಂದಿಸದ ಕಾರಣ, ನೀವು ಇದನ್ನು ನಿರ್ಬಂಧಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.\n\n ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲು, ಮೊದಲು ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಷನ್ ಅನ್ನು ಆನ್ ಮಾಡಿ."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"ಹಿನ್ನೆಲೆ ಬಳಕೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"ನೈಜ-ಸಮಯದ ಅಪ್ಡೇಟ್ಗಳಿಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಿ, ಬ್ಯಾಟರಿ ಸೇವ್ ಮಾಡಲು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ಮಿತಿ ಇಲ್ಲದ್ದು"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ಪಠ್ಯ ಗಾತ್ರ, ದೊಡ್ಡ ಪ್ರಿಂಟ್, ದೊಡ್ಡ ಫಾಂಟ್, ದೊಡ್ಡ ಪಠ್ಯ, ಕಡಿಮೆ ವಿಷನ್, ಪಠ್ಯವನ್ನು ದೊಡ್ಡದಾಗಿಸಿ, ಫಾಂಟ್ ಹಿಗ್ಗಿಸುವಿಕೆ, ಫಾಂಟ್ ಹಿಗ್ಗುವಿಕೆ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ಯಾವಾಗಲೂ ಆನ್ ಇರುವ ಆ್ಯಂಬಿಯೆಂಟ್ ಡಿಸ್ಪ್ಲೇ, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ಟ್ಯಾಗ್, ರೀಡರ್"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ಕೀಬೋರ್ಡ್, ಹ್ಯಾಪ್ಟಿಕ್ಸ್, ವೈಬ್ರೇಟ್,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ವಾಲ್ಯೂಮ್, ವೈಬ್ರೇಶನ್, ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"ಮಾಧ್ಯಮ ವಾಲ್ಯೂಮ್"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ವಾಲ್ಯೂಮ್ ಕ್ಯಾಸ್ಟ್ ಮಾಡಿ"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ಎಲ್ಲಾ ಫೈಲ್ ನಿರ್ವಹಿಸಲು, ಪ್ರವೇಶಕ್ಕೆ ಅನುಮತಿಸಿ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ಈ ಸಾಧನ ಅಥವಾ ಕನೆಕ್ಟ್ ಮಾಡಿದ ಶೇಖರಣಾ ವಾಲ್ಯೂಮ್ಗಳಲ್ಲಿ ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಓದಲು, ಮಾರ್ಪಡಿಸಲು ಮತ್ತು ಅಳಿಸಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ. ಅನುಮತಿಸಿದರೆ, ಬಳಕೆದಾರರ ಪೂರ್ವಾನುಮತಿ ಇಲ್ಲದೆ ಆ್ಯಪ್ಗಳು ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ಫುಲ್ ಸ್ಕ್ರೀನ್ ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ಈ ಆ್ಯಪ್ನಿಂದ ಫುಲ್ ಸ್ಕ್ರೀನ್ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ಸಾಧನ ಲಾಕ್ ಆಗಿರುವಾಗ ಫುಲ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆವರಿಸಿಕೊಳ್ಳುವ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ತೋರಿಸಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ. ಅಲಾರಾಂಗಳು, ಒಳಬರುವ ಕರೆಗಳು ಅಥವಾ ಇತರ ತುರ್ತಿನ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಹೈಲೈಟ್ ಮಾಡಲು ಆ್ಯಪ್ಗಳು ಇವುಗಳನ್ನು ಬಳಸಬಹುದು."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ಫಿಶಿಂಗ್ಗಾಗಿ ಆ್ಯಪ್ನ ಚಟುವಟಿಕೆಯನ್ನು ಪರಿಶೀಲಿಸಿ"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ಸ್ಕ್ಯಾನಿಂಗ್ ಬಳಸಿ"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳಿಗಾಗಿ ಸ್ಕ್ಯಾನಿಂಗ್ ಬಳಸಿ"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"ಸ್ಕ್ಯಾನಿಂಗ್ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ನಡೆಯುತ್ತದೆ, ಫಿಶಿಂಗ್ ಮತ್ತು ಇತರ ಮೋಸದ ನಡವಳಿಕೆಗಾಗಿ ಆ್ಯಪ್ನ ಚಟುವಟಿಕೆಯನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಫಿಶಿಂಗ್ ಪತ್ತೆಯಾದರೆ, ಅಪಾಯವನ್ನು ಖಚಿತಪಡಿಸಲು ಮತ್ತು ಆ್ಯಪ್ ಬಳಕೆದಾರರನ್ನು ಎಚ್ಚರಿಸಲು ಕೆಲವು ಆ್ಯಪ್ ಮಾಹಿತಿಯನ್ನು Google Play Protect ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"ಇದು ಸುರಕ್ಷಿತ ಭದ್ರತಾ ಫೀಚರ್ ಆಗಿದೆ. Google ಜೊತೆಗೆ ಯಾವುದೇ ಸಾಧನ ಅಥವಾ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಹಂಚಿಕೊಂಡಿಲ್ಲ. \n\nಫಿಶಿಂಗ್ ಎನ್ನುವುದು ಸೈನ್-ಇನ್ ರುಜುವಾತುಗಳು ಅಥವಾ ಇತರ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಕದಿಯುವ ಪ್ರಯತ್ನವಾಗಿದೆ."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 913f4ce..c257468 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"블루투스 LE 오디오 사용 중지"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"기기가 LE 오디오 하드웨어 기능을 지원하는 경우 블루투스 LE 오디오 기능을 사용 중지합니다."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"기기 세부정보에 LE 오디오 전환 버튼 표시"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"블루투스 LE 오디오 허용 목록 우회"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE 오디오 주변기기가 허용 목록 기준을 충족하는 것으로 확인되지 않은 경우에도 기본적으로 LE 오디오를 사용합니다."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"미디어 기기"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"통화 기기"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"다른 기기"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"저장된 기기"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"계정과 연결됨"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"이전에 계정에서 사용됨"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"페어링을 위해 블루투스가 켜집니다"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"연결 환경설정"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"이전에 연결됨"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"텍스트 입력란에 작성"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"스타일러스 버튼 누름 모두 무시"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"스타일러스"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"오디오 공유"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"오디오 공유"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"통화 및 알람"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"날짜 및 시간"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"프록시"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"지우기"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"비공개 스페이스"</string>
<string name="private_space_summary" msgid="8237652417163408001">"비공개 폴더에 앱 숨기기"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"화면 잠금을 사용하여 잠금 해제"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"비공개 스페이스 표시"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"잠겨 있을 때 숨김"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"잠겨 있을 때 비공개 스페이스 숨기기"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"기기에 비공개 스페이스가 있다는 사실을 다른 사람이 알지 못하도록 앱 목록에서 숨길 수 있습니다."</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"숨겨져 있을 때 비공개 스페이스에 액세스"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"검색창에서 \'비공개 스페이스\'를 검색합니다."</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"비공개 스페이스 타일 탭"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"비공개 스페이스 잠금 해제"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"사용 안함"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"사용"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"시스템"</string>
<string name="private_space_create_title" msgid="47273568884806726">"비공개 스페이스 만들기"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"비공개 스페이스 삭제"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"비공개 스페이스를 만들 수 없음"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"비공개 스페이스가 삭제됨"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"비공개 스페이스를 삭제할 수 없음"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"화면 잠금 설정"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"비공개 스페이스를 사용하려면 이 기기에 화면 잠금을 설정하세요."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"화면 잠금 설정"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"취소"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"취소"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"설정"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"비공개 스페이스 설정"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"나만 액세스할 수 있는 안전한 스페이스에 비공개 앱을 숨깁니다."</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"작동 방식"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"앱 목록 하단에서 비공개 스페이스에 액세스할 수 있습니다."</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"잠금을 통해 비공개 스페이스의 앱이 보호됩니다."</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"잠겨 있을 때 비공개 스페이스의 앱에서 보내는 알림은 표시되지 않습니다."</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"비공개 스페이스가 잠겨 있을 때 비공개 스페이스 앱은 권한 관리자, 개인 정보 대시보드, 기타 설정에 표시되지 않습니다."</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"비공개 스페이스 설정 중…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"비공개 스페이스는 잠금 기능으로 보호됨"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"잠긴 경우 비공개 스페이스 앱의 사용 정보가 숨겨짐"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"앱 목록에서 비공개 스페이스에 액세스"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"비공개 스페이스를 설정할 수 없음"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"지금 다시 시도하거나 나중에 다시 시도하세요."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"다시 시도"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"화면 잠금을 사용하여 잠금 해제하시겠습니까?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"기기를 잠금 해제하는 방식과 동일하게 비공개 스페이스를 잠금 해제하거나 다른 잠금 방식을 선택할 수 있습니다."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"화면 잠금 사용"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"새 잠금 방식 선택"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"처리가 완료되었습니다"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"비공개 스페이스에 액세스하려면 홈 화면 하단에서 위로 스와이프한 후 아래로 스크롤합니다."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"완료"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"비공개 스페이스에 액세스하려면 아래로 스크롤하세요."</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"지문을 <xliff:g id="COUNT">%d</xliff:g>개까지 추가할 수 있습니다."</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"최대 개수의 지문을 추가했습니다."</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"지문을 추가할 수 없습니다."</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"접은 상태에서 앱 계속 사용"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"스무스 디스플레이"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"일부 콘텐츠의 화면 재생 빈도를 자동으로 60Hz에서 <xliff:g id="ID_1">%1$s</xliff:g>Hz로 늘립니다. 배터리 사용량이 증가합니다."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"일부 콘텐츠의 화면 재생 빈도를 자동으로 최대 <xliff:g id="ID_1">%1$d</xliff:g>Hz까지 늘립니다. 배터리 사용량이 증가합니다."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"가장 높은 새로고침 빈도 강제 적용"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"향상된 터치 반응 속도 및 애니메이션 품질에 맞는 가장 높은 새로고침 빈도입니다. 배터리 사용량이 증가합니다."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"화면 시선 감지"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"커뮤니티 설정"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"액세스 포인트 수정"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"설정되지 않음"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"설정되지 않음"</string>
<string name="apn_name" msgid="6677695784108157953">"이름"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"접근성 버튼을 사용하여 열기"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"볼륨 키를 길게 눌러 열기"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"화면을 세 번 탭하여 열기"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"두 손가락으로 화면을 세 번 탭하여 열기"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"동작을 사용해 열기"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"접근성 동작 사용"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"이 기능을 사용하려면 화면 하단의 접근성 버튼 <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>을 탭하세요.\n\n기능 간에 전환하려면 접근성 버튼을 길게 터치하세요."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"이 기능을 사용하려면 화면에서 접근성 버튼을 탭하세요."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"이 기능을 사용하려면 볼륨 키 2개를 동시에 길게 누르세요."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"확대를 시작 및 중지하려면 화면의 아무 곳이나 세 번 탭하세요."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"확대를 시작 및 중지하려면 화면의 아무 곳이나 두 손가락으로 세 번 탭하세요."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"이 기능을 사용하려면 두 손가락을 사용하여 화면 하단에서 위로 스와이프하세요.\n\n기능 간에 전환하려면 두 손가락을 사용하여 위로 스와이프한 후 잠시 기다립니다."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"이 기능을 사용하려면 세 손가락을 사용하여 화면 하단에서 위로 스와이프하세요.\n\n기능 간에 전환하려면 세 손가락을 사용하여 위로 스와이프한 후 잠시 기다립니다."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"접근성 기능을 사용하려면 두 손가락을 사용하여 화면 하단에서 위로 스와이프하세요.\n\n기능 간에 전환하려면 두 손가락을 사용하여 위로 스와이프한 후 잠시 기다립니다."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"볼륨 키 길게 누르기"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"볼륨 키 길게 누르기"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"볼륨 키 2개를 길게 누릅니다."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"두 손가락으로 화면 세 번 탭하기"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"두 손가락으로 화면 세 번 탭하기"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"두 손가락으로 화면을 {0, 숫자, 정수}번 빠르게 탭하세요."</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"세 번 탭하기"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"화면 세 번 탭하기"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"화면을 {0,number,integer}번 빠르게 탭합니다. 이 바로가기를 사용하면 기기가 느려질 수 있습니다."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"진동 및 햅틱 사용"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"알람 진동"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"미디어 진동"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"키보드 진동"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"벨소리 진동"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"알림 진동"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"터치 반응"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"앱의 백그라운드 활동을 제한하면 앱이 정상적으로 작동하지 않을 수도 있습니다."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"배터리 최적화를 설정하지 않아 이 앱을 제한할 수 없습니다.\n\n앱을 제한하려면 먼저 배터리 최적화를 사용 설정하세요."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"배터리 사용량 관리"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"제한 없음"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"최적화"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"제한됨"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"텍스트 크기, 큰 글자, 큰 글꼴, 큰 텍스트, 저시력, 텍스트 크게, 텍스트 확대, 글꼴 확대"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"화면 보호 모드 상시 사용 설정(AOD)"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, 태그, 리더"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"키보드, 햅틱, 진동"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"볼륨, 진동, 방해 금지 모드"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"미디어 볼륨"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"전송 볼륨"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"모든 파일 관리 허용"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"앱이 이 기기 또는 연결된 모든 저장장치에 있는 파일을 모두 읽고 수정하고 삭제하도록 허용합니다. 권한을 부여하면 앱이 나에게 명시적으로 알리지 않고도 파일에 액세스할 수 있습니다."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"모든 파일에 액세스 가능"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"전체 화면 알림"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"이 앱에 전체 화면 알림 허용하기"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"기기가 잠겨 있을 때 앱에서 알림을 전체 화면에 표시할 수 있도록 허용합니다. 앱에서는 이러한 방식으로 알람, 수신 전화 또는 기타 긴급 알림을 강조 표시할 수 있습니다."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"앱 활동에서 피싱 확인"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"검사 사용"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"직장 앱에 검사 사용"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"기기에서 바로 검사가 실행되어 앱 활동에서 피싱 또는 기타 사기 행위를 확인합니다. 피싱 또는 기타 사기 행위가 감지되는 경우, 위협을 확인하고 앱 사용자에게 경고를 표시할 수 있도록 일부 앱 정보가 Google Play 프로텍트로 전송됩니다."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"보호되는 보안 기능으로, 기기 또는 개인 정보가 Google과 공유되지 않습니다. \n\n피싱은 로그인 사용자 인증 정보 또는 기타 개인 정보를 도용하려는 시도입니다."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 8f44365..12e0027 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE audio\'ну өчүрүү"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Эгер түзмөктө аппараттык мүмкүнчүлүктөр болсо, Bluetooth LE Audio функциясы өчүрүлөт."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Түзмөктүн чоо-жайынан LE Audio которгучун көрсөтүү"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio ак тизмесин кыйгап өтүү"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio тышкы түзмөгү ак тизменин талабына жооп берери ырасталбаса да, LE Audio\'ну демейки шартта колдонуңуз."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Медиа түзмөктөр"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Түзмөктөргө чалуу"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Башка түзмөктөр"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Сакталган түзмөктөр"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Аккаунт менен байланыштырылган"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Аккаунт менен буга чейин колдонулган"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth күйгүзүлөт"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Байланыш параметрлери"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Буга чейин туташкан түзмөктөр"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Текст жазылчу жерлерге кол менен жазуу"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Стилус баскычындагы басууларды этибарга албоо"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Стилус"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Аудиону бөлүшүү"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Аудиону бөлүшүү"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Чалуулар жана ойготкучтар"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Күн жана убакыт"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Тазалоо"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Жеке чөйрө"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Купуя папкадагы колдонмолорду жашыруу"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Экрандын кулпусу менен ачуу"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Жеке чөйрөнү көрсөтүү"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Кулпуланган учурда жашыруу"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Жеке чөйрө кулпуланган учурда аны жашыруу"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Башкалар түзмөгүңүздө Жеке чөйрө орнотулганын билбеши үчүн, аны колдонмолордун тизмесинен жашырыңыз"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Жеке чөйрө жашырылганда аны көрүү"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Издөө тилкесинде \"Жеке чөйрө\" боюнча издей аласыз"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Жеке чөйрөнүн картасын басыңыз"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Жеке чөйрөнүн кулпусун ачыңыз"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Өчүк"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Күйүк"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Система"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Жеке чөйрө түзүү"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Жеке чөйрөнү өчүрүү"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Жеке чөйрө түзүлгөн жок"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Жеке чөйрө өчүрүлдү"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Жеке чөйрө өчүрүлгөн жок"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Экран кулпусун коюп алыңыз"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Жеке чөйрөнү колдонуу үчүн бул түзмөктө экран кулпусун коюңуз."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Экран кулпусун коюу"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Жокко чыгаруу"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Жокко чыгаруу"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Тууралоо"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Жеке чөйрөнү тууралоо"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Жеке колдонмолорду сиз гана көрө ала турган коопсуз жерде жашырыңыз"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Ал кантип иштейт"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Жеке чөйрөнү колдонмолордун тизмесинин ылдый жагынан көрө аласыз"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Жеке чөйрөдөгү колдонмолор кулпу менен корголот"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Жеке чөйрөдөгү колдонмолордун билдирмелери ал кулпуланганда жашырылат"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Жеке чөйрө кулпуланган учурда андагы колдонмолор уруксаттарда, купуялык тактасында жана башка параметрлерде көрүнбөйт"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Жеке чөйрө туураланууда…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Жеке чөйрө кулпу менен корголот"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Жеке чөйрө кулпуланганда, андагы колдонмолордун колдонулушу тууралуу маалымат жашырылат"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Колдонмолоруңуздун тизмесинен Жеке чөйрөнү ачыңыз"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Жеке чөйрө туураланган жок"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Азыр кайталап көрүңүз же кийинчерээк кайтып келиңиз"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Кайталоо"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Экран кулпусун колдоносузбу?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Жеке чөйрө үчүн түзмөгүңүздүн кулпусун ачуу ыкмасын колдонуп же башка кулпуну тандай аласыз"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Экран кулпусун колдонуу"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Жаңы кулпуну тандоо"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Дапдаяр!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Жеке чөйрөнү ачуу үчүн башкы экранды ылдыйдан өйдө карай сүрүп, баракты ылдый сыдырыңыз"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Бүттү"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Жеке чөйрөнү ачуу үчүн баракты ылдый сыдырыңыз"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"<xliff:g id="COUNT">%d</xliff:g> чейин манжа изин кошсоңуз болот"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Кошулган манжа издеринин саны жогорку чегине жетти"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Дагы манжа издерин кошуу мүмкүн эмес"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Түзмөк бүктөлгөндө колдонмолорду пайдалана берүү"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Айрым нерселер үчүн экрандын жаңыруу жыштыгы 60 Герцтен <xliff:g id="ID_1">%1$s</xliff:g> Герцке чейин өзгөрөт. Батарея тез отуруп калышы мүмкүн"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Айрым материалдар үчүн экрандын жаңыруу жыштыгы автоматтык түрдө <xliff:g id="ID_1">%1$d</xliff:g> Герцке көтөрүлөт. Батареяны көбүрөөк керектейт."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Экрандын жаңыруу жыштыгын жогорулатуу"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Сенсордун функциясын жана анимациянын сапатын жакшыртуу үчүн жаңыртуу ылдамдыгы жогорулатылды. Батареянын колдонулушун жогорулатат."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Ыңгайлашуучу көшүү режими"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Жалпы параметрлер"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN\'дер"</string>
<string name="apn_edit" msgid="2003683641840248741">"Байланыш түйүнүн өзгөртүү"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Коюлган эмес"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Коюлган эмес"</string>
<string name="apn_name" msgid="6677695784108157953">"Аталышы"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Атайын мүмкүнчүлүктөр баскычын басыңыз"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Ачуу үчүн үн баскычтарын коё бербей басып туруңуз"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Ачуу үчүн экранды үч жолу таптаңыз"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Ачуу үчүн экранды эки манжаңыз менен үч жолу таптаңыз"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Ачуу үчүн жаңсаңыз"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Атайын мүмкүнчүлүктөр жаңсоосун колдонуу"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Бул функцияны колдонуу үчүн экрандын ылдый жагындагы атайын мүмкүнчүлүктөр баскычын <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> таптап коюңуз.\n\nБашка функцияга өтүү үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Бул функцияны колдонуу үчүн экрандагы атайын мүмкүнчүлүктөр баскычын басыңыз."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Бул функцияны колдонуу үчүн үндү катуулатуу/акырындатуу баскычтарын коё бербей басып туруңуз."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Чоңойтуп/кичирейтүүнү иштетүү же өчүрүү үчүн экраныңыздын каалаган жерин үч жолу таптаңыз."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Чоңойтууну иштетүү же өчүрүү үчүн экраныңыздын каалаган жерин эки манжаңыз менен үч жолу таптаңыз."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Бул функцияны колдонуу үчүн экранды 2 манжаңыз менен ылдый жагынан өйдө сүрүңүз.\n\nБашка функцияга өтүү үчүн 2 манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Бул функцияны колдонуу үчүн экранды 3 манжаңыз менен ылдый жагынан өйдө сүрүңүз.\n\nБашка функцияга өтүү үчүн 3 манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Бул атайын мүмкүнчүлүктөр функциясын колдонуу үчүн экранды 2 манжаңыз менен ылдый жагынан өйдө сүрүңүз.\n\nБашка функцияга өтүү үчүн 2 манжаңыз менен өйдө сүрүп, кармап туруңуз."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Үндү катуулатуу/акырындатуу баскычтарын басуу"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"үн баскычтарын басып туруу"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Үндү катуулатуу/акырындатуу баскычтарын коё бербей басып туруңуз"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Экранды эки манжа менен үч жолу таптоо"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"экранды эки манжа менен үч жолу таптоо"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Экранды эки манжаңыз менен {0,number,integer} жолу тез таптаңыз"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Экранды үч жолу басуу"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"экранды үч жолу таптоо"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Экранды {0,number,integer} жолу тез басыңыз. Бул ыкчам баскыч түзмөгүңүздү жайлатышы мүмкүн"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Дирилдөөнү жана сенсорлорду колдонуу"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Ойготкучтун дирилдөөсү"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Медианы дирилдетүү"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Баскычтопту дирилдетүү"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Шыңгырдын дирилдөөсү"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Билдирменин дирилдөөсү"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Басып жооп берүү"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Колдонмонун фондогу аракеттери чектелсе, ал туура эмес иштеп калышы мүмкүн"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Бул колдонмодо батареянын үнөмдөлүшү жөндөлбөгөндүктөн, аны чектөөгө болбойт.\n\nКолдонмону чектөө үчүн, адегенде Батареяны үнөмдөө режимин күйгүзүңүз."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Батареянын колдонулушун тескөө"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Чектелбейт"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оптималдаштырылган"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Чектелген"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"тексттин өлчөмү, чоң өлчөмдө басып чыгаруу, чоң арип, чоң текст, начар көрүү, текстти чоңойтуу, арип чоңойткуч, арипти чоңойтуу"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"динамикалык жарык ар дайым күйүк, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, тег, окугуч"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"баскычтоп, сенсорлор, дирилдөө,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Үн деңгээли, дирилдөө, \"Тынчымды алба\" режими"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Мультимедианын катуулугу"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Үндү алыстан башкаруу"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Бардык файлдарды башкарууга уруксат берүү"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Бул колдонмого түзмөктөгү жана башка байланышкан сактагычтардагы бардык файлдарды көрүп, өзгөртүп жана өчүрүүгө уруксат бересизби? Колдонмо файлдарды сизге айтпай пайдалана алат."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Бардык файлдарга мүмкүнчүлүк бар"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Толук экрандагы билдирмелер"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Бул колдонмого толук экрандагы билдирмелерди көрсөтүүгө уруксат берүү"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Бул колдонмого түзмөк кулпуланып турганда толук экрандагы билдирмелерди көрсөтүүгө уруксат бериңиз. Колдонмолор муну ойготкучтарды, кирүүчү чалууларды же башка шашылыш билдирмелерди көрсөтүү үчүн колдонушат."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Колдонмолордо жасалган аракеттерде фишингди текшерүү"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Скандоону колдонуу"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Жумуш колдонмолору үчүн скандоону колдонуу"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Скандоо түзмөгүңүздө жеке иштетилип, колдонмолордо жасалган аракеттерде фишинг же башка алдамчы аракеттер текшерилет. Эгер мындай аракеттер аныкталса, коркунучту ырастоо жана колдонмонун колдонуучуларына эскертүү берүү үчүн колдонмонун айрым маалыматы Google Play Protect кызматына жөнөтүлөт."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Бул – корголгон коопсуздук функциясы. Түзмөк тууралуу же жеке маалымат Google менен бөлүшүлбөйт. \n\nФишинг – кирүү эсептик дайындарын же башка жеке маалыматты уурдоо аракети."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 4e4a263..28e4ec4 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ປິດການນຳໃຊ້ສຽງ Bluetooth LE"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ປິດການນຳໃຊ້ຄຸນສົມບັດສຽງ Bluetooth LE ຫາກອຸປະກອນຮອງຮັບຄວາມສາມາດຂອງຮາດແວສຽງ LE."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ສະແດງການສະຫຼັບສຽງ LE ໃນລາຍລະອຽດອຸປະກອນ"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ຂ້າມລາຍຊື່ອະນຸຍາດສຽງ Bluetooth LE"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ໃຊ້ສຽງ LE ໂດຍຄ່າເລີ່ມຕົ້ນເຖິງວ່າອຸປະກອນຕໍ່ພ່ວງສຽງ LE ຈະບໍ່ໄດ້ຮັບການຢັ້ງຢືນວ່າເປັນໄປຕາມເກນລາຍຊື່ອະນຸຍາດກໍຕາມ."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"ອຸປະກອນມີເດຍ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ອຸປະກອນໂທ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ອຸປະກອນອື່ນໆ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"ອຸປະກອນທີ່ບັນທຶກໄວ້"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ເຊື່ອມໂຍງກັບບັນຊີ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ເຄີຍໃຊ້ກັບບັນຊີແລ້ວ"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth ຈະເປີດການຈັບຄູ່"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"ການຕັ້ງຄ່າການເຊື່ອມຕໍ່"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ເຊື່ອມຕໍ່ກ່ອນໜ້ານີ້"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ຂຽນໃນຊ່ອງຂໍ້ຄວາມ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ບໍ່ຕ້ອງສົນໃຈການກົດປຸ່ມປາກກາທັງໝົດ"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ປາກກາ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ການແບ່ງປັນສຽງ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ແບ່ງປັນສຽງ"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ການໂທ ແລະ ແຈ້ງປຸກ"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"ວັນທີ ແລະ ເວລາ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ພຣັອກຊີ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ລຶບ"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ພື້ນທີ່ສ່ວນຕົວ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ເຊື່ອງແອັບໄວ້ໃນໂຟນເດີສ່ວນຕົວ"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ປົດລັອກໂດຍໃຊ້ການລັອກໜ້າຈໍ"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ສະແດງພື້ນທີ່ສ່ວນຕົວ"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ເຊື່ອງເມື່ອລັອກໄວ້"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ເຊື່ອງພື້ນທີ່ສ່ວນຕົວເມື່ອລັອກໄວ້"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ເພື່ອບໍ່ໃຫ້ຄົນອື່ນຮູ້ວ່າພື້ນທີ່ສ່ວນຕົວຢູ່ໃນອຸປະກອນຂອງທ່ານ, ທ່ານສາມາດເຊື່ອງມັນຈາກລາຍຊື່ແອັບຂອງທ່ານໄດ້"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"ເຂົ້າເຖິງພື້ນທີ່ສ່ວນຕົວເມື່ອເຊື່ອງໄວ້"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ຊອກຫາ \'ພື້ນທີ່ສ່ວນຕົວ\' ໃນແຖບຊອກຫາ"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ແຕະແຜ່ນພື້ນທີ່ສ່ວນຕົວ"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ປົດລັອກພື້ນທີ່ສ່ວນຕົວຂອງທ່ານ"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ປິດຢູ່"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ເປີດຢູ່"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ລະບົບ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ສ້າງພື້ນທີ່ສ່ວນຕົວ"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ລຶບພື້ນທີ່ສ່ວນຕົວອອກ"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ບໍ່ສາມາດສ້າງພື້ນທີ່ສ່ວນຕົວໄດ້"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ລຶບພື້ນທີ່ສ່ວນຕົວອອກສຳເລັດແລ້ວ"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ບໍ່ສາມາດລຶບພື້ນທີ່ສ່ວນຕົວອອກໄດ້"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ຕັ້ງການລັອກໜ້າຈໍ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ຕັ້ງການລັອກໜ້າຈໍຢູ່ອຸປະກອນນີ້ເພື່ອໃຊ້ພື້ນທີ່ສ່ວນຕົວ."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ຕັ້ງການລັອກໜ້າຈໍ"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ຍົກເລີກ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ຍົກເລີກ"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"ຕັ້ງຄ່າ"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ຕັ້ງຄ່າພື້ນທີ່ສ່ວນຕົວ"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ເຊື່ອງແອັບສ່ວນຕົວໃນພື້ນທີ່ປອດໄພທີ່ມີແຕ່ທ່ານເທົ່ານັ້ນທີ່ສາມາດເຂົ້າເຖິງໄດ້"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ມັນເຮັດວຽກແນວໃດ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ທ່ານສາມາດເຂົ້າເຖິງພື້ນທີ່ສ່ວນຕົວໄດ້ຈາກລຸ່ມສຸດຂອງລາຍຊື່ແອັບຂອງທ່ານ"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ແອັບໃນພື້ນທີ່ສ່ວນຕົວໄດ້ຮັບການປົກປ້ອງໂດຍການລັອກ"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"ການແຈ້ງເຕືອນຈາກແອັບໃນພື້ນທີ່ສ່ວນຕົວຈະຖືກເຊື່ອງໄວ້ເມື່ອມັນຖືກລັອກໄວ້"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"ແອັບພື້ນທີ່ສ່ວນຕົວຈະບໍ່ປາກົດໃນຕົວຈັດການສິດອະນຸຍາດ, ແຜງໜ້າປັດຄວາມເປັນສ່ວນຕົວ ແລະ ການຕັ້ງຄ່າອື່ນໆເມື່ອພື້ນທີ່ສ່ວນຕົວຖືກລັອກໄວ້"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"ກຳລັງຕັ້ງຄ່າພື້ນທີ່ສ່ວນຕົວ…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"ພື້ນທີ່ສ່ວນຕົວຖືກປົກປ້ອງໂດຍລັອກ"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ຂໍ້ມູນການນຳໃຊ້ສຳລັບແອັບພື້ນທີ່ສ່ວນຕົວຖືກເຊື່ອງໄວ້ເມື່ອມັນຖືກລັອກໄວ້"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ເຂົ້າເຖິງພື້ນທີ່ສ່ວນຕົວຈາກລາຍຊື່ແອັບຂອງທ່ານ"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ບໍ່ສາມາດຕັ້ງຄ່າພື້ນທີ່ສ່ວນຕົວໄດ້"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ລອງຕອນນີ້ ຫຼື ກັບຄືນມາພາຍຫຼັງ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ລອງໃໝ່"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ໃຊ້ການລັອກໜ້າຈໍເພື່ອປົດລັອກບໍ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"ທ່ານສາມາດປົດລັອກພື້ນທີ່ສ່ວນຕົວດ້ວຍວິທີດຽວກັນກັບທີ່ທ່ານປົດລັອກອຸປະກອນຂອງທ່ານ ຫຼື ເລືອກລັອກອື່ນໄດ້"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ໃຊ້ການລັອກໜ້າຈໍ"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"ເລືອກລັອກໃໝ່"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"ຮຽບຮ້ອຍໝົດແລ້ວ!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ເພື່ອເຂົ້າເຖິງພື້ນທີ່ສ່ວນຕົວ, ໃຫ້ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໂຮມສະກຣີນຂອງທ່ານ, ຈາກນັ້ນເລື່ອນລົງ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ແລ້ວໆ"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"ເລື່ອນລົງເພື່ອເຂົ້າເຖິງພື້ນທີ່ສ່ວນຕົວ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"ທ່ານສາມາດເພີ່ມບໍ່ເກີນ <xliff:g id="COUNT">%d</xliff:g> ລາຍນີ້ວມື"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"You’ve added the maximum number of fingerprints"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Can’t add more fingerprints"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ສືບຕໍ່ໃຊ້ແອັບເມື່ອພັບຢູ່"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"ເພີ່ມອັດຕາການຣີເຟຣຊຈາກ 60 ເປັນ <xliff:g id="ID_1">%1$s</xliff:g> Hz ສຳລັບເນື້ອຫາຈຳນວນໜຶ່ງໂດຍອັດຕະໂນມັດ. ຈະໃຊ້ແບັດເຕີຣີຫຼາຍຂຶ້ນ."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"ເພີ່ມອັດຕາການຣີເຟຣຊສູງສຸດເຖິງ <xliff:g id="ID_1">%1$d</xliff:g> Hz ສຳລັບບາງເນື້ອຫາໂດຍອັດຕະໂນມັດ. ຈະໃຊ້ແບັດເຕີຣີຫຼາຍຂຶ້ນ."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ບັງຄັບອັດຕາຣີເຟຣຊສູງສຸດ"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"ອັດຕາຣີເຟຣດສູງສຸດເພື່ອປັບປຸງການຕອບສະໜອງການສຳຜັດ ແລະ ຄຸນນະພາບອະນິເມຊັນ. ເພີ່ມການນຳໃຊ້ແບັດເຕີຣີ."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ການເອົາໃຈໃສ່ໜ້າຈໍ"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"ການຕັ້ງຄ່າສ່ວນກາງ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"ແກ້ໄຂຈຸດການເຊື່ອມຕໍ່"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"ຍັງບໍ່ໄດ້ຕັ້ງ"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"ຍັງບໍ່ໄດ້ຕັ້ງ"</string>
<string name="apn_name" msgid="6677695784108157953">"ຊື່"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ໃຊ້ປຸ່ມການຊ່ວຍເຂົ້າເຖິງເພື່ອເປີດ"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"ກົດປຸ່ມລະດັບສຽງຄ້າງໄວ້ເພື່ອເປີດ"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ແຕະໜ້າຈໍສາມເທື່ອເພື່ອເປີດ"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ແຕະໜ້າຈໍສາມເທື່ອດ້ວຍສອງນິ້ວເພື່ອເປີດ"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ໃຊ້ທ່າທາງເພື່ອເປີດ"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ໃຊ້ທ່າທາງການຊ່ວຍເຂົ້າເຖິງ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະໃສ່ປຸ່ມການຊ່ວຍເຂົ້າເຖິງ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ຢູ່ລຸ່ມສຸດຂອງໜ້າຈໍທ່ານ.\n\nເພື່ອສະຫຼັບລະຫວ່າງຄຸນສົມບັດ, ໃຫ້ແຕະໃສ່ປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍທ່ານ."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ກົດປຸ່ມລະດັບສຽງທັງສອງຄ້າງໄວ້."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ເພື່ອເລີ່ມ ແລະ ຢຸດການຂະຫຍາຍຂອງທ່ານ, ໃຫ້ແຕະສາມເທື່ອໃສ່ບ່ອນໃດກໍໄດ້ຢູ່ໜ້າຈໍທ່ານ."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ເພື່ອເລີ່ມຕົ້ນ ແລະ ຢຸດການຂະຫຍາຍ, ໃຫ້ແຕະສາມເທື່ອບ່ອນໃດກໍໄດ້ຢູ່ໜ້າຈໍຂອງທ່ານດ້ວຍສອງນິ້ວ."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍ 2 ນິ້ວ.\n\nເພື່ອສະຫຼັບລະຫວ່າງຄຸນສົມບັດ, ໃຫ້ປັດຂຶ້ນດ້ວຍ 2 ນິ້ວຄ້າງໄວ້."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍ 3 ນິ້ວ.\n\nເພື່ອສະຫຼັບລະຫວ່າງຄຸນສົມບັດ, ໃຫ້ປັດຂຶ້ນດ້ວຍ 3 ນິ້ວຄ້າງໄວ້."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ເພື່ອໃຊ້ຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງ, ໃຫ້ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍ 2 ນິ້ວ.\n\nເພື່ອສະຫຼັບລະຫວ່າງຄຸນສົມບັດ, ໃຫ້ປັດຂຶ້ນດ້ວຍ 2 ນິ້ວຄ້າງໄວ້."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ກົດປຸ່ມລະດັບສຽງຄ້າງໄວ້"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ກົດປຸ່ມລະດັບສຽງຄ້າງໄວ້"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ກົດປຸ່ມລະດັບສຽງທັງສອງຄ້າງໄວ້"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ແຕະໜ້າຈໍສາມເທື່ອດ້ວຍສອງນິ້ວ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ແຕະໜ້າຈໍສາມເທື່ອດ້ວຍສອງນິ້ວ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ແຕະໜ້າຈໍຢ່າງວ່ອງໄວ {0,number,integer} ເທື່ອດ້ວຍສອງນິ້ວ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ແຕະໃສ່ໜ້າຈໍສາມເທື່ອ"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ແຕະໃສ່ໜ້າຈໍສາມເທື່ອ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ແຕະໜ້າຈໍໄວໆ {0,number,integer} ເທື່ອ. ທາງລັດນີ້ອາດເຮັດໃຫ້ອຸປະກອນຂອງທ່ານຊ້າລົງ"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ໃຊ້ການສັ່ນເຕືອນ ແລະ ການສຳຜັດ"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"ການສັ່ນເຕືອນໂມງປຸກ"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"ການສັ່ນເຕືອນມີເດຍ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"ການສັ່ນເຕືອນຂອງແປ້ນພິມ"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ສຽງພ້ອມການສັ່ນເຕືອນ"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"ການແຈ້ງເຕືອນແບບສັ່ນເຕືອນ"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ການຕອບສະໜອງການສຳຜັດ"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ຫາກທ່ານຈຳກັດການເຄື່ອນໄຫວໃນພື້ນຫຼັງສຳລັບແອັບໃດໜຶ່ງ, ມັນຈະເຮັດວຽກຜິດປົກກະຕິ"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ເນື່ອງຈາກແອັບນີ້ຍັງບໍ່ໄດ້ປັບແຕ່ງໃຫ້ໃຊ້ແບັດເຕີຣີໄດ້ຢ່າງເໝາະສົມເທື່ອ, ທ່ານຈຶ່ງບໍ່ສາມາດຈຳກັດມັນໄດ້.\n\nເພື່ອຈຳກັດແອັບດັ່ງກ່າວ, ໃຫ້ເປີດການປັບແຕ່ງແບັດເຕີຣີໃຫ້ເໝາະສົມກ່ອນ."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ຈັດການການໃຊ້ແບັດເຕີຣີ"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ບໍ່ຈຳກັດ"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ປັບໃຫ້ເໝາະສົມ"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ຈຳກັດ"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ຂະໜາດໜ້າຈໍ, ພິມຂະໜາດໃຫຍ່, ຟອນຂະໜາດໃຫຍ່, ຂໍ້ຄວາມຂະໜາດໃຫຍ່, ເບິ່ງເຫັນຍາກ, ເຮັດໃຫ້ຂໍ້ຄວາມໃຫຍ່ຂຶ້ນ, ຕົວຂະຫຍາຍຟອນ, ການຂະຫຍາຍຟອນ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ເປີດການສະແດງພາບພັກໜ້າຈໍໄວ້ຕະຫຼອດ, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ແທັກ, ຕົວອ່ານ"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ແປ້ນພິມ, ການສຳຜັດ, ສັ່ນເຕືອນ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ລະດັບສຽງ, ການສັ່ນເຕືອນ, ຫ້າມລົບກວນ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"ລະດັບສຽງມີເດຍ"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ສົ່ງສັນຍານລະດັບສຽງ"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ອະນຸຍາດການເຂົ້າເຖິງເພື່ອຈັດການໄຟລ໌ທັງໝົດ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ອະນຸຍາດໃຫ້ແອັບນີ້ອ່ານ, ແກ້ໄຂ ແລະ ລຶບໄຟລ໌ທັງໝົດຢູ່ອຸປະກອນນີ້ ຫຼື ບ່ອນຈັດເກັບຂໍ້ມູນໃດກໍຕາມທີ່ເຊື່ອມຕໍ່ໄວ້. ຫາກໄດ້ຮັບອະນຸຍາດແລ້ວ, ແອັບຈະສາມາດເຂົ້າເຖິງໄຟລ໌ໂດຍແຈ້ງໃຫ້ທ່ານຮັບຮູ້ຢ່າງຈະແຈ້ງໄດ້."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ສາມາດເຂົ້າເຖິງໄຟລ໌ທັງໝົດ"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ການແຈ້ງເຕືອນແບບເຕັມຈໍ"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ອະນຸຍາດໃຫ້ແອັບນີ້ສະແດງການແຈ້ງເຕືອນແບບເຕັມຈໍ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ອະນຸຍາດໃຫ້ແອັບນີ້ສະແດງການແຈ້ງເຕືອນແບບເຕັມຈໍເມື່ອອຸປະກອນລັອກຢູ່. ແອັບອາດໃຊ້ການແຈ້ງເຕືອນເຫຼົ່ານີ້ເພື່ອໄຮໄລ້ໂມງປຸກ, ສາຍໂທເຂົ້າ ຫຼື ການແຈ້ງເຕືອນສຸກເສີນອື່ນໆ."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"ຊື່ອຸປະກອນຂອງທ່ານຈະສະແດງໃຫ້ແອັບທີ່ທ່ານຕິດຕັ້ງໄວ້ເຫັນ. ມັນອາດຖືກສະແດງໃຫ້ຄົນອື່ນເຫັນໃນເວລາທີ່ທ່ານເຊື່ອມຕໍ່ຫາອຸປະກອນ Bluetooth, ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi-Fi ຫຼື ຕັ້ງຄ່າຮັອດສະປອດ Wi-Fi ນຳ."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"ເພດທາງໄວຍາກອນ"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"ເລືອກເພດທາງໄວຍາກອນ"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"ການສະແກນຫາແອັບຫຼອກລວງ"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"ກວດສອບການເຄື່ອນໄຫວແອັບສຳລັບການຫຼອກເອົາຂໍ້ມູນ"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ໃຊ້ການສະແກນ"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ໃຊ້ການສະແກນສຳລັບແອັບບ່ອນເຮັດວຽກ"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 0a689a2..e4731d5 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"„Bluetooth LE Audio“ išjungimas"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Jei įrenginys palaiko „LE Audio“ aparatinės įrangos galimybes, išjungiama funkcija „Bluetooth LE Audio“."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Rodyti „LE Audio“ jungiklį įrenginio informacijoje"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"„Bluetooth LE Audio“ leidžiamųjų sąrašo išskyrimas"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Naudoti „LE Audio“ pagal numatytuosius nustatymus, net jei „LE Audio“ išorinis įrenginys nebuvo patvirtintas kaip atitinkantis leidžiamųjų sąrašo kriterijus."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Laikmenos"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Skambinimo įrenginiai"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Kiti įrenginiai"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Išsaugoti įrenginiai"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Susieta su paskyra"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Anksčiau naudota su paskyra"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bus įjungtas „Bluetooth“, kad būtų galima susieti"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Ryšio nuostatos"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Anksčiau susieti"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Rašymas teksto laukuose"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Visų rašiklio mygtuko paspaudimų nepaisymas"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Rašiklis"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Garso bendrinimas"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Bendrinti garsą"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Skambučiai ir signalai"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Data ir laikas"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Tarpinis serveris"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Išvalyti"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privati erdvė"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Slėpkite programas privačiame aplanke"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Atrakinimas naudojant ekrano užraktą"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Privačios erdvės rodymas"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Slėpimas užrakinus"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Užrakintos privačios erdvės slėpimas"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Jei nenorite, kad kiti žmonės žinotų, jog privati erdvė yra jūsų įrenginyje, galite slėpti ją programų sąraše"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Prieiga prie paslėptos privačios erdvės"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Ieškokite pagal užklausą „Privati erdvė“ paieškos juostoje"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Palieskite privačios erdvės pavadinimą"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Atrakinti privačią erdvę"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Išjungti"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Įjungti"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Privačios erdvės kūrimas"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Privačios erdvės ištrynimas"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Nepavyko sukurti privačios erdvės"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privati erdvė sėkmingai ištrinta"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Nepavyko ištrinti privačios erdvės"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Nustatykite ekrano užraktą"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Jei norite naudoti privačią erdvę, nustatykite ekrano užraktą šiame įrenginyje."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ekrano užrakto nustatymas"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Atšaukti"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Atšaukti"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Nustatyti"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Privačios erdvės nustatymas"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Slėpkite privačias programas saugioje erdvėje, kurią galite pasiekti tik jūs"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Kaip tai veikia"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Privačią erdvę galite pasiekti iš programų sąrašo apačios"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Programos privačioje erdvėje saugomos jas užrakinant"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Pranešimai iš programų privačioje erdvėje slepiami, kai ji užrakinta"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Privačios erdvės programos nebus rodomos leidimų tvarkytuvėje, privatumo informacijos suvestinėje ir kituose nustatymuose, kai privati erdvė bus užrakinta"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Nustatoma privati erdvė…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privati erdvė saugoma ją užrakinant"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Privačios erdvės programų naudojimo informacija paslėpta, kai užrakinta"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Prieiga prie privačios erdvės iš programų sąrašo"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Nepavyko nustatyti privačios erdvės"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Bandykite dar kartą dabar arba grįžkite vėliau"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Bandyti dar kartą"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Naudoti ekrano užraktą norint atrakinti?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Galite atrakinti privačią erdvę taip pat, kaip atrakinate įrenginį, arba pasirinkti kitą užraktą"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Naudoti ekrano užraktą"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Pasirinkti naują užraktą"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Viskas nustatyta!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Kad pasiektumėte privačią erdvę, perbraukite aukštyn iš pagrindinio ekrano apačios, tada slinkite žemyn"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Atlikta"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Slinkite žemyn, kad pasiektumėte privačią erdvę"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Galite pridėti iki <xliff:g id="COUNT">%d</xliff:g> piršto ats."</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Pridėjote maksimalų skaičių kontrolinių kodų"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Negalima pridėti daugiau kontrolinių kodų"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Toliau naudoti programas, kai įrenginys sulenktas"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Ekrano glodinimas"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automatiškai padidinamas kai kurio turinio atnaujinimo dažnis nuo 60 iki <xliff:g id="ID_1">%1$s</xliff:g> Hz. Vartojama daugiau akumuliatoriaus energijos."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automatiškai padidinamas kai kurio turinio atnaujinimo dažnis iki <xliff:g id="ID_1">%1$d</xliff:g> Hz. Vartojama daugiau akumuliatoriaus energijos."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Priverstinai nustatyti didžiausią atnaujinimo dažnį"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Didžiausias atnaujinimo dažnis, siekiant patobulinti palietimo atsakomumą ir animacijos kokybę. Vartojama daugiau akumuliatoriaus energijos."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Žiūrėjimas į ekraną"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Bendruomenės nustatymai"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Redaguoti prieigos tašką"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nenustatyta"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nenustatyta"</string>
<string name="apn_name" msgid="6677695784108157953">"Pavadinimas"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Naudokite pritaikomumo mygtuką, kad atidarytumėte"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Norėdami atidaryti, palaikykite garsumo klavišus"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Norėdami atidaryti, triskart palieskite ekraną"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Atidarymas palietus ekraną tris kartus dviem pirštais"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Naudokite gestą, kad atidarytumėte"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Pritaikomumo gesto naudojimas"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Norėdami naudoti šią funkciją, ekrano apačioje palieskite pritaikomumo mygtuką <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nJei norite perjungti funkcijas, palieskite ir palaikykite pritaikomumo mygtuką."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Jei norite naudoti šią funkciją, palieskite pritaikomumo mygtuką ekrane."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Norėdami naudoti šią funkciją, paspauskite ir palaikykite abu garsumo klavišus."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Norėdami pradėti ar baigti didinti, triskart palieskite bet kur ekrane."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Jei norite pradėti ar baigti didinti, triskart palieskite bet kurioje ekrano vietoje dviem pirštais."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Norėdami naudoti šią funkciją, perbraukite dviem pirštais aukštyn nuo ekrano apačios.\n\nJei norite perjungti funkcijas, perbraukite aukštyn dviem pirštais ir palaikykite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Norėdami naudoti šią funkciją, perbraukite trimis pirštais aukštyn nuo ekrano apačios.\n\nJei norite perjungti funkcijas, perbraukite aukštyn trimis pirštais ir palaikykite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Norėdami naudoti pritaikymo neįgaliesiems funkciją, perbraukite dviem pirštais aukštyn nuo ekrano apačios.\n\nJei norite perjungti funkcijas, perbraukite aukštyn dviem pirštais ir palaikykite."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Laikyti garsumo klavišus"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"laikyti garsumo klavišus"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Paspauskite ir palaikykite abu garsumo klavišus"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Ekrano palietimas tris kartus dviem pirštais"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ekrano palietimas tris kartus dviem pirštais"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Greitai palieskite ekraną {0,number,integer} k. dviem pirštais"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ekrano palietimas tris kartus"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"triskart paliesti ekraną"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Sparčiai palieskite ekraną {0,number,integer} k. Dėl šio sparčiojo klavišo įrenginys gali veikti lėčiau"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Vibravimo ir lietimo technologijos naudojimas"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Signalo vibravimas"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Medijos vibravimas"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Klaviatūros vibravimas"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibravimas skambant telefonui"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibravimas gavus pranešimą"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Lietimo grįžtamasis ryšys"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Jei apribosite programos veiklą fone, ji gali netinkamai veikti"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Negalite apriboti progr., nes ji nenust. optimiz. akum. naud.\n\nJei norite apr. progr., pirmiausia įj. akum. naud. optimiz."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Akumuliatoriaus energijos vartojimo valdymas"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neapribota"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizuota"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Apribota"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"teksto dydis, didelis spaudinys, didelis šriftas, didelis tekstas, sutrikusio regėjimo asmuo, padaryti tekstą didesnį, šrifto didinimo priemonė, šrifto padidinimas"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"visada įjungta ekrano užsklanda, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, žyma, skaitytuvas"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klaviatūra, lietimo technologija, vibruoti,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Garsumas, vibravimas, netrukdymo režimas"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Medijų garsumas"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Perdavimo garsumas"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Leisti pasiekti ir tvarkyti visus failus"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Šiai programai leidžiama nuskaityti, keisti ir ištrinti visus failus, esančius šiame įrenginyje ar bet kurioje prijungtoje saugykloje. Jei suteiksite leidimą, programa gali pasiekti failus jūsų tiksliai neinformavus."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Gali pasiekti visus failus"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Pranešimai viso ekrano režimu"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Leisti pranešimus viso ekrano režimu iš šios programos"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Leiskite šiai programai rodyti pranešimus viso ekrano režimu, kai įrenginys užrakintas. Programos gali juos naudoti, kad paryškintų įspėjimus, gaunamuosius skambučius ar kitus skubius pranešimus."</string>
@@ -4882,16 +4943,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Įrenginio pavadinimas matomas jūsų įdiegtoms programoms. Kai prisijungiate prie „Bluetooth“ įrenginių ar „Wi-FI“ tinklo arba nustatote „Wi-Fi“ viešosios interneto prieigos tašką, jį taip pat gali matyti kiti žmonės."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Gramatinė giminė"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Pasirinkite gramatinę giminę"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Nuskaitoma ieškant apgaulingų programų"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Patikrinkite programų aktyvumą dėl sukčiavimo"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Atlikti nuskaitymą"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Atlikti darbo programų nuskaitymą"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 95e198f..e25539c 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Atspējot Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Tiek atspējota Bluetooth LE Audio funkcija, ja ierīcē tiek atbalstītas LE Audio aparatūras iespējas."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE Audio slēdzis informācijā par ierīci"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Apiet Bluetooth LE Audio atļaušanas sarakstu"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Pēc noklusējuma izmantot LE Audio, pat ja nav pārbaudīta LE Audio perifērijas ierīces atbilstība atļaušanas saraksta kritērijiem."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Multivides ierīces"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Zvanīšanas ierīces"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Citas ierīces"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saglabātās ierīces"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Ar kontu saistītās ierīces"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Iepriekš izmantotas ar kontu"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Tiks ieslēgts Bluetooth un izveidots savienojums pārī."</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Savienojuma preferences"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Ierīces, ar kurām savienojums tika izveidots iepriekš"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Rakstīšana teksta laukos"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Vienmēr ignorēt skārienekrāna pildspalvas pogu nospiešanu"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Skārienekrāna pildspalva"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio kopīgošana"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Kopīgot audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Zvani un signāli"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Datums un laiks"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Starpniekserveris"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Notīrīt"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privātā mape"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Paslēpiet lietotnes privātā mapē."</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Atbloķēt, izmantojot ekrāna bloķēšanas metodi"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Parādīt privāto mapi"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Paslēpšana, kamēr šī mape ir bloķēta"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Privātās mapes paslēpšana, kamēr tā ir bloķēta"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Lai citi nezinātu, ka ierīcē ir privātā mape, varat paslēpt to no lietotņu saraksta."</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Piekļūstiet privātajai mapei, kamēr tā ir paslēpta"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Meklēšanas joslā meklējiet “privātā mape”."</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Pieskarieties elementam “Privātā mape”."</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Atbloķējiet privāto mapi."</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Izslēgta"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Ieslēgta"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistēma"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Izveidot privātu mapi"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Dzēst privāto mapi"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Privāto mapi nevarēja izveidot."</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privātā mape ir sekmīgi izdzēsta."</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Privāto mapi nevarēja izdzēst."</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ekrāna bloķēšanas iestatīšana"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Lai izmantotu privāto mapi, iestatiet ekrāna bloķēšanu šajā ierīcē."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Iestatīt ekrāna bloķēšanu"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Atcelt"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Atcelt"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Iestatīt"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Privātās mapes iestatīšana"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Paslēpiet privātas lietotnes drošā vietā, kam varēsiet piekļūt tikai jūs."</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Darbības principi"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Varat piekļūt privātajai mapei lietotņu saraksta apakšdaļā."</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Bloķēšana aizsargā privātajā mapē ievietotās lietotnes."</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Kamēr privātā mape ir bloķēta, paziņojumi no tajā ievietotajām lietotnēm tiek slēpti."</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Kamēr privātā mape ir bloķēta, tajā ievietotās lietotnes netiek rādītas atļauju pārvaldniekā, konfidencialitātes informācijas panelī un citos iestatījumos."</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Notiek privātās mapes iestatīšana…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privātā mape tiek aizsargāta, izmantojot bloķēšanu"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Lietojuma informācija par privātās mapes lietotnēm tiek slēpta, kamēr mape ir bloķēta"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Varat piekļūt privātajai mapei lietotņu sarakstā"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Nevarēja iestatīt privāto mapi"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Mēģiniet vēlreiz tūlīt vai atgriezieties vēlāk."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Mēģināt vēlreiz"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Vai atbloķēt ar ekrāna bloķēšanas opciju?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Varat atbloķēt privāto mapi tāpat kā ierīci vai izvēlēties citu bloķēšanas metodi."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Izmantot ekrāna bloķēšanas opciju"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Izvēlēties jaunu bloķēšanas metodi"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Gatavs!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Lai piekļūtu privātajai mapei, velciet augšup no sākuma ekrāna apakšdaļas un pēc tam ritiniet lejup."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Gatavs"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Lai piekļūtu privātajai mapei, ritiniet lejup."</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Varat pievienot līdz <xliff:g id="COUNT">%d</xliff:g> pirkstu nospiedumiem."</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Jūs esat pievienojis maksimālo pirkstu nospiedumu skaitu."</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nevar pievienot citus pirkstu nospiedumus."</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Turpināt izmantot lietotnes, kad ierīce ir salocīta"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Noteikta satura atsvaidzināšanas biežums tiek automātiski palielināts no 60 līdz <xliff:g id="ID_1">%1$s</xliff:g> Hz. Tas palielina akumulatora lietojumu."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Noteikta satura atsvaidzināšanas biežums tiek automātiski palielināts līdz <xliff:g id="ID_1">%1$d</xliff:g> Hz. Tas palielina akumulatora lietojumu."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Piespiedu maksimālais atsvaidzināšanas biežums"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Augstākais atsvaidzināšanas biežums uzlabotai reakcijai uz pieskārienu un labākai animācijas kvalitātei. Tas palielina akumulatora lietojumu."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atpazīšana ekrānā"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Kopīgie iestatījumi"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Rediģēt piekļuves punktu"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nav iestatīts"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nav iestatīts"</string>
<string name="apn_name" msgid="6677695784108157953">"Nosaukums"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Pieejamības pogas izmantošana atvēršanai"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Lai atvērtu, turiet nospiestas skaļuma pogas"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Lai atvērtu, trīsreiz pieskarieties ekrānam"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Lai atvērtu, ar diviem pirkstiem trīsreiz pieskarieties ekrānam"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Žesta izmantošana atvēršanai"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Pieejamības žesta izmantošana"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Lai izmantotu šo funkciju, ekrāna apakšdaļā pieskarieties pieejamības pogai <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nLai pārslēgtu funkcijas, pieskarieties pieejamības pogai un turiet to."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Lai izmantotu šo funkciju, pieskarieties ekrānā esošajai pieejamības pogai."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Lai izmantotu šo funkciju, nospiediet un turiet abas skaļuma pogas."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Lai sāktu un apturētu palielināšanu, trīsreiz pieskarieties jebkurā ekrāna vietā."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Lai sāktu un apturētu palielināšanu, ar diviem pirkstiem trīsreiz pieskarieties jebkur ekrānā."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Lai izmantotu šo funkciju, ar diviem pirkstiem velciet augšup no ekrāna apakšdaļas.\n\nLai pārslēgtu funkcijas, velciet augšup ar diviem pirkstiem un turiet."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Lai izmantotu šo funkciju, ar trīs pirkstiem velciet augšup no ekrāna apakšdaļas.\n\nLai pārslēgtu funkcijas, velciet augšup ar trīs pirkstiem un turiet."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Lai izmantotu pieejamības funkciju, ar diviem pirkstiem velciet augšup no ekrāna apakšdaļas.\n\nLai pārslēgtu funkcijas, velciet augšup ar diviem pirkstiem un turiet."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Turēt nospiestas skaļuma pogas"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"turiet nospiestus skaļuma pogas"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Nospiediet un turiet abas skaļuma pogas"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Trīskāršais skāriens uz ekrāna ar diviem pirkstiem"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trīskāršais skāriens uz ekrāna ar diviem pirkstiem"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Ar diviem pirkstiem {0,number,integer} reizes ātri pieskarieties ekrānam."</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Pieskaršanās ekrānam 3 reizes"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"trīsreiz pieskarieties ekrānam"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ātri pieskarieties ekrānam {0,number,integer} reizes. Šī saīsne var palēnināt ierīces darbību."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Izmantot vibrāciju un vibrāciju pieskaroties"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Signāla vibrācija"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Multivides atskaņošanas vibrācija"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Tastatūras vibrācija"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Zvana vibrācija"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Paziņojuma vibrācija"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Pieskarieties vienumam Atsauksmes"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ierobežojot lietotnes darbību fonā, var rasties šīs lietotnes darbības traucējumi."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Lietotnei nav iestatīta akumulatora optimizācija, tāpēc to nevar ierobežot.\n\nVispirms iestatiet akumulatora optimizāciju."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Akumulatora lietojuma pārvaldība"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neierobežots"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizēts"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ierobežoti"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"teksta lielums, lieli burti, lieli fonti, liels teksts, vājredzība, padarīt tekstu lielāku, fontu palielinātājs, fontu palielināšana"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"vienmēr ieslēgts ambientajā režīmā, nepārtraukti aktīvs displejs"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, atzīme, lasītājs"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastatūra, haptiskā tehnoloģija, vibrācija,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Skaļums, vibrācija, režīms “Netraucēt”"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Multivides skaļums"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Apraides skaļums"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Atļaut piekļuvi visu failu pārvaldībai"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Atļaujiet šai lietotnei lasīt, pārveidot un dzēst visus failus šajā ierīcē vai pievienotajās atmiņas ierīcēs. Ja piešķirsiet atļauju, lietotne varēs piekļūt failiem, jums par to nezinot."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Var piekļūt visiem failiem"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Pilnekrāna paziņojumi"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Atļaut šīs lietotnes pilnekrāna paziņojumus"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Atļaujiet šai lietotnei rādīt paziņojumus pilnekrāna režīmā, kad ierīce ir bloķēta. Lietotnes var šādi izcelt signālus, ienākošos zvanus vai citus svarīgus paziņojumus."</string>
@@ -4881,16 +4942,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Jūsu ierīces nosaukums ir redzams jūsu instalētajām lietotnēm. Tas var būt redzams arī citām personām, ja izveidosiet savienojumu ar Bluetooth ierīcēm, Wi-Fi tīklu vai iestatīsiet Wi-Fi tīklāju."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Gramatiskā dzimte"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Atlasiet gramatisko dzimti"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Meklēt maldinošas lietotnes"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Pārbaudīt, vai lietotnē tiek veikta pikšķerēšana"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Veikt pārbaudi"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Veikt pārbaudi darba lietotnēm"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 7297202..ed06da0 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Оневозможи Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Ја оневозможува функцијата Bluetooth LE Audio ако уредот поддржува хардверски способности за LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Прекинувач за LE Audio во „Детали за уредот“"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Игнорирај го списокот со дозволени за Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Користи LE Audio стандардно дури и ако не е потврдено дека периферното LE Audio ги исполнува критериумите на списокот со дозволени."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Преносливи уреди"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Уреди за повикување"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Други уреди"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Зачувани уреди"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Поврзано со сметка"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Претходно користено со сметка"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth ќе се вклучи за спарување"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Поставки за врски"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Претходно поврзани"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Пишувајте во текстуалните полиња"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Игнорирајте ги сите притискања на копчето на пенкалото"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Пенкало"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Споделување аудио"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Споделете го аудиото"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Повици и аларми"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Поврзете се со стрим на LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Аудиостримови во близина"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Аудиостримови"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Поврзете се со аудиострим со QR-код"</string>
<string name="date_and_time" msgid="1788358029823431692">"Датум и време"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Избриши"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Приватен простор"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Скријте ги апликациите во приватна папка"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Отклучете со заклучувањето екран"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Прикажи „Приватен простор“"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Скриј кога уредот е заклучен"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Скриј го „Приватниот простор“ кога е заклучен"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"За да спречите други луѓе да знаат дека „Приватниот простор“ е на вашиот уред, може да го скриете од списокот со апликации"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Пристапете до „Приватен простор“ кога е скриен"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Пребарајте „Приватен простор“ во полето за пребарување"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Допрете ја плочката „Приватен простор“"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Отклучете го вашиот „Приватен простор“"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Исклучено"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Вклучено"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Систем"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Создајте „Приватен простор“"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Избришете го „Приватниот простор“"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"„Приватниот простор“ не можеше да се создаде"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"„Приватниот простор“ е успешно избришан"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"„Приватниот простор“ не можеше да се избрише"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Поставете заклучување екран"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"За да користите „Приватен простор“, поставете заклуч. екран."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Поставете заклучување екран"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Откажи"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Откажи"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Постави"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Поставете „Приватен простор“"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Скријте ги приватните апликации во безбеден простор до кој може да пристапите само вие"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Како функционира"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Може да пристапите до „Приватен простор“ од дното на списокот со апликации"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Апликациите во „Приватен простор“ се заштитени со заклучување"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Известувањата од апликациите во „Приватниот простор“ се скриени кога е заклучен"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Апликациите во „Приватниот простор“ нема да се појавуваат во управникот со дозволи, контролната табла за приватност и другите поставки кога „Приватен простор“ е заклучен"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Се поставува „Приватен простор“…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"„Приватниот простор“ е заштитен со заклучување"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Податоците за користењето за апликациите во „Приватниот простор“ се скриени кога е заклучен"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Пристапете до „Приватен простор“ од списокот со апликации"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Не можеше да се постави „Приватен простор“"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Обидете се повторно сега или вратете се подоцна"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Обиди се пак"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Да се користи заклучување екран за отклучување?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Може да го отклучите „Приватен простор“ исто како што го отклучувате уредот или да изберете друг начин на заклучување"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Користете заклучување екран"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Изберете нов начин на заклучување"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Готово!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"За да пристапите до „Приватен простор“, повлечете нагоре од дното на почетниот екран, а потоа лизгајте надолу"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Готово"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Лизгајте надолу за да пристапите до „Приватен простор“"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Може да додадете до <xliff:g id="COUNT">%d</xliff:g> отпечатоци"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Додадовте максимален број на отпечатоци"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Не може да се додадат повеќе отпечатоци"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Продолжете да ги користите апликациите при преклопување"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Течен приказ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Автоматски ја зголемува стапката на освежување од 60 на <xliff:g id="ID_1">%1$s</xliff:g> Hz за некои содржини. Го зголемува користењето на батеријата."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Автоматски ја зголемува стапката на освежување до <xliff:g id="ID_1">%1$d</xliff:g> Hz за одредени содржини. Го зголемува користењето на батеријата."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Наметни максимална стапка на освежување"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Највисока стапка на освежување за подобрена реакција на допир и квалитет на анимацијата. Го зголемува користењето на батеријата."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Вклучен екран"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Заеднички поставки"</string>
<string name="apn_settings" msgid="4295467389400441299">"Поставки за APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Изменете ја пристапната точка"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Додајте пристапна точка"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Не е поставено"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Не е поставено"</string>
<string name="apn_name" msgid="6677695784108157953">"Име"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Отворање со копчето за пристапност"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Држете ги копчињата за јачина на звук за отворање"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Допрете го екранот трипати за отворање"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Допрете на екранот трипати со два прста за да отворите"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Користете движење за да отворите"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Користете го движењето за пристапност"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"За да ја користите функцијава, допрете го копчето за пристапност <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> на дното на екранот.\n\nЗа префрлање помеѓу функциите, допрете и задржете го копчето за пристапност."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"За да ја користите функцијава, допрете го копчето за пристапност на екранот."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"За да ја користите функцијава, притиснете и задржете ги двете копчиња за јачина на звук."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"За почеток и крај на зголемувањето, допрете трипати каде било на екранот."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"За да го започнете и запрете зголемувањето, допрете каде било на екранот трипати со два прста."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"За да ја користите функцијава, повлечете нагоре од дното на екранот со два прста.\n\nЗа да се префрлите на друга функција, повлечете нагоре со два прста и задржете."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"За да ја користите функцијава, повлечете нагоре од дното на екранот со три прста.\n\nЗа префрлање помеѓу функциите, повлечете нагоре со три прста и задржете."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"За да користите функција за пристапност, повлечете нагоре од дното на екранот со два прста.\n\nЗа да се префрлите на друга функција, повлечете нагоре со два прста и задржете."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Задржете ги копчињата за јачина на звук"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"задржете ги копчињата за јачина на звук"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Притиснете и задржете ги двете копчиња за јачина на звук"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Допрете го екранот трипати со два прста"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"допрете го екранот трипати со два прста"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Брзо допрете го екранот {0,number,integer} пати со два прста"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Троен допир на екранот"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"допрете трипати на екранот"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Брзо допрете го екранот {0,number,integer} пати Оваа кратенка може да го забави уредот"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Користи вибрации и хаптика"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Вибрации за аларм"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Вибрации за аудиовизуелни содржини"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Вибрации на тастатурата"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Вибрации при ѕвонење"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Вибрации при известување"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Вибрации при допир"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Апликацијата може да се однесува необично ако ја ограничите нејзината активност во заднина"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Апликацијава не е оптимизирана и не може да се ограничи.\n\nЗа да ја ограничите, прво вклучете оптимизација на батеријата."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Управувајте со користењето на батеријата"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Овозможете користење во заднина"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Овозможете за ажурирања во реално време, оневозможете за да заштедите батерија"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Неограничено"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оптимизирано"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ограничено"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"големина на текст, големи букви, голем фонт, голем текст, слаб вид, зголемување текст, фонт, зголеми, зголеми фонт"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"секогаш вклучено амбиентален екран, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ознака, читач"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"тастатура, хаптика, вибрации,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Јачина на звук, вибрации и „Не вознемирувај“"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Јачина на аудио/видео звук"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Јачина на звук на емитување"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Дозволи пристап за управување со датотеки"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Дозволете апликацијава да ги чита, менува и брише сите датотеки на уредов или на поврзаните мемориски уреди. Ако се дозволи, апликацијата може да пристапува до датотеките без ваше изречно знаење."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Може да пристапува до сите датотеки"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Известувања на цел екран"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Дозволете известувања на цел екран од оваа апликација"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Дозволете апликацијава да прикажува известувања што го заземаат целиот екран кога уредот е заклучен. Апликациите може да ги користат овие известувања за да ги истакнуваат алармите, дојдовните повици или други итни известувања."</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Името на уредот е видливо за апликациите што сте ги инсталирале. Може да го видат и други луѓе кога ќе се поврзете со уреди со Bluetooth, на Wi-Fi мрежа или кога ќе поставите точка на пристап за Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Граматички род"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Изберете граматички род"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Скенирање измамнички апликации"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Проверка на активноста во апликацијата за фишинг"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Скенирај"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Скенирај работни апликации"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index c3c3d38..e49d018 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE ഓഡിയോ പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ഉപകരണം LE ഓഡിയോ ഹാർഡ്വെയർ ശേഷികളെ പിന്തുണയ്ക്കുന്നുണ്ടെങ്കിൽ Bluetooth LE ഓഡിയോ ഫീച്ചർ പ്രവർത്തനരഹിതമാക്കുന്നു."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ഉപകരണ വിശദാംശങ്ങളിൽ LE ഓഡിയോ ടോഗിൾ കാണിക്കൂ"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE ഓഡിയോ വൈറ്റ്ലിസ്റ്റ് ബൈപാസ് ചെയ്യുക"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE ഓഡിയോ പെരിഫറൽ, വൈറ്റ്ലിസ്റ്റ് മാനദണ്ഡം പാലിക്കുന്നുണ്ടോയെന്ന് പരിശോധിച്ചുറപ്പിച്ചിട്ടില്ലെങ്കിലും ഡിഫോൾട്ടായി LE ഓഡിയോ ഉപയോഗിക്കുക."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"മീഡിയ ഉപകരണങ്ങൾ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"കോൾ ഉപകരണങ്ങൾ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"മറ്റ് ഉപകരണങ്ങൾ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"സംരക്ഷിച്ച ഉപകരണങ്ങൾ"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തിയിരിക്കുന്നു"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"മുമ്പ് അക്കൗണ്ടിൽ ഉപയോഗിച്ചത്"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ജോടിയാക്കുന്നതിന് Bluetooth ഓണാക്കും"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"കണക്ഷൻ മുൻഗണനകൾ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"മുമ്പ് കണക്റ്റ് ചെയ്തവ"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ടെക്സ്റ്റ് ഫീൽഡുകളിൽ എഴുതുക"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"സ്റ്റൈലസ് ബട്ടൺ അമർത്തൽ ഒഴിവാക്കുക"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"സ്റ്റൈലസ്"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ഓഡിയോ പങ്കിടൽ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ഓഡിയോ പങ്കിടൂ"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"കോളുകളും അലാറങ്ങളും"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE ഓഡിയോ സ്ട്രീമിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"സമീപത്തെ ഓഡിയോ സ്ട്രീമുകൾ"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ഓഡിയോ സ്ട്രീമുകൾ"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR കോഡ് ഉപയോഗിച്ച് ഓഡിയോ സ്ട്രീമിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
<string name="date_and_time" msgid="1788358029823431692">"തീയതിയും സമയവും"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"പ്രോക്സി"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"മായ്ക്കുക"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"സ്വകാര്യ Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"സ്വകാര്യ ഫോൾഡറിൽ ആപ്പുകൾ മറയ്ക്കുക"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"സ്ക്രീൻ ലോക്ക് ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്യുക"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"സ്വകാര്യ Space കാണിക്കുക"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ലോക്ക് ചെയ്തിരിക്കുമ്പോൾ മറയ്ക്കൂ"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ലോക്ക് ചെയ്തിരിക്കുമ്പോൾ സ്വകാര്യ സ്പേസ് മറയ്ക്കുക"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ഉപകരണത്തിലെ സ്വകാര്യ സ്പേസ് ആരും അറിയാതിരിക്കാൻ ആപ്പ് ലിസ്റ്റിൽ നിന്ന് അത് മറയ്ക്കാം"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"മറച്ചിരിക്കുമ്പോൾ സ്വകാര്യ സ്പേസ് ആക്സസ് ചെയ്യൂ"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"തിരയൽ ബാറിൽ \'സ്വകാര്യ സ്പേസ്\' എന്ന് തിരയുക"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"സ്വകാര്യ സ്പേസ് ടൈൽ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"നിങ്ങളുടെ സ്വകാര്യ സ്പേസ് അൺലോക്ക് ചെയ്യുക"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ഓഫാണ്"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ഓണാണ്"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"സിസ്റ്റം"</string>
<string name="private_space_create_title" msgid="47273568884806726">"സ്വകാര്യ Space സൃഷ്ടിക്കുക"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"സ്വകാര്യ Space ഇല്ലാതാക്കുക"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"സ്വകാര്യ Space സൃഷ്ടിക്കാനായില്ല"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"സ്വകാര്യ Space ഇല്ലാതാക്കി"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"സ്വകാര്യ Space ഇല്ലാതാക്കാനായില്ല"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"സ്ക്രീൻ ലോക്ക് സജ്ജീകരിക്കൂ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"സ്വകാര്യ സ്പേസിന് ഈ ഉപകരണത്തിൽ സ്ക്രീൻ ലോക്ക് സജ്ജീകരിക്കൂ."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"സ്ക്രീൻ ലോക്ക് സജ്ജീകരിക്കൂ"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"റദ്ദാക്കൂ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"റദ്ദാക്കുക"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"സജ്ജീകരിക്കുക"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"സ്വകാര്യ സ്പേസ് സജ്ജീകരിക്കുക"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"നിങ്ങൾക്ക് മാത്രം ആക്സസ് ചെയ്യാൻ കഴിയുന്ന സുരക്ഷിതമായ ഒരിടത്ത് സ്വകാര്യ ആപ്പുകൾ മറയ്ക്കുക"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ഇതെങ്ങനെ പ്രവർത്തിക്കുന്നു"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"നിങ്ങളുടെ ആപ്പ് ലിസ്റ്റിന്റെ താഴെ നിന്ന് സ്വകാര്യ സ്പേസ് ആക്സസ് ചെയ്യാം"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"സ്വകാര്യ സ്പേസിലെ ആപ്പുകൾ ലോക്ക് ഉപയോഗിച്ച് പരിരക്ഷിച്ചിരിക്കുന്നു"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"സ്വകാര്യ സ്പേസ് ലോക്ക് ചെയ്തിരിക്കുമ്പോൾ, അതിലെ ആപ്പുകളിൽ നിന്നുള്ള അറിയിപ്പുകൾ മറയ്ക്കും"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"സ്വകാര്യ സ്പേസ് ലോക്ക് ചെയ്തിരിക്കുമ്പോൾ അനുമതി മാനേജർ, സ്വകാര്യതാ ഡാഷ്ബോർഡ്, മറ്റ് ക്രമീകരണം എന്നിവയിൽ സ്വകാര്യ സ്പേസ് ആപ്പുകൾ ദൃശ്യമാകില്ല"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"സ്വകാര്യ സ്പേസ് സജ്ജീകരിക്കുന്നു…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"സ്വകാര്യ സ്പേസ് ലോക്ക് ഉപയോഗിച്ച് പരിരക്ഷിച്ചിരിക്കുന്നു"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"സ്വകാര്യ സ്പേസ് ലോക്ക് ചെയ്തിരിക്കുമ്പോൾ, അതിലെ ആപ്പുകളുടെ ഉപയോഗ വിവരങ്ങൾ മറച്ചിരിക്കും"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ആപ്പ് ലിസ്റ്റിൽ നിന്ന് സ്വകാര്യ സ്പേസ് ആക്സസ് ചെയ്യുക"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"സ്വകാര്യ സ്പേസ് സജ്ജീകരിക്കാനായില്ല"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ഇപ്പോൾ വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ പിന്നീട് മടങ്ങി വരിക"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"അൺലോക്ക് ചെയ്യാൻ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കണോ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"ഉപകരണം അൺലോക്ക് ചെയ്യുന്ന അതേ രീതിയിൽ നിങ്ങൾക്ക് സ്വകാര്യ സ്പേസ് അൺലോക്ക് ചെയ്യാം അല്ലെങ്കിൽ മറ്റൊരു ലോക്ക് തിരഞ്ഞെടുക്കാം"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"പുതിയ ലോക്ക് തിരഞ്ഞെടുക്കുക"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"എല്ലാം സജ്ജീകരിച്ചു!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"സ്വകാര്യ സ്പേസ് ആക്സസ് ചെയ്യാൻ, നിങ്ങളുടെ ഹോം സ്ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക, തുടർന്ന് താഴേക്ക് സ്ക്രോൾ ചെയ്യുക"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"പൂർത്തിയായി"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"സ്വകാര്യ സ്പേസ് ആക്സസ് ചെയ്യാൻ താഴേക്ക് സ്ക്രോൾ ചെയ്യുക"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"നിങ്ങൾക്ക് <xliff:g id="COUNT">%d</xliff:g> ഫിംഗർപ്രിന്റുകൾ വരെ ചേർക്കാം"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"നിങ്ങൾ പരമാവധി എണ്ണം ഫിംഗർപ്രിന്റുകൾ ചേർത്തിട്ടുണ്ട്"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"കൂടുതൽ ഫിംഗർപ്രിന്റുകൾ ചേർക്കാൻ കഴിയില്ല"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ഫോൾഡിൽ ആപ്പുകൾ ഉപയോഗിക്കുന്നത് തുടരുക"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"സ്മൂത്ത് ഡിസ്പ്ലേ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"ചില ഉള്ളടക്കങ്ങളുടെ റീഫ്രഷ് തോത് 60-ൽ നിന്നും <xliff:g id="ID_1">%1$s</xliff:g> Hz-ലേക്ക് സ്വയമേവ ഉയർത്തുന്നു. ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിക്കുന്നു."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"ചില ഉള്ളടക്കങ്ങളുടെ റീഫ്രഷ് തോത് <xliff:g id="ID_1">%1$d</xliff:g> Hz വരെ സ്വയമേവ ഉയർത്തുന്നു. ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിക്കുന്നു."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"പരമാവധി റീഫ്രഷ് നിരക്ക് നിർബന്ധിതമാക്കുക"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"മെച്ചപ്പെട്ട സ്പർശന പ്രതികരണശേഷി, ആനിമേഷൻ നിലവാരം എന്നിവയ്ക്കുള്ള ഉയർന്ന റീഫ്രഷ് നിരക്ക്. ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിക്കുന്നു."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"സ്ക്രീൻ ശ്രദ്ധ"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"കമ്മ്യൂണൽ ക്രമീകരണങ്ങൾ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-കൾ"</string>
<string name="apn_edit" msgid="2003683641840248741">"ആക്സസ് പോയിന്റ് എഡിറ്റ് ചെയ്യുക"</string>
+ <string name="apn_add" msgid="9069613192201630934">"ആക്സസ് പോയിന്റ് ചേർക്കുക"</string>
<string name="apn_not_set" msgid="8246646433109750293">"സജ്ജീകരിച്ചിട്ടില്ല"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"സജ്ജീകരിച്ചിട്ടില്ല"</string>
<string name="apn_name" msgid="6677695784108157953">"പേര്"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"തുറക്കാൻ ഉപയോഗസഹായി ബട്ടൺ ഉപയോഗിക്കുക"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"തുറക്കുന്നതിന് വോളിയം കീകൾ അമർത്തിപ്പിടിക്കുക"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"തുറക്കുന്നതിന് സ്ക്രീൻ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"തുറക്കാൻ, രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രീനിൽ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"തുറക്കാൻ വിരൽചലനം ഉപയോഗിക്കുക"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ഉപയോഗസഹായി ജെസ്ച്ചർ ഉപയോഗിക്കുക"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ, നിങ്ങളുടെ സ്ക്രീനിന്റെ ചുവടെയുള്ള ഉപയോഗസഹായി ബട്ടൺ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ടാപ്പ് ചെയ്യുക.\n\nഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, ഉപയോഗസഹായി ബട്ടൺ സ്പർശിച്ച് പിടിക്കുക."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ, നിങ്ങളുടെ സ്ക്രീനിലുള്ള ഉപയോഗസഹായി ബട്ടൺ ടാപ്പുചെയ്യുക."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും അമർത്തിപ്പിടിക്കുക."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"മാഗ്നിഫിക്കേഷൻ ആരംഭിക്കാനും നിർത്താനും സ്ക്രീനിൽ എവിടെയെങ്കിലും മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"മാഗ്നിഫിക്കേഷൻ ആരംഭിക്കാനും നിർത്താനും രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രീനിൽ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ, സ്ക്രീനിന്റെ ചുവടെ നിന്ന് രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക.\n\nഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ,സ്ക്രീനിന്റെ ചുവടെ നിന്ന് മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക.\n\nഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ഉപയോഗസഹായി ഫീച്ചർ ഉപയോഗിക്കാൻ, സ്ക്രീനിന്റെ ചുവടെ നിന്ന് രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക.\n\nഫീച്ചറുകൾക്കിടയിൽ മാറാൻ, രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"വോളിയം കീകൾ അമർത്തിപ്പിടിക്കുക"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"വോളിയം കീകൾ പിടിക്കുക"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"രണ്ട് വോളിയം കീകളും അമർത്തിപ്പിടിക്കുക"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രീനിൽ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രീനിൽ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രീനിൽ {0,number,integer} തവണ വേഗത്തിൽ ടാപ്പ് ചെയ്യുക"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"സ്ക്രീൻ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"സ്ക്രീനിൽ മൂന്ന് തവണ ടാപ്പ് ചെയ്യുക"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"സ്ക്രീനിൽ {0,number,integer} തവണ വേഗത്തിൽ ടാപ്പ് ചെയ്യുക. ഈ കുറുക്കുവഴി നിങ്ങളുടെ ഉപകരണത്തിന്റെ വേഗത കുറച്ചേക്കാം"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"വെെബ്രേഷനും ഹാപ്റ്റിക്സും ഉപയോഗിക്കുക"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"അലാറം വെെബ്രേഷൻ"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"മീഡിയ വൈബ്രേഷൻ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"കീബോർഡ് വൈബ്രേഷൻ"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"റിംഗ് വൈബ്രേഷൻ"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"അറിയിപ്പ് വൈബ്രേഷൻ"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"സ്പർശന ഫീഡ്ബാക്ക്"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"നിങ്ങൾ ഒരു ആപ്പിനായി പശ്ചാത്തല പ്രവർത്തനം പരിമിതപ്പെടുത്തുകയാണെങ്കിൽ, അത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ബാറ്ററി ഓപ്റ്റിമൈസ് ചെയ്യാൻ ഈ ആപ്പ് സജ്ജീകരിക്കാത്തതിനാൽ, നിങ്ങൾക്ക് ഇത് നിയന്ത്രിക്കാനാവില്ല.\n\nആപ്പ് നിയന്ത്രിക്കാൻ, ആദ്യം ബാറ്ററി ഓപ്റ്റിമൈസേഷൻ ഓണാക്കുക."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ബാറ്ററി ഉപയോഗം മാനേജ് ചെയ്യുക"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"പശ്ചാത്തലത്തിലെ ഉപയോഗം അനുവദിക്കുക"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"തത്സമയ അപ്ഡേറ്റുകൾക്കായി പ്രവർത്തനക്ഷമമാക്കുക, ബാറ്ററി സംരക്ഷിക്കാൻ പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"നിയന്ത്രണമില്ലാത്തത്"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ഒപ്റ്റിമൈസ് ചെയ്തത്"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"നിയന്ത്രിതം"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ടെക്സ്റ്റ് വലുപ്പം, വലിയ പ്രിന്റ്, വലിയ ഫോണ്ട്, വലിയ ടെക്സ്റ്റ്, കുറഞ്ഞ കാഴ്ച, ടെക്സ്റ്റ് കൂടുതൽ വലുതാക്കുക, ഫോണ്ട് വലുതാക്കൽ, ഫോണ്ടിന്റെ വലുപ്പം കൂട്ടൽ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"എപ്പോഴും ഓണായിരിക്കുന്ന ആമ്പിയന്റ് ഡിസ്പ്ലേ, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ടാഗ്, റീഡർ"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"കീബോർഡ്, ഹാപ്റ്റിക്സ്, വൈബ്രേറ്റ് ചെയ്യൽ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ശബ്ദം, വൈബ്രേഷൻ, ശല്യപ്പെടുത്തരുത്"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"മീഡിയാ വോളിയം"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"വോളിയം കാസ്റ്റ് ചെയ്യുക"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"എല്ലാ ഫയലുകളും മാനേജ് ചെയ്യാൻ ആക്സസ് അനുവദിക്കൂ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ഈ ഉപകരണത്തിലെയോ ഇതുമായി ബന്ധിപ്പിച്ചിട്ടുള്ള ഏതെങ്കിലും സ്റ്റോറേജുകളിലെയോ എല്ലാ ഫയലുകളും വായിക്കാനും പരിഷ്ക്കരിക്കാനും ഇല്ലാതാക്കാനും ഈ ആപ്പിനെ അനുവദിക്കുക. അനുമതി നൽകിയിട്ടുണ്ടെങ്കിൽ, നിങ്ങളുടെ അറിവില്ലാതെ തന്നെ ആപ്പ് ഫയലുകൾ ആക്സസ് ചെയ്തേക്കാം."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"എല്ലാ ഫയലുകളും ആക്സസ് ചെയ്യാനാവും"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"പൂർണ്ണ സ്ക്രീനിലുള്ള അറിയിപ്പുകൾ"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ഈ ആപ്പിൽ നിന്നുള്ള പൂർണ്ണ സ്ക്രീൻ അറിയിപ്പുകൾ അനുവദിക്കുക"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ഉപകരണം ലോക്ക് ചെയ്തിരിക്കുമ്പോൾ അറിയിപ്പുകൾ പൂർണ്ണ സ്ക്രീനിൽ കാണിക്കാൻ ഈ ആപ്പിനെ അനുവദിക്കുക. അലാറങ്ങൾ, ഇൻകമിംഗ് കോളുകൾ അല്ലെങ്കിൽ മറ്റ് അടിയന്തര അറിയിപ്പുകൾ ഹെെലെെറ്റ് ചെയ്യാൻ ആപ്പുകൾ ഇവ ഉപയോഗിച്ചേക്കാം."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ഫിഷിംഗ് ആണോയെന്ന് അറിയാൻ ആപ്പ് ആക്റ്റിവിറ്റി പരിശോധിക്കുക"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"സ്കാൻ ചെയ്യൽ ഉപയോഗിക്കുക"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ഔദ്യോഗിക ആപ്പുകളിൽ സ്കാൻ ചെയ്യൽ ഉപയോഗിക്കുക"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"നിങ്ങളുടെ ഉപകരണത്തിൽ സ്വകാര്യമായാണ് സ്കാൻ ചെയ്യൽ നടക്കുന്നത്, ഫിഷിംഗ് ആണോയെന്ന് അറിയാനും വഞ്ചനാപരമായ മറ്റ് സ്വഭാവങ്ങൾ കണ്ടെത്താനുമായി ആപ്പ് ആക്റ്റിവിറ്റി പരിശോധിക്കുന്നു. അവ കണ്ടെത്തുകയാണെങ്കിൽ, ഭീഷണി സ്ഥിരീകരിക്കാനും ആപ്പ് ഉപയോക്താക്കൾക്ക് മുന്നറിയിപ്പ് നൽകാനുമായി ചില ആപ്പ് വിവരങ്ങൾ Google Play Protect-ലേക്ക് അയയ്ക്കുന്നു."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"ഇത് ഒരു പരിരക്ഷിത സുരക്ഷാ ഫീച്ചറാണ്. ഒരു തരത്തിലുള്ള ഉപകരണ വിവരങ്ങളോ വ്യക്തിപരമായ വിവരങ്ങളോ Google-മായി പങ്കിടുന്നില്ല. \n\nസൈൻ ഇൻ ക്രെഡൻഷ്യലുകളോ മറ്റ് വ്യക്തിപരമായ വിവരങ്ങളോ മോഷ്ടിക്കാനുള്ള ശ്രമമാണ് ഫിഷിംഗ്."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 4df86f8..fb43ff1 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE аудиог идэвхгүй болгох"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Хэрэв төхөөрөмж LE аудио техник хангамжийн чадамжийг дэмждэг бол Bluetooth LE аудио онцлогийг идэвхгүй болгоно."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Төхөөрөмжийн дэлгэрэнгүйд LE аудионы асаах/унтраахыг харуул"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Аудиогийн зөвшөөрсөн жагсаалтыг алгасах"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Аудиогийн нэмэлт хэрэгслийг Зөвшөөрсөн жагсаалтын шалгуурт нийцэж байгаа эсэхийг баталгаажуулаагүй байсан ч өгөгдмөлөөр LE Аудиог ашиглана уу."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Медиа төхөөрөмжүүд"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Дуудлага хийх төхөөрөмжүүд"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Бусад төхөөрөмж"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Хадгалсан төхөөрөмж"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Бүртгэлтэй холбоотой"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Өмнө нь бүртгэлээр ашигласан"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth холбогдохын тулд асна"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Холболтын тохируулга"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Өмнө нь холбогдсон"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Текстийн талбарт бичих"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Бүх мэдрэгч үзгийн товчлуур даралтыг үл хэрэгсэнэ үү"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Мэдрэгч үзэг"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Аудио хуваалцах"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Аудиог хуваалцах"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Дуудлага болон сэрүүлгүүд"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Огноо, цаг"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Цэвэрлэх"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Хувийн орон зай"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Аппуудыг хувийн фолдерт нуух"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Дэлгэцийн түгжээг ашиглан түгжээг тайлах"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Хувийн орон зайг харуулах"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Түгжсэн үед нуух"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Түгжээтэй үед Private Space-г нуух"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Таны төхөөрөмжид Private Space байгааг бусад хүнд мэдэгдэхгүй байхын тулд та үүнийг аппуудынхаа жагсаалтаас нууж болно"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Нуусан үед Private Space-т хандах"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Хайлтын талбарт \'Private Space\'-г хайна уу"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Private Space-н хавтанг товшино уу"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Өөрийн Private Space-н түгжээг тайлна уу"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Унтраалттай"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Асаалттай"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Систем"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Хувийн орон зай үүсгэх"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Хувийн орон зайг устгах"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Хувийн орон зайг үүсгэж чадсангүй"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Хувийн орон зайг амжилттай устгасан"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Хувийн орон зайг устгаж чадсангүй"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Дэлгэцийн түгжээг тохируулах"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Хувийн орон зайг ашиглах бол уг төхөөрөмжид дэлгэцийн түгжээ тохируулна уу."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Дэлгэцийн түгжээ тохируулах"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Цуцлах"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Цуцлах"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Тохируулах"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Private Space-г тохируулах"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Хувийн аппуудыг зөвхөн та өөрөө хандах боломжтой аюулгүй газарт нууна уу"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Энэ хэрхэн ажилладаг вэ?"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Та Private Space-т аппуудын жагсаалтынхаа доод талаас хандах боломжтой"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Private Space-н аппуудыг түгжээгээр хамгаалдаг"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Private Space түгжээтэй үед түүний аппуудын мэдэгдлийг нуудаг"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space түгжээтэй үед Private Space-н аппууд зөвшөөрлийн менежер, нууцлалын хяналтын самбар болон бусад тохиргоонд харагдахгүй"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Private Space-г тохируулж байна…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space-г түгжээгээр хамгаалдаг"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Private Space-г түгжээтэй үед түүний аппуудын ашиглалтын мэдээллийг нуудаг"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Аппуудын жагсаалтаасаа Private Space-т хандах"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Private Space-г тохируулж чадсангүй"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Одоо дахин оролдох эсвэл дараа буцаж ирнэ үү"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Дахин оролдох"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Түгжээг тайлахад дэлгэцийн түгжээг ашиглах уу?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Та Private Space-н түгжээг төхөөрөмжийнхөө түгжээг тайлдагтайгаа ижил аргаар тайлах эсвэл өөр түгжээ сонгох боломжтой"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Дэлгэцийн түгжээг ашиглах"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Шинэ түгжээ сонгох"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Тохируулж дууслаа!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Private Space-т хандахын тулд үндсэн нүүрнийхээ доод талаас дээш шударч, дараа нь доош гүйлгэнэ үү"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Болсон"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Private Space-т хандахын тулд доош гүйлгэнэ үү"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Та <xliff:g id="COUNT">%d</xliff:g> хүртэлх хурууны хээ нэмж болно"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Таны зөвшөөрөгдсөн хурууны хээний тоо гүйцсэн байна"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Өөр хурууны хээ нэмэх боломжгүй байна"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Эвхэгддэг дэлгэцэд аппуудыг үргэлжлүүлэн ашиглах"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Зарим контентын сэргээх хурдыг автоматаар 60-с <xliff:g id="ID_1">%1$s</xliff:g> Гц болгож өсгөнө. Батарей ашиглалтыг нэмэгдүүлнэ."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Зарим контентын сэргээх хурдыг <xliff:g id="ID_1">%1$d</xliff:g> Гц болгож автоматаар өсгөнө. Батарей ашиглалтыг нэмэгдүүлнэ."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Сэргээх хамгийн өндөр хурдыг хүчлэх"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Хүрэлтийн хариу үйлдэл болон анимацийн чанарыг сайжруулахад зориулсан хамгийн өндөр сэргээх хурд юм. Батарей ашиглалтыг нэмэгдүүлнэ."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Соргог дэлгэц"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Нийтийн тохиргоо"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Хандалтын цэгийг засах"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Тохируулаагүй"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Тохируулаагүй"</string>
<string name="apn_name" msgid="6677695784108157953">"Нэр"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Нээхийн тулд хандалтын товчлуурыг ашиглах"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Нээхийн тулд дууны түвшний түлхүүрүүдийг удаан дар"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Нээхийн тулд дэлгэцийг гурав товшино уу"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Нээхийн тулд хоёр хуруугаараа дэлгэцийг гурав товшино уу"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Нээхийн тулд зангааг ашиглах"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Хандалтын зангаа ашиглах"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Энэ онцлогийг ашиглахын тулд дэлгэцийнхээ доод хэсэгт байрлах хандалтын товчлуур <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> дээр товшино уу.\n\nОнцлогуудын хооронд сэлгэхийн тулд хандалтын товчлуур дээр удаан дарна уу."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Энэ онцлогийг ашиглахын тулд дэлгэц дээрх хандалтын товчлуурыг товшино уу."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Энэ онцлогийг ашиглахын тулд дууны түвшний түлхүүрүүдийг зэрэг удаан дарна уу."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Томруулахыг эхлүүлэх болон зогсоохын тулд дэлгэцийнхээ аль нэг хэсэгт гурав товшино уу."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Томруулахыг эхлүүлэх болон зогсоохын тулд хоёр хуруугаараа дэлгэцийнхээ аль нэг хэсэгт гурав товш."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Энэ онцлогийг ашиглахын тулд дэлгэцийн доод хэсгээс 2 хуруугаараа дээш шударна уу.\n\nОнцлогуудын хооронд сэлгэхийн тулд 2 хуруугаараа дээш шударч, удаан дарна уу."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Энэ онцлогийг ашиглахын тулд дэлгэцийн доод хэсгээс 3 хуруугаараа дээш шударна уу.\n\nОнцлогуудын хооронд сэлгэхийн тулд 3 хуруугаараа дээш шударч, удаан дарна уу."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Хандалтын онцлогийг ашиглахын тулд дэлгэцийн доод хэсгээс 2 хуруугаараа дээш шударна уу.\n\nОнцлогуудын хооронд сэлгэхийн тулд 2 хуруугаараа дээш шударч, удаан дарна уу."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Дууны түвшний товчийг удаан дарах"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"дууны түвшний түлхүүрийг удаан дарах"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Дууны түвшний хоёр товчийг зэрэг удаан дарна уу"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Дэлгэцийг хоёр хуруугаараа гурав товшино уу"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"дэлгэцийг хоёр хуруугаараа гурав товшино уу"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Дэлгэцийг хоёр хуруугаараа {0,number,integer} удаа шуурхай товшино уу"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Дэлгэцийг гурав товших"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"дэлгэцийг гурав товших"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Дэлгэцийг {0,number,integer} удаа хурдан товшино уу. Энэ товчлол таны төхөөрөмжийг удаашруулж магадгүй."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Чичиргээ болон хүртэхүйг ашиглах"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Сэрүүлгийн чичиргээ"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Медиагийн чичиргээ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Гарын чичиргээ"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Хонхны чичиргээ"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Мэдэгдлийн чичиргээ"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Хүрэхэд хариу чичрэх"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Та арын үйл ажиллагааг аппад хязгаарласан тохиолдолд апп буруу ажиллаж болзошгүй"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Энэ аппыг батарейг оновчлохоор тохируулаагүй тул та үүнийг хязгаарлах боломжгүй.\n\nАппыг хязгаарлахын тулд эхлээд батарейны оновчлолыг асаана уу."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Батарей ашиглалтыг удирдах"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Хязгаарлаагүй"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оновчилсон"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Хязгаарласан"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"текстийн хэмжээ, том хэвлэл, том фонт, том текст, сул хараа, текстийг илүү том болгох, фонт томруулагч, фонт томруулалт"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"дэлгэц амраагчид үргэлж, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, шошго, уншигч"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"гар, хүртэхүй, чичиргээ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Түвшин, чичиргээ, Бүү саад бол"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Медиа дууны түвшин"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Дамжуулах түвшин"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Бүх файлыг удирдахын тулд хандахыг зөвшөөрөх"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Энэ аппад энэ төхөөрөмж дээрх эсвэл холбогдсон дурын хадгалах сангийн бүх файлыг унших, өөрчлөх болон устгахыг зөвшөөрөх. Зөвшөөрөл олгогдсон бол апп нь танд тодорхойлон мэдэгдэлгүйгээр файлд хандаж болзошгүй."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Бүх файлд хандах боломжтой"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Бүтэн дэлгэцийн мэдэгдэл"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Энэ аппаас бүтэн дэлгэцийн мэдэгдлийг зөвшөөрөх"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Төхөөрөмжийг түгжээтэй үед энэ аппад бүтэн дэлгэцийг эзлэх мэдэгдэл харуулахыг зөвшөөрнө үү. Сэрүүлэг, ирсэн дуудлага эсвэл бусад яаралтай мэдэгдлийг онцлоход аппууд эдгээрийг ашиглаж магадгүй."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Таны төхөөрөмжийн нэр суулгасан аппуудад тань харагдана. Таныг Bluetooth төхөөрөмжүүд, Wi-Fi сүлжээнд холбогдох эсвэл Wi-Fi сүлжээний цэг тохируулах үед үүнийг мөн бусад хүн харж магадгүй."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Хэл зүйн хүйс"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Хэл зүйн хүйс сонгох"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Хууран мэхлэх аппууд байгаа эсэхийг скан хийх"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Фишинг байгаа эсэхийг аппын үйл ажиллагаанаас шалгана уу"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Скан хийхийг ашиглах"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Ажлын аппуудад скан хийхийг ашиглах"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 0fd598f..8ee6c2c 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ब्लूटूथ LE ऑडिओ बंद करा"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"डिव्हाइसला LE ऑडिओ हार्डवेअरसंबंधित क्षमतांचा सपोर्ट असल्यास, ब्लूटूथ LE ऑडिओ वैशिष्ट्य बंद करते."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"डिव्हाइस तपशील यांत LE ऑडिओ टॉगल दाखवा"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ब्लूटूथ LE ऑडिओ अनुमती सूची बायपास करा"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"अनुमती सूचीच्या निकषांची पूर्तता करण्यासाठी LE ऑडिओ पेरिफेरलची पडताळणी केली नसली, तरीही बाय डीफॉल्ट LE ऑडिओ वापरा."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"मीडिया डिव्हाइस"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"कॉल डिव्हाइस"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"इतर डिव्हाइस"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"सेव्ह केलेली डिव्हाइस"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"खात्याशी संबंधित"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"याआधी खात्यासह वापरले"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"पेअर करण्यासाठी ब्लूटूथ सुरू होईल"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"कनेक्शन प्राधान्ये"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"याआधी कनेक्ट केलेले"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"मजकूर फील्डमध्ये लिहा"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"सर्व स्टायलस बटण दाबण्याकडे दुर्लक्ष करा"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"स्टायलस"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ऑडिओ शेअरिंग"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ऑडिओ शेअर करा"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"कॉल आणि अलार्म"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"तारीख आणि वेळ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"प्रॉक्सी"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"साफ करा"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"खाजगी स्पेस"</string>
<string name="private_space_summary" msgid="8237652417163408001">"खाजगी फोल्डरमध्ये ॲप्स लपवा"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"स्क्रीन लॉक वापरून अनलॉक करा"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"खाजगी स्पेस दाखवा"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"लॉक केलेली असताना लपवा"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"खाजगी स्पेस लॉक केलेली असताना ती लपवा"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"डिव्हाइसवर खाजगी स्पेस आहे हे इतरांना कळू नये यासाठी ॲप्स सूचीतून ती लपवता येते"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"तुमची खाजगी स्पेस लपवलेली असताना अॅक्सेस करा"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"शोध बारमध्ये \'खाजगी स्पेस\' शोधा"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"खाजगी स्पेस च्या टाइलवर टॅप करा"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"तुमची खाजगी स्पेस अनलॉक करा"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"बंद आहे"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"सुरू आहे"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"सिस्टीम"</string>
<string name="private_space_create_title" msgid="47273568884806726">"खाजगी स्पेस तयार करा"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"खाजगी स्पेस हटवा"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"खाजगी स्पेस तयार केली जाऊ शकत नाही"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"खाजगी स्पेस यशस्वीरीत्या हटवली आहे"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"खाजगी स्पेस हटवली जाऊ शकत नाही"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"स्क्रीन लॉक सेट करा"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"खाजगी जागा वापरण्यासाठी, या डिव्हाइसवर स्क्रीन लॉक सेट करा."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"स्क्रीन लॉक सेट करा"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"रद्द करा"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"रद्द करा"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"सेट करा"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"खाजगी स्पेस सेट करा"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"फक्त तुम्ही अॅक्सेस करू शकता अशा सुरक्षित जागी खाजगी ॲप्स लपवा"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ती कशी काम करते"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"तुम्ही तुमच्या अॅप्स सूचीच्या तळाशी खाजगी स्पेस अॅक्सेस करू शकता"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"खाजगी स्पेस मधील ॲप्स लॉकद्वारे संरक्षित केलेली असतात"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"खाजगी स्पेस लॉक केलेली असताना त्यामधील ॲप्सच्या सूचना लपवल्या जातात"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"खाजगी स्पेस लॉक केलेली असताना, त्यामधील ॲप्स ही परवानगी व्यवस्थापक, गोपनीयता डॅशबोर्ड आणि इतर सेटिंग्जमध्ये दिसणार नाहीत"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"खाजगी स्पेस सेट करत आहे…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"खाजगी स्पेस ही लॉकद्वारे संरक्षित केलेली आहे"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"खाजगी स्पेस ॲप्सची वापर माहिती लॉक केल्यावर लपवली जाते"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"तुमच्या अॅप सूचीमधून खाजगी स्पेस अॅक्सेस करा"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"खाजगी स्पेस सेट करता आली नाही"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"आता पुन्हा प्रयत्न करा किंवा नंतर परत या"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"पुन्हा प्रयत्न करा"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"अनलॉक करण्यासाठी स्क्रीन लॉक वापरायचे आहे का?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"तुम्ही तुमचे डिव्हाइस अनलॉक करता त्याच प्रकारे तुमची खाजगी स्पेस अनलॉक करू शकता किंवा दुसरे लॉक निवडू शकता"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"स्क्रीन लॉक वापरा"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"नवीन लॉक निवडा"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"सर्व तयार आहे!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"खाजगी स्पेस अॅक्सेस करण्यासाठी, तुमच्या होम स्क्रीनच्या तळापासून वर स्वाइप करा, त्यानंतर खाली स्क्रोल करा"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"पूर्ण झाली"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"खाजगी स्पेस अॅक्सेस करण्यासाठी खाली स्क्रोल करा"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"तुम्ही <xliff:g id="COUNT">%d</xliff:g> पर्यंत फिंगरप्रिंट जोडू शकता"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"तुम्ही जास्तीत जास्त फिंगरप्रिंट जोडले आहेत"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"आणखी फिंगरप्रिंट जोडू शकत नाही"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"फोल्डवर ॲप्स वापरणे पुढे सुरू ठेवा"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"स्मूथ डिस्प्ले"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"काही आशयासाठी रिफ्रेश रेट ६० ते <xliff:g id="ID_1">%1$s</xliff:g> Hz पर्यंत आपोआप वाढवते. बॅटरी वापर वाढवते."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"काही आशयासाठी रिफ्रेश रेट कमाल <xliff:g id="ID_1">%1$d</xliff:g> Hz पर्यंत आपोआप वाढवते. बॅटरी वापर वाढवते."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"सक्तीने सर्वोच्च रिफ्रेश रेट गाठा"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"सुधारित स्पर्श प्रतिसाद आणि अॅनिमेशन गुणवत्तेसाठी उच्चतम रिफ्रेश रेट. बॅटरी वापर वाढवतो."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"स्क्रीन अटेंशन"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"सामुदायिक सेटिंग्ज"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"अॅक्सेस पॉइंट संपादित करा"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"सेट नाही"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"सेट केलेले नाही"</string>
<string name="apn_name" msgid="6677695784108157953">"नाव"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"उघडण्यासाठी अॅक्सेसिबिलिटी बटण वापरा"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"उघडण्यासाठी व्हॉल्यूम की धरून ठेवा"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"उघडण्यासाठी स्क्रीनवर तीनदा टॅप करा"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"उघडण्यासाठी स्क्रीनवर दोन बोटांनी तीन वेळा टॅप करा"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"उघडण्यासाठी जेश्चर वापरा"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ॲक्सेसिबिलिटी जेश्चर वापरा"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"हे वैशिष्ट्य वापरण्यासाठी, तुमच्या स्क्रीनच्या तळाशी असलेले ॲक्सेसिबिलिटी बटणावर <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> टॅप करा.\n\nवैशिष्टयांदरम्यान स्विच करण्यासाठी ॲक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"हे वैशिष्ट्य वापरण्यासाठी, तुमच्या स्क्रीनवरील अॅक्सेसिबिलिटी बटणावर टॅप करा."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"हे वैशिष्ट्य वापरण्यासाठी, दोन्ही व्हॉल्यूम की प्रेस करून धरून ठेवा."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"मॅग्निफिकेशन सुरू करण्यासाठी आणि थांबवण्यासाठी तुमच्या स्क्रीनवर कुठेही तीनदा टॅप करा."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"मॅग्निफिकेशन सुरू करण्यासाठी आणि थांबवण्यासाठी तुमच्या स्क्रीनवर दोन बोटांनी कुठेही तीनदा टॅप करा."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"हे वैशिष्ट्य वापरण्यासाठी, दोन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी दोन बोटांनी वर स्वाइप करा आणि धरून ठेवा."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"हे वैशिष्ट्य वापरण्यासाठी, तीन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी तीन बोटांनी वर स्वाइप करा आणि धरून ठेवा."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ॲक्सेसिबिलिटी वैशिष्ट्य वापरण्यासाठी, दोन बोटांनी स्क्रीनच्या तळापासून वर स्वाइप करा.\n\nवैशिष्ट्यांदरम्यान स्विच करण्यासाठी दोन बोटांनी वर स्वाइप करा आणि धरून ठेवा."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"व्हॉल्यूम की प्रेस करून ठेवा"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"व्हॉल्यूम की प्रेस करून ठेवा"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"दोन्ही व्हॉल्यूम की प्रेस करून धरून ठेवा"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"स्क्रीनवर दोन बोटांनी तीन वेळा टॅप करा"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"स्क्रीनवर दोन बोटांनी तीन वेळा टॅप करा"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"दोन बोटांनी स्क्रीनवर {0,number,integer} वेळा झटपट टॅप करा"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"स्क्रीनवर तीन वेळा टॅप करा"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"स्क्रीनवर तीन वेळा टॅप करा"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"स्क्रीनवर झटपट {0,number,integer} वेळा टॅप करा. हा शॉर्टकट तुमच्या डिव्हाइसचा वेग कमी करू शकताे"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"व्हायब्रेशन आणि हॅप्टिक वापरा"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"अलार्म व्हायब्रेशन"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"मीडिया व्हायब्रेशन"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"कीबोर्ड व्हायब्रेशन"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"रिंग व्हायब्रेशन"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"सूचना व्हायब्रेशन"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"टच फीडबॅक"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"तुम्ही एखाद्या ॲपसाठी बॅकग्राउंड ॲक्टिव्हिटी मर्यादित ठेवल्यास, ते व्यवस्थित न चालण्याची शक्यता आहे"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"हे अॅप बॅटरी ऑप्टिमाइझ करण्यासाठी सेट केलेले नसल्याने, तुम्ही ते प्रतिबंधित करू शकत नाही.\n\nअॅप प्रतिबंधित करण्यासाठी, प्रथम बॅटरी ऑप्टिमायझेशन सुरू करा"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"बॅटरीचा वापर व्यवस्थापित करा"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"कोणताही प्रतिबंध नाही"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ऑप्टिमाइझ केली"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"प्रतिबंधित"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"मजकुराचा आकार, मोठी प्रिंट, मोठा फॉंट, मोठा मजकूर, कमी दृश्यमानता, मजकूर आणखी मोठा करा, फॉंटचा आकार मोठा करणारा, फॉंटचा आकार मोठा करणे"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"नेहमी सुरू अँबियंट डिस्प्ले, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, टॅग, रीडर"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"कीबोर्ड, हॅप्टिक, व्हायब्रेट,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"आवाज, व्हायब्रेट, व्यत्यय आणू नका"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"मीडिया व्हॉल्यूम"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"व्हॉल्यूम कास्ट करा"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"सर्व फाइल व्यवस्थापनासाठी अॅक्सेस द्या"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"या ॲपला या डिव्हाइसवरील किंवा कनेक्ट केलेल्या स्टोरेज व्हॉल्यूममधील सर्व फाइल वाचण्याची, सुधारित करण्याची आणि हटवण्याची अनुमती द्या. अनुमती दिली असल्यास, ॲप कदाचित तुम्हाला न विचारता फाइलला अॅक्सेस करू शकते"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"सर्व फाइल अॅक्सेस करू शकते"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"फुल स्क्रीन सूचना"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"या ॲपवरील फुल स्क्रीन सूचनांना अनुमती द्या"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"डिव्हाइस लॉक असताना या ॲपला फुल स्क्रीन वापरणाऱ्या सूचना दाखवण्याची अनुमती द्या. ॲप्स यांचा वापर अलार्म, इनकमिंग कॉल किंवा इतर तातडीच्या सूचना हायलाइट करण्यासाठी करू शकतात."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"तुम्ही इंस्टॉल केलेल्या ॲप्सना तुमच्या डिव्हाइसचे नाव दृश्यमान आहे. तुम्ही ब्लूटूथ डिव्हाइसशी कनेक्ट करता, वाय-फाय नेटवर्कशी कनेक्ट करता किंवा वाय-फाय हॉटस्पॉट सेट करता, तेव्हा हे इतर लोकदेखील पाहू शकतात."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"व्याकरणानुसार लिंगासंबंधी माहिती"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"व्याकरणानुसार लिंगासंबंधी माहिती निवडा"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"फसव्या अॅप्ससाठी स्कॅन करत आहे"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"फिशिंगसाठी अॅप अॅक्टिव्हिटी तपासा"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"स्कॅनिंग वापरणे"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"कामाशी संबंधित अॅप्ससाठी स्कॅनिंग वापरणे"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 08c059d..b8d4078 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Lumpuhkan Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Melumpuhkan ciri Bluetooth LE Audio jika peranti menyokong keupayaan perkakasan LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Tunjukkan togol LE Audio pada Butiran Peranti"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Senarai Dibenarkan Bluetooth LE Audio Pintasan"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Gunakan LE Audio secara lalai walaupun persisian LE Audio belum disahkan sebagai memenuhi kriteria Senarai Dibenarkan."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Peranti media"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Panggil peranti"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Peranti lain"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Peranti disimpan"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Dikaitkan dengan akaun"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Digunakan sebelum ini dengan akaun"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth akan dihidupkan untuk bergandingan"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Pilihan sambungan"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Disambungkan sebelum ini"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Tulis dalam medan teks"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Abaikan semua tekanan butang stilus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stilus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Perkongsian audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Kongsi audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Panggilan dan penggera"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Tarikh & masa"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proksi"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Padam bersih"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Ruang Peribadi"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Sembunyikan apl dalam folder peribadi"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Buka kunci menggunakan kunci skrin"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Tunjukkan Ruang Peribadi"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Sembunyikan apabila dikunci"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Sembunyikan Ruang Peribadi apabila dikunci"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Sembunyikan Ruang Peribadi daripada senarai apl anda supaya tidak diketahui pengguna lain"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Akses Ruang Peribadi apabila disembunyikan"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Cari \'Ruang Peribadi\' dalam bar carian"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Ketik jubin Ruang Peribadi"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Buka kunci Ruang Peribadi anda"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Mati"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Hidup"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Buat Ruang Peribadi"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Padamkan Ruang Peribadi"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Ruang Peribadi tidak dapat dibuat"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Ruang Peribadi berjaya dipadamkan"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Ruang Peribadi tidak dapat dipadamkan"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Tetapkan kunci skrin"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Untuk Ruang Peribadi, tetapkan kunci skrin pada peranti ini."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Tetapkan kunci skrin"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Batal"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Batal"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Persediaan"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Sediakan Ruang Peribadi"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Sembunyikan apl peribadi dalam ruang selamat yang hanya boleh diakses oleh anda"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Cara apl ini berfungsi"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Anda boleh mengakses Ruang Peribadi daripada bahagian bawah senarai apl anda"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apl dalam Ruang Peribadi dilindungi dengan kunci"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Pemberitahuan daripada apl dalam Ruang Peribadi disembunyikan apabila apl dikunci"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Apl Ruang Peribadi tidak dipaparkan dalam pengurus kebenaran, papan pemuka privasi dan tetapan lain apabila Ruang Peribadi dikunci"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Menyediakan Ruang Peribadi…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Ruang Peribadi dilindungi dengan kunci"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Maklumat penggunaan untuk apl Ruang Peribadi disembunyikan apabila ap dikunci"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Akses Ruang Peribadi daripada senarai apl anda"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Tidak dapat menyediakan Ruang Peribadi"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Cuba lagi sekarang atau kembali sebentar lagi"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Cuba Lagi"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Gunakan kunci skrin untuk membuka kunci?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Anda boleh membuka kunci Ruang Peribadi menggunakan cara yang sama seperti anda membuka kunci peranti anda atau memilih kunci yang lain"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Gunakan kunci skrin"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Pilih kunci baharu"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Siap!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Untuk mengakses Ruang Peribadi, leret ke atas dari bahagian bawah skrin utama anda, kemudian tatal ke bawah"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Selesai"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Tatal ke bawah untuk mengakses Ruang Peribadi"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Anda boleh menambah sehingga <xliff:g id="COUNT">%d</xliff:g> cap jari"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Anda telah menambahkan bilangan maksimum cap jari"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Tidak boleh menambahkan lagi cap jari"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Terus menggunakan apl semasa dilipat"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Meningkatkan kadar segar semula daripada 60 kepada <xliff:g id="ID_1">%1$s</xliff:g> Hz untuk sesetengah kandungan secara automatik. Meningkatkan penggunaan bateri."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Meningkatkan kadar segar semula hingga <xliff:g id="ID_1">%1$d</xliff:g> Hz untuk sesetengah kandungan secara automatik. Meningkatkan penggunaan bateri."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Paksa kadar muat semula puncak"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Kadar muat semula tertinggi untuk keresponsifan sentuhan & kualiti animasi yang dipertingkat. Meningkatkan penggunaan bateri."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Perhatian skrin"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Tetapan umum"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edit titik capaian"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Tidak ditetapkan"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Tidak ditetapkan"</string>
<string name="apn_name" msgid="6677695784108157953">"Nama"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Gunakan butang kebolehaksesan untuk buka"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Tahan kekunci kelantangan untuk buka"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Ketik skrin tiga kali untuk buka"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Ketik skrin tiga kali menggunakan dua jari untuk membuka"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Gunakan gerak isyarat untuk buka"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Gunakan gerak isyarat kebolehaksesan"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Untuk menggunakan ciri ini, ketik butang kebolehaksesan <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> di bahagian bawah skrin anda.\n\nUntuk menukar antara ciri, sentuh & tahan butang kebolehaksesan."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Untuk menggunakan ciri ini, ketik butang kebolehaksesan pada skrin anda."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Untuk menggunakan ciri ini, tekan & tahan kedua-dua kekunci kelantangan."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Untuk memulakan dan menghentikan pembesaran, ketik tiga kali di mana-mana bahagian skrin anda."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Untuk memulakan dan menghentikan pembesaran, ketik tiga kali pada skrin anda menggunakan dua jari."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Untuk menggunakan ciri ini, leret ke atas dari bahagian bawah skrin dengan menggunakan 2 jari.\n\nUntuk menukar antara ciri, leret ke atas dengan menggunakan 2 jari dan tahan."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Untuk menggunakan ciri ini, leret ke atas dari bahagian bawah skrin dengan menggunakan 3 jari.\n\nUntuk menukar antara ciri, leret ke atas dengan menggunakan 3 jari dan tahan."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Untuk menggunakan ciri kebolehcapaian, leret ke atas dari bahagian bawah skrin dengan menggunakan 2 jari.\n\nUntuk menukar antara ciri, leret ke atas dengan menggunakan 2 hari dan tahan."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Tahan kekunci kelantangan"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"tahan kekunci kelantangan"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Tekan & tahan kedua-dua kekunci kelantangan"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Ketik skrin tiga kali menggunakan dua jari"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ketik skrin tiga kali menggunakan dua jari"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Ketik skrin {0,number,integer} kali dengan cepat menggunakan dua jari"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ketik tiga kali pada skrin"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ketik tiga kali pada skrin"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ketik skrin {0,number,integer} kali dengan pantas. Pintasan ini mungkin memperlahankan peranti anda"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Gunakan getaran & haptik"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Getaran penggera"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Getaran media"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Getaran papan kekunci"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Getaran deringan"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Getaran pemberitahuan"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Maklum balas sentuhan"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Jika anda mengehadkan aktiviti latar belakang untuk apl, fungsi apl itu mungkin terganggu"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Apl ini tidak boleh dihadkan kerana tidak ditetapkan untuk mengoptimumkan bateri.\n\nHidupkan pengoptimuman bateri dahulu."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Urus penggunaan bateri"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Tiada sekatan"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Dioptimumkan"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Terhad"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"saiz teks, huruf cetak besar, fon besar, teks besar, rabun, jadikan teks lebih besar, besarkan teks, pembesaran fon"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"paparan ambien sentiasa hidup, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, pembaca"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"papan kekunci, haptik, getaran,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Kelantangan, getaran, Jangan Ganggu"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Kelantangan media"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Kelantangan penghantaran"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Benarkan akses untuk mengurus semua fail"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Benarkan apl ini membaca, mengubah suai dan memadamkan semula fail pada peranti ini atau mana-mana unit storan yang disambungkan. Jika dibenarkan, apl mungkin mengakses fail tanpa pengetahuan anda secara jelas."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Boleh mengakses semua fail"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Pemberitahuan skrin penuh"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Benarkan pemberitahuan skrin penuh daripada apl ini"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Benarkan apl ini untuk memaparkan pemberitahuan menggunakan skrin penuh apabila peranti dikunci. Apl mungkin menggunakan ciri ini untuk menyerlahkan penggera, panggilan masuk atau pemberitahuan mustahak yang lain."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Semak aktiviti apl untuk mengesan pancingan data"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Gunakan pengimbasan"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Gunakan pengimbasan untuk apl kerja"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Pengimbasan dijalankan secara peribadi terus pada peranti anda, menyemak aktiviti apl untuk mengesan pancingan data atau gelagat mengelirukan yang lain. Jika aktiviti itu dikesan, sesetengah maklumat apl dihantar kepada Google Play Protect untuk mengesahkan ancaman dan memberikan amaran kepada pengguna apl."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Ciri ini merupakan ciri keselamatan dilindungi. Tiada maklumat peranti atau peribadi dikongsi dengan Google. \n\nPancingan data ialah percubaan untuk mencuri bukti kelayakan log masuk atau maklumat peribadi lain."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 434a17c..12a13ad 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"‘ဘလူးတုသ် LE Audio’ ပိတ်ရန်"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"စက်က LE Audio ဟာ့ဒ်ဝဲစွမ်းရည်များကို ပံ့ပိုးလျှင် ဘလူးတုသ် LE Audio အင်္ဂါရပ်ကို ပိတ်သည်။"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"‘စက်အသေးစိတ်’ တွင် LE audio ခလုတ်ပြရန်"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"‘ဘလူးတုသ် LE Audio ခွင့်ပြုစာရင်း’ ကို ရှောင်ကွင်းရန်"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio အရံပစ္စည်းကို ‘ခွင့်ပြုစာရင်း’ သတ်မှတ်ချက်နှင့် ကိုက်ညီသည်ဟု အတည်ပြုမထားလျှင်ပင် LE Audio ကို မူရင်းသတ်မှတ်ချက်အတိုင်း သုံးနိုင်သည်။"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"မီဒီယာ စက်ပစ္စည်းများ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ခေါ်ဆိုမှု စက်ပစ္စည်းများ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"အခြား စက်ပစ္စည်းများ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"သိမ်းထားသည့် စက်ပစ္စည်းများ"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"အကောင့်နှင့် သက်ဆိုင်သည်"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"အကောင့်ဖြင့် ယခင်က အသုံးပြုထားပါသည်"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"တွဲချိတ်ရန် ဘလူးတုသ်ကို ဖွင့်ပါမည်"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"ချိတ်ဆက်မှု ဦးစားပေးများ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ယခင် ချိတ်ဆက်ထားသည်များ"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"စာသားအကွက်များတွင် ရေးခြင်း"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"စတိုင်လပ်စ်ခလုတ်နှိပ်ခြင်းအားလုံးကို လစ်လျူရှုခြင်း"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"စတိုင်လပ်စ်"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"အသံမျှဝေခြင်း"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"အသံမျှဝေရန်"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ခေါ်ဆိုမှုနှင့် နှိုးစက်များ"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"ရက်စွဲနှင့် အချိန်"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ပရောက်စီ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ရှင်းရန်"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"သီးသန့်ချတ်ခန်း"</string>
<string name="private_space_summary" msgid="8237652417163408001">"အက်ပ်များကို သီးသန့်ဖိုင်တွဲတွင် ဖျောက်နိုင်သည်"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ဖန်သားပြင်လော့ခ်သုံး၍ ဖွင့်ရန်"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"‘သီးသန့်ချတ်ခန်း’ ပြပါ"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"လော့ခ်ချထားချိန်တွင် ဖျောက်ရန်"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"‘သီးသန့်ချတ်ခန်း’ လော့ခ်ချထားချိန်တွင် ဖျောက်ရန်"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"သင့်စက်၌ ‘သီးသန့်ချတ်ခန်း’ ရှိကြောင်း အခြားသူများ မသိတော့စေရန် ၎င်းကို သင့်အက်ပ်စာရင်းမှ ဖျောက်နိုင်သည်"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"‘သီးသန့်ချတ်ခန်း’ ကို ဖျောက်ထားချိန်တွင် သုံးခြင်း"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ရှာဖွေမှုဘားတွင် ‘သီးသန့်ချတ်ခန်း’ ရှာရန်"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"‘သီးသန့်ချတ်ခန်း’ အကွက်ငယ်ကို တို့ရန်"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"‘သီးသန့်ချတ်ခန်း’ ကို ဖွင့်ရန်"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ပိတ်"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ဖွင့်"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"စနစ်"</string>
<string name="private_space_create_title" msgid="47273568884806726">"‘သီးသန့်ချတ်ခန်း’ ပြုလုပ်ရန်"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"‘သီးသန့်ချတ်ခန်း’ ဖျက်ရန်"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"‘သီးသန့်ချတ်ခန်း’ ပြုလုပ်၍မရပါ"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"‘သီးသန့်ချတ်ခန်း’ ကိုဖျက်ပြီးပါပြီ"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"‘သီးသန့်ချတ်ခန်း’ ကိုဖျက်၍မရပါ"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ဖန်သားပြင်လော့ခ် သတ်မှတ်ပါ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"‘သီးသန့်ချတ်ခန်း’ သုံးရန် ဤစက်၌ ဖန်သားပြင်လော့ခ် သတ်မှတ်ပါ။"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ဖန်သားပြင်လော့ခ် သတ်မှတ်ရန်"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"မလုပ်တော့"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"မလုပ်တော့"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"စနစ်ထည့်သွင်းရန်"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"‘သီးသန့်ချတ်ခန်း’ ကို စနစ်ထည့်သွင်းပါ"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"သင်သာ ဝင်နိုင်သည့် လုံခြုံသောချတ်ခန်းရှိ သီးသန့်အက်ပ်များကို ဖျောက်ပါ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"အလုပ်လုပ်ပုံ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"‘သီးသန့်ချတ်ခန်း’ ကို သင့်အက်ပ်စာရင်းအောက်ခြေမှ ဝင်နိုင်သည်"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"‘သီးသန့်ချတ်ခန်း’ ရှိ အက်ပ်များကို လော့ခ်ဖြင့် ကာကွယ်ထားသည်"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"‘သီးသန့်ချတ်ခန်း’ လော့ခ်ချထားချိန်တွင် ၎င်းရှိ အက်ပ်များမှ အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"‘သီးသန့်ချတ်ခန်း’ လော့ခ်ချထားချိန်တွင် ‘သီးသန့်ချတ်ခန်း’ အက်ပ်များကို ခွင့်ပြုချက်စီမံစနစ်၊ ကိုယ်ရေးအချက်အလက် လုံခြုံမှု ဒက်ရှ်ဘုတ်နှင့် အခြားဆက်တင်များတွင် မြင်ရမည်မဟုတ်ပါ"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"‘သီးသန့်ချတ်ခန်း’ ကို စနစ်ထည့်သွင်းနေသည်…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"‘သီးသန့်ချတ်ခန်း’ ကို လော့ခ်ဖြင့် ကာကွယ်ထားသည်"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"လော့ခ်ချထားသောအခါ ‘သီးသန့်ချတ်ခန်း’ အက်ပ်များအတွက် အသုံးပြုမှုအချက်အလက်ကို ဖျောက်ထားသည်"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"သင့်အက်ပ်စာရင်းမှ ‘သီးသန့်ချတ်ခန်း’ သုံးခြင်း"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"‘သီးသန့်ချတ်ခန်း’ ကို စနစ်ထည့်သွင်း၍မရပါ"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ယခု ထပ်စမ်းကြည့်ပါ (သို့) နောက်မှပြန်လာပါ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ထပ်စမ်းရန်"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ဖွင့်ရန် ဖန်သားပြင်လော့ခ် သုံးမလား။"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"သင့်စက်ကို ဖွင့်သည့်နည်းတူ ‘သီးသန့်ချတ်ခန်း’ ကို ဖွင့်နိုင်သည် (သို့) အခြားလော့ခ်တစ်ခု ရွေးနိုင်သည်"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ဖန်သားပြင်လော့ခ် သုံးရန်"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"လော့ခ်အသစ် ရွေးရန်"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"အားလုံး အသင့်ပါ။"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"‘သီးသန့်ချတ်ခန်း’ သုံးရန် သင့်ပင်မစာမျက်နှာအောက်ခြေမှ အပေါ်သို့ ပွတ်ဆွဲပြီး အောက်သို့လှိမ့်ပါ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ပြီးပြီ"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"‘သီးသန့်ချတ်ခန်း’ သုံးရန် အောက်လှိမ့်ပါ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"လက်ဗွေ <xliff:g id="COUNT">%d</xliff:g> ခု အထိ ထည့်နိုင်သည်"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"အများဆုံးထည့်နိုင်သည့် လက်ဗွေရာအရေအတွက်အထိ ထည့်သွင်းပြီးဖြစ်သည်"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"နောက်ထပ်လက်ဗွေရာများ ထည့်၍မရတော့ပါ"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ခေါက်ထားချိန် အက်ပ်များကို ဆက်သုံးရန်"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"အကြောင်းအရာအချို့အတွက် ပြန်လည်စတင်နှုန်းကို ၆၀ မှ <xliff:g id="ID_1">%1$s</xliff:g> Hz သို့ အလိုအလျောက် တိုးပေးသည်။ ဘက်ထရီ အသုံးပြုမှု များလာမည်။"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"အကြောင်းအရာအချို့အတွက် ပြန်လည်စတင်နှုန်းကို <xliff:g id="ID_1">%1$d</xliff:g> Hz အထိ အလိုအလျောက် တိုးပေးသည်။ ဘက်ထရီ အသုံးပြုမှု ပိုများလာပါမည်။"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"အမြင့်ဆုံး ပြန်လည် စတင်နှုန်းသို့ တွန်းအားပေးရန်"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"ထိတွေ့မှု တုံ့ပြန်အားနှင့် ကာတွန်းပုံအရည်အသွေးပိုကောင်းလာရန် အမြင့်ဆုံးပြန်ဖွင့်မှုနှုန်း။ ဘက်ထရီ အသုံးပြုမှု တိုးလာပါမည်။"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ဖန်သားပြင်ကို အာရုံစိုက်ခြင်း"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"အများသုံး ဆက်တင်များ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"အဝင်ပွိုင့် ပြင်ဆင်ရန်"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"သတ်မှတ်မထားပါ"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"သတ်မှတ်မထားပါ"</string>
<string name="apn_name" msgid="6677695784108157953">"အမည်"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"သုံးနိုင်မှုခလုတ်ဖြင့် ဖွင့်ခြင်း"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"အသံခလုတ်များကို နှိပ်၍ဖွင့်ခြင်း"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ဖွင့်ရန် သုံးချက်တို့ခြင်း"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ဖွင့်ရန် ဖန်သားပြင်ကို လက်နှစ်ချောင်းဖြင့် သုံးချက်တို့ခြင်း"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ဖွင့်ရန် လက်ဟန်ကို အသုံးပြုပါ"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"အများသုံးနိုင်မှု လက်ဟန်ကို သုံးပါ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ဤဝန်ဆောင်မှု အသုံးပြုရန် သင့်ဖန်သားပြင် အောက်ခြေရှိ သုံးနိုင်မှုခလုတ် <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ကို တို့ပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် သုံးနိုင်မှုခလုတ်ကို ဖိထားပါ။"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ဤဝန်ဆောင်မှုကိုသုံးရန် သင့်ဖန်သားပြင်ပေါ်ရှိ သုံးနိုင်မှုခလုတ်ကို တို့ပါ။"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ဤဝန်ဆောင်မှု အသုံးပြုရန် အသံခလုတ် နှစ်ခုလုံးကို နှိပ်ထားပါ။"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ချဲ့ခြင်း စတင်ရန်၊ ရပ်ရန် သင့်ဖန်သားပြင်ပေါ် တစ်နေရာရာတွင် သုံးချက်တို့ပါ။"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ချဲ့ခြင်း စတင်ရန်၊ ရပ်ရန် သင့်ဖန်သားပြင်ပေါ် တစ်နေရာရာတွင် လက်နှစ်ချောင်းဖြင့် သုံးချက်တို့ပါ။"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ဤဝန်ဆောင်မှု အသုံးပြုရန် လက် ၂ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၂ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ဤဝန်ဆောင်မှု အသုံးပြုရန် လက် ၃ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၃ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"အများသုံးနိုင်သည့် ဝန်ဆောင်မှုတစ်ခု အသုံးပြုရန် လက် ၂ ချောင်းဖြင့် ဖန်သားပြင်အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ။\n\nဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက် ၂ ချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"အသံအတိုးအလျှော့ခလုတ်များကို ဖိထားခြင်း"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"အသံခလုတ်များကို ဖိထားမည်"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"အသံခလုတ်နှစ်ခုလုံးကို နှိပ်ထားပါ"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ဖန်သားပြင်ကို လက်နှစ်ချောင်းဖြင့် သုံးချက်တို့ခြင်း"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ဖန်သားပြင်ကို လက်နှစ်ချောင်းဖြင့် သုံးချက်တို့ရန်"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ဖန်သားပြင်ကို {0,number,integer} ကြိမ် လက်နှစ်ချောင်းဖြင့် အမြန်တို့ပါ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"မျက်နှာပြင်ကို သုံးချက်တို့ပါ"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ဖန်သားပြင်ကို သုံးချက်တို့ရန်"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ဖန်သားပြင်ကို {0,number,integer} ကြိမ် အမြန်တို့ပါ။ ဤဖြတ်လမ်းလင့်ခ်သည် သင့်စက်ကို နှေးသွားစေနိုင်သည်"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"တုန်ခါမှုနှင့် ထိတွေ့တုံ့ပြန်မှုများ သုံးရန်"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"နှိုးစက်တုန်ခါမှု"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"မီဒီယာဖြင့် တုန်ခါမှု"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"ကီးဘုတ်တုန်ခါမှု"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ဖုန်းမြည်သံ တုန်ခါမှု"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"အကြောင်းကြားချက် တုန်ခါမှု"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ထိတွေ့ တုံ့ပြန်ချက်"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"အက်ပ်အတွက် နောက်ခံလုပ်ဆောင်ချက်ကို ကန့်သတ်လိုက်ပါက ပုံမှန်အလုပ်လုပ်မည် မဟုတ်ပါ"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ဤအက်ပ်ကို ဘက်ထရီချိန်ညှိသုံးရန် သတ်မှတ်မထားသဖြင့် ကန့်သတ်၍မရပါ။\n\nအက်ပ်ကိုကန့်သတ်ရန် ဘက်ထရီချိန်ညှိသုံးခြင်း အရင်ဖွင့်ပါ။"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ဘက်ထရီ အသုံးပြုမှုကို စီမံရန်"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"အကန့်အသတ်မဲ့"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ပိုကောင်းအောင်လုပ်ရန်"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ကန့်သတ်ရန်"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"စာသားအရွယ်အစား၊ ပုံနှိပ်အကြီး၊ ဖောင့်အကြီး၊ စာသားအကြီး၊ အမြင်အာရုံချို့တဲ့ခြင်း၊ စာသားကို ပိုကြီးအောင်လုပ်ခြင်း၊ ဖောင့်ပိုကြီးအောင် ချဲ့ခြင်း၊ ဖောင့် ပုံကြီးချဲ့ခြင်း"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ဝန်းကျင်အလိုက်သင့် ပြသခြင်း အမြဲတမ်းဖွင့်ထားသည်၊ AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc၊ တဂ်၊ ဖတ်ရှုစနစ်"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ကီးဘုတ်၊ ထိတွေ့တုံ့ပြန်မှု၊ တုန်ခါမှု၊"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"အသံအတိုးအကျယ်၊ တုန်ခါမှု၊ မနှောင့်ယှက်ရ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"မီဒီယာ အသံအတိုးအကျယ်"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ကာ့စ်အသံ အတိုးအကျယ်"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ဖိုင်အားလုံးကို စီမံရန် သုံးခွင့်ပေးပါ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ဤစက်ပစ္စည်း (သို့) ချိတ်ဆက်ထားသော သိုလှောင်နေရာရှိ ဖိုင်များအားလုံးကို ဖတ်ရန်၊ ပြင်ဆင်ရန်နှင့် ဖျက်ရန် ဤအက်ပ်ကို ခွင့်ပြုပါ။ ခွင့်ပြုပြီးပါက အက်ပ်သည် သင့်အား အသိမပေးဘဲ ဖိုင်များကို အသုံးပြုနိုင်ပါမည်။"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ဖိုင်အားလုံးကို အသုံးပြုနိုင်သည်"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ဖန်သားပြင်အပြည့် အကြောင်းကြားချက်များ"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ဤအက်ပ်မှ ဖန်သားပြင်အပြည့် အကြောင်းကြားချက် ခွင့်ပြုရန်"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"စက်ပစ္စည်းလော့ခ်ချထားစဉ် ဖန်သားပြင်အပြည့် နေရာယူမည့် အကြောင်းကြားချက်များကို ဤအက်ပ်အား ပြသခွင့်ပြုနိုင်သည်။ နှိုးစက်၊ အဝင်ခေါ်ဆိုမှု (သို့) အခြားအရေးတကြီး အကြောင်းကြားချက်များကို မြင်သာအောင်လုပ်ရန် အက်ပ်များက ၎င်းတို့ကို သုံးနိုင်သည်။"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"သင့်စက်အမည်ကို သင်ထည့်သွင်းထားသည့် အက်ပ်များက မြင်ရပါသည်။ ဘလူးတုသ်သုံးစက်များသို့ ချိတ်ဆက်သည့်အခါ၊ Wi-Fi ကွန်ရက်သို့ ချိတ်ဆက်သည့်အခါ (သို့) Wi-Fi ဟော့စပေါ့ ထုတ်လွှင့်သည့်အခါ တို့တွင်လည်း ၎င်းကို အခြားသူများက မြင်နိုင်ပါသည်။"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"သဒ္ဒါနည်းကျ လိင်အမျိုးအစား"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"သဒ္ဒါနည်းကျ လိင်အမျိုးအစား ရွေးရန်"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"လှည့်ဖြားသည့် အက်ပ်များကို စကင်ဖတ်ခြင်း"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"အယောင်ဆောင် ဖြားယောင်းခြင်းအတွက် အက်ပ်အသုံးပြုမှုကို စစ်ဆေးရန်"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"စကင်ဖတ်ခြင်း သုံးရန်"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"အလုပ်သုံးအက်ပ်များအတွက် စကင်ဖတ်ခြင်း သုံးရန်"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 13e8d81..e8226d8 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Slå av Bluetooth LE-lyd"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Slår av Bluetooth LE-lydfunksjonen hvis enheten støtter maskinvarefunksjoner for LE-lyd."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Vis LE-lyd-av/på-bryter i Enhetsdetaljer"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omgå godkjenningsliste for Bluetooth LE-lyd"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Bruk LE-lyd som standard, selv om det ikke er bekreftet at den eksterne LE-lydenheten overholder kriteriene for godkjenningslisten."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medieenheter"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Ringeenheter"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Andre enheter"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Lagrede enheter"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Tilknyttet kontoen"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Tidligere brukt med kontoen"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth slås på for å koble til"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Tilkoblingsvalg"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Tidligere tilkoblet"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Skriv i tekstfelt"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorer alle knappetrykk på pekepennen"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Pekepenn"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Lyddeling"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Del lyd"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Anrop og alarmer"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Dato og klokkeslett"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy-tjener"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Tøm"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Private Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Skjul apper i en privat mappe"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Lås opp med skjermlås"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Vis Private Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Skjul når låst"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Skjul Private Space når låst"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"For å unngå at andre ser at du har Private Space på telefonen, kan du skjule den i applisten"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Gå til Private Space når den er skjult"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Søk etter «Private Space» i søkefeltet"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Trykk på Private Space-brikken"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Lås opp Private Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Av"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"På"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Opprett Private Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Slett Private Space"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Kunne ikke opprette Private Space"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Private Space er slettet"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Kunne ikke slette Private Space"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Konfigurer en skjermlås"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"For å bruke Private Space, angi en skjermlås på enheten."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Konfigurer en skjermlås"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Avbryt"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Avbryt"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Konfigurer"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Konfigurer Private Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Skjul private apper på et sikkert sted bare du kan gå til"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Slik fungerer det"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Du kan gå til Private Space fra bunnen av applisten"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apper i Private Space er beskyttet med en lås"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Varsler fra apper i Private Space er skjult når den er låst"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space-apper vises ikke i tillatelseskontroll, personvernoversikt eller andre innstillinger når Private Space er låst"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Konfigurerer Private Space …"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space er beskyttet av en lås"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Bruksinformasjon for Private Space-apper er skjult når den er låst"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Åpne Private Space fra applisten"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Kunne ikke konfigurere Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Prøv igjen nå, eller kom tilbake senere"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Prøv på nytt"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Vil du bruke skjermlås for å låse opp?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Du kan låse opp Private Space på samme måte som du låser opp enheten, eller du kan velge en annen lås"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Bruk skjermlåsen"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Velg en ny lås"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Alt er klart!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"For å åpne Private Space, sveip opp fra bunnen av startskjermen og rull ned"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Ferdig"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Rull ned for å åpne Private Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Du kan legge til opptil <xliff:g id="COUNT">%d</xliff:g> fingeravtrykk"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Du har lagt til maksimalt antall fingeravtrykk"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Kan ikke legge til flere fingeravtrykk"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Fortsett å bruke apper etter sammenlegging"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Øker oppdateringsfrekvensen automatisk fra 60 til <xliff:g id="ID_1">%1$s</xliff:g> Hz for noe innhold. Øker batteribruken."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Øker oppdateringsfrekvensen automatisk til <xliff:g id="ID_1">%1$d</xliff:g> Hz for noe innhold. Dette øker batteribruken."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Maks oppdateringsfrekvens"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Maksimal oppdateringsfrekvens for bedre trykkfølsomhet og animasjonskvalitet. Øker batteribruken."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Skjermoppmerksomhet"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Fellesinnstillinger"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Rediger tilgangspunkt"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ikke angitt"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ikke angitt"</string>
<string name="apn_name" msgid="6677695784108157953">"Navn"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Bruk Tilgjengelighet-knappen for å åpne"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Hold volumtastene for å åpne"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Trippeltrykk på skjermen for å åpne"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Trippeltrykk på skjermen med to fingre for å åpne"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Bruk bevegelse for å åpne"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Bruk tilgjengelighetsbevegelse"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"For å bruke denne funksjonen må du trykke på Tilgjengelighet-knappen <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> nederst på skjermen.\n\nFor å bytte mellom funksjoner, trykk og hold på Tilgjengelighet-knappen."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"For å bruke denne funksjonen, trykk på Tilgjengelighet-knappen på skjermen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"For å bruke denne funksjonen, trykk og hold inne begge volumtastene."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"For å starte og stoppe forstørrelse, trippeltrykk hvor som helst på skjermen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"For å starte og stoppe forstørring, trippeltrykk hvor som helst på skjermen med to fingre."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"For å bruke denne funksjonen, sveip opp fra bunnen av skjermen med to fingre.\n\nFor å bytte mellom funksjoner, sveip opp med to fingre og hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"For å bruke denne funksjonen, sveip opp fra bunnen av skjermen med tre fingre.\n\nFor å bytte mellom funksjoner, sveip opp med tre fingre og hold."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"For å bruke en tilgjengelighetsfunksjon, sveip opp fra bunnen av skjermen med to fingre.\n\nFor å bytte mellom funksjoner, sveip opp med to fingre og hold."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Hold inne volumtastene"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"hold inne volumtastene"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Trykk og hold inne begge volumtastene"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Trippeltrykk på skjermen med to fingre"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trippeltrykk på skjermen med to fingre"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Trykk raskt på skjermen {0,number,integer} ganger med to fingre"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Trippeltrykk på skjermen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"trippeltrykk på skjermen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Trykk raskt på skjermen {0,number,integer} ganger. Denne snarveien kan gjøre enheten tregere"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Bruk vibrering og fysisk tilbakemelding"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Alarmvibrering"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Medievibrering"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Tastaturvibrering"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Ringevibrering"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Varselvibrering"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Tilbakemelding ved berøring"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Hvis du begrenser bakgrunnsaktivitet for en app, kan det oppstå problemer"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Du kan ikke begrense appen siden den ikke er satt til å optimalisere batteriet.\n\nFor å begrense appen, slå på batterioptimalisering."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Administrer batteribruk"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Ubegrenset"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimalisert"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Begrenset"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tekststørrelse, stor skrift, stor skrifttype, stor tekst, nedsatt synsevne, gjør tekst større, tekstforstørrer, forstørring av tekst"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"skjermsparer som alltid er på, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, brikke, leser"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastatur, haptisk teknologi, vibrer,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volum, vibrasjon, ikke forstyrr"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Medievolum"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Castevolum"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Kan administrere alle filer"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Gi denne appen tillatelse til å lese, endre og slette alle filer på denne enheten eller tilkoblede lagringsvolum. Hvis du gir appen denne tillatelsen, kan den få tilgang til filer uten at du er klar over det."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Har tilgang til alle filer"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Fullskjermvarsler"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Tillat fullskjermvarsler fra denne appen"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"La denne appen vise varsler som fyller hele skjermen, når enheten er låst. Apper kan bruke disse til å fremheve alarmer, innkommende anrop eller andre viktige varsler."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Enhetsnavnet ditt er synlig for apper du har installert. Det kan også ses av andre personer når du kobler til Bluetooth-enheter, kobler til et wifi-nettverk eller konfigurerer en wifi-sone."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Grammatisk kjønn"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Velg grammatisk kjønn"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Skanner etter villedende apper"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Kontroller appaktivitet for å oppdage nettfisking"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Bruk skanning"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Bruk skanning for jobbapper"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index b065aec..de28721 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -88,7 +88,7 @@
<string name="bluetooth_notif_ticker" msgid="209515545257862858">"ब्लुटुथ जोडा मिलाउन अनुरोध"</string>
<string name="bluetooth_notif_title" msgid="1196532269131348647">"कनेक्ट गर्ने अनुरोध"</string>
<string name="bluetooth_notif_message" msgid="5584717784198086653">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> सँग कनेक्ट गर्न ट्याप गर्नुहोस्।"</string>
- <string name="bluetooth_devices_card_off_title" msgid="1320149821945129127">"ब्लुटुथ निष्क्रिय छ"</string>
+ <string name="bluetooth_devices_card_off_title" msgid="1320149821945129127">"ब्लुटुथ अफ छ"</string>
<string name="bluetooth_devices_card_off_summary" msgid="2276527382891105858">"यसलाई सक्रिय गर्न ट्याप गर्नुहोस्"</string>
<string name="device_picker" msgid="2427027896389445414">"ब्लुटुथ डिभाइस छान्नुहोस्"</string>
<string name="bluetooth_ask_enablement" msgid="1529030199895339199">"<xliff:g id="APP_NAME">%1$s</xliff:g> ब्लुटुथ सक्रिय गर्न चाहन्छ"</string>
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"\"ब्लुटुथ लो इनर्जी अडियो\" अफ गरियोस्"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"डिभाइसमा LE अडियो हार्डवेयर चलाउन मिल्छ भने \"ब्लुटुथ लो इनर्जी अडियो\" सुविधा अफ हुन्छ।"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"डिभाइसको विवरणमा LE अडियोको टगल देखाइयोस्"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ब्लुटुथ लो इनर्जी अडियोको श्वेतसूची बाइपास गरियोस्"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE अडियो पेरिफरलले श्वेतसूचीको मापदण्ड पूरा गर्छ भन्ने कुरा पुष्टि नगरिए तापनि LE अडियो डिफल्ट रूपमा प्रयोग गरियोस्।"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"मिडियासम्बन्धी यन्त्रहरू"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"कल गर्ने सुविधा भएका यन्त्रहरू"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"अन्य डिभाइसहरू"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"सेभ गरिएका डिभाइस"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"खातासँग लिंक गरिएको"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"यसअघि खातासँग प्रयोग गरिएको"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"कनेक्ट गर्नका लागि ब्लुटुथ अन हुने छ"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"कनेक्सनका प्राथमिकताहरू"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"यसअघि कनेक्ट गरिएका डिभाइस"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"टेक्स्ट फिल्डमा लेख्नुहोस्"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"स्टाइलसमार्फत थिचिने सबै बटन बेवास्ता गरियोस्"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"स्टाइलस"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"अडियो सेयरिङ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"अडियो सेयर गर्नुहोस्"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"कल तथा अलार्महरू"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"मिति र समय"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"प्रोक्सी"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"मेटाउनुहोस्"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"निजी स्पेस"</string>
<string name="private_space_summary" msgid="8237652417163408001">"एपहरू निजी फोल्डरमा लुकाउनुहोस्"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"स्क्रिन लक प्रयोग गरेर अनलक गर्नुहोस्"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"निजी स्पेस देखाउनुहोस्"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"लक गरिएको बेलामा लुकाउनुहोस्"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"निजी स्पेस लक गरिएको बेलामा उक्त स्पेस लुकाउनुहोस्"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"अन्य मानिसहरूलाई तपाईंको डिभाइसमा निजी स्पेस छ भन्ने कुरा थाहा नदिन तपाईं आफ्नो एपको सूचीकरणबाट उक्त स्पेस लुकाउन सक्नुहुन्छ"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"निजी स्पेस लुकाइएको बेलामा उक्त स्पेस एक्सेस गर्नुहोस्"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"सर्च बारमा गई \"निजी स्पेस\" खोज्नुहोस्"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"निजी स्पेसको टाइलमा ट्याप गर्नुहोस्"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"आफ्नो निजी स्पेस अनलक गर्नुहोस्"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"अफ छ"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"अन छ"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"सिस्टम"</string>
<string name="private_space_create_title" msgid="47273568884806726">"निजी स्पेस बनाउनुहोस्"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"निजी स्पेस मेटाउनुहोस्"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"निजी स्पेस बनाउन सकिएन"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"निजी स्पेस मेटाइएको छ"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"निजी स्पेस मेटाउन सकिएन"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"स्क्रिन लक सेट गर्नुहोस्"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"निजी स्पेस प्रयोग गर्न यो डिभाइसमा स्क्रिन लक सेट गर्नुहोस्।"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"स्क्रिन लक सेट गर्नुहोस्"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"रद्द गर्नुहोस्"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"रद्द गर्नुहोस्"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"सेटअप गर्नुहोस्"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"निजी स्पेस सेटअप गर्नुहोस्"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"तपाईंले मात्र एक्सेस गर्न सक्ने सुरक्षित स्पेसमा निजी एपहरू लुकाउनुहोस्"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"यसले काम गर्ने तरिका"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"तपाईं आफ्नो एपको सूचीकरणको फेदबाट निजी स्पेस एक्सेस गर्न सक्नुहुन्छ"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"निजी स्पेसमा एपहरू लक प्रयोग गरी सुरक्षित रूपमा राखिएका हुन्छन्"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"निजी स्पेस लक गरिएका बेला निजी स्पेसका एपबाट प्राप्त सूचनाहरू लुकाइन्छन्"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"निजी स्पेस लक गरिएका बेला अनुमति म्यानेजर, गोपनीयतासम्बन्धी ड्यासबोर्ड र अन्य सेटिङमा निजी स्पेसका एपहरू देखा पर्दैनन्"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"निजी स्पेस सेटअप गरिँदै छ…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"लक प्रयोग गरी निजी स्पेस सुरक्षित राखिन्छ"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"लक गरिएका बेला निजी स्पेसका एपहरूको प्रयोगसम्बन्धी जानकारी लुकाइन्छ"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"एपहरूको सूचीबाट निजी स्पेस एक्सेस गर्नुहोस्"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"निजी स्पेस सेटअप गर्न सकिएन"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"अहिले नै फेरि प्रयास गर्नुहोस् वा पछि फेरि आउनुहोस्"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"फेरि प्रयास गर्नुहोस्"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"अनलक गर्न स्क्रिन लक प्रयोग गर्ने हो?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"तपाईं आफूले आफ्नो डिभाइस अनलक गरे जसरी नै निजी स्पेस अनलक गर्न वा अर्कै लक छनौट गर्न सक्नुहुन्छ"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"स्क्रिन लक प्रयोग गर्नुहोस्"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"नयाँ लक छनौट गर्नुहोस्"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"सबै तयार भयो!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"निजी स्पेस एक्सेस गर्न होम स्क्रिनको पुछारबाट माथितिर स्वाइप गर्नुहोस् अनि तलतिर स्क्रोल गर्नुहोस्"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"पूरा भयो"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"निजी स्पेस एक्सेस गर्न तलतिर स्क्रोल गर्नुहोस्"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"तपाईं बढीमा <xliff:g id="COUNT">%d</xliff:g> वटा फिंगरप्रिन्टहरू हाल्न सक्नुहुन्छ"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"तपाईंले अधिकतम संख्यामा फिंगरप्रिन्टहरू थप्नुभएको छ"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"थप फिंगरप्रिन्टहरू थप्न सकिँदैन"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"फोल्ड गर्दा एपहरू प्रयोग गरिराखियोस्"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"केही सामग्रीका हकमा रिफ्रेस रेट स्वतः ६० हर्जबाट बढाएर <xliff:g id="ID_1">%1$s</xliff:g> हर्ज बनाउँछ। यसले गर्दा ब्याट्रीको खपत बढ्छ।"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"यसले केही सामग्रीका हकमा रिफ्रेस रेट स्वतः बढाएर <xliff:g id="ID_1">%1$d</xliff:g> हर्जसम्म बनाउँछ। यसले गर्दा ब्याट्रीको खपत बढ्छ।"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"रिफ्रेस गर्ने दर बलपूर्वक सबैभन्दा बढी बनाउनुहोस्"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"स्क्रिनमा छुँदा स्क्रिनले जनाउने प्रतिक्रिया र एनिमेसनको गुणस्तर सुधार्न उच्चतम रिफ्रेस रेट। ब्याट्रीको खपत बढाउँछ।"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"स्क्रिनमा हेरिरहँदा"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"समुदायसम्बन्धी सेटिङ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"एक्सेस पोइन्ट सम्पादन गर्नुहोस्"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"सेट गरिएको छैन"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"सेट गरिएको छैन"</string>
<string name="apn_name" msgid="6677695784108157953">"नाम"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"खोल्नका लागि एक्सेसिबिलिटी बटन प्रयोग गर्नुहोस्"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"खोल्नका लागि भोल्युम कीहरू थिचिराख्नुहोस्"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"यसलाई खोल्न स्क्रिनमा तीन पटक ट्याप गर्नुहोस्"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"खोल्न स्क्रिनमा दुई वटा औँलाले ट्रिपल ट्याप गर्नुहोस्"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"खोल्नका लागि इसाराको प्रयोग गर्नुहोस्"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"एक्सेसिबिलिटी जेस्चर प्रयोग गर्नुहोस्"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"यो सुविधा प्रयोग गर्न आफ्नो स्क्रिनको पुछारमा रहेको पहुँचसम्बन्धी बटन <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> मा ट्याप गर्नुहोस्।\n\n एउटा सुविधाबाट अर्को सुविधामा जान पहुँचसम्बन्धी बटनमा थिचिराख्नुहोस्।"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"यो सुविधा प्रयोग गर्न स्क्रिनमा भएको एक्सेसिबिलिटी बटनमा ट्याप गर्नुहोस्।"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"यो सुविधा प्रयोग गर्न दुवै भोल्युम की थिचिराख्नुहोस्।"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"म्याग्निफिकेसन सुविधा सुरु गर्न वा रोक्न आफ्नो स्क्रिनमा कतै तीन पटक ट्याप गर्नुहोस्।"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"जुम इन गर्ने सुविधा अन तथा अफ गर्न स्क्रिनको जुनसुकै ठाउँमा दुई वटा औँलाले ट्रिपल ट्याप गर्नुहोस्।"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"यो सुविधा प्रयोग गर्न २ वटा औँलाले स्क्रिनको पुछारबाट माथितिर स्वाइप गर्नुहोस्।\n\nएउटा सुविधाबाट अर्को सुविधामा जान २ वटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा थिचिराख्नुहोस्।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"यो सुविधा प्रयोग गर्न ३ वटा औँलाले स्क्रिनको पुछारबाट माथितिर स्वाइप गर्नुहोस्।\n\nएउटा सुविधाबाट अर्को सुविधामा जान ३ वटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा थिचिराख्नुहोस्।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"पहुँचसम्बन्धी कुनै सुविधा प्रयोग गर्न २ वटा औँलाले स्क्रिनको पुछारबाट माथितिर स्वाइप गर्नुहोस्।\n\nएउटा सुविधाबाट अर्को सुविधामा जान २ वटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा थिचिराख्नुहोस्।"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"भोल्युम कीहरू थिचिरहनुहोस्"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"भोल्युम कीहरू थिचिराख्नुहोस्"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"दुवै भोल्युम की थिचिराख्नुहोस्"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"स्क्रिनमा दुई वटा औँलाले ट्रिपल ट्याप गर्नुहोस्"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"स्क्रिनमा दुई वटा औँलाले ट्रिपल ट्याप गर्नुहोस्"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"स्क्रिनमा दुई वटा औँलाले {0,number,integer} पटक छिटो छिटो ट्याप गर्नुहोस्"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"स्क्रिनमा तीन पटक ट्याप गर्नुहोस्"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"स्क्रिनमा तीन पटक ट्याप गर्नुहोस्"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"स्क्रिनमा द्रुत रूपमा {0,number,integer} पटक ट्याप गर्नुहोस्। यो सर्टकट प्रयोग गर्दा तपाईंको डिभाइस ढिलो चल्न सक्छ"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"भाइब्रेसन र ह्याप्टिक्स प्रयोग गरियोस्"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"अलार्म भाइब्रेसन"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"मिडिया भाइब्रेसन"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"किबोर्ड भाइब्रेसन"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"घन्टीको भाइब्रेसन"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"सूचना आएको जनाउन भाइब्रेट हुँदा"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"टच गर्दाको भाइब्रेसन"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"तपाईंले कुनै एपको पृष्ठभूमिको गतिविधिलाई सीमित गर्नुभयो भने यसले सही तरिकाले काम नगर्न सक्छ"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"यो एपलाई ब्याट्री अप्टिमाइज गर्न भनी सेट नगरिएको हुनाले तपाईं यसमा बन्देज लगाउन सक्नुहुन्न।\n\nएपमा बन्देज लगाउन पहिले ब्याट्री अप्टिमाइजेसन सुविधा अन गर्नुहोस्।"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ब्याट्रीको खपत व्यवस्थापन गर्नुहोस्"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"असीमित"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"अप्टिमाइज गरिएको"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"प्रतिबन्धित"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"पाठको आकार, ठुलो आकारको पाठ, ठुलो फन्ट, ठुलो पाठ, कमजोर दृष्टि, पाठ अझ ठुलो बनाउनुहोस्, फन्ट ठुलो बनाउने टुल, फन्ट ठुलो बनाउने प्रक्रिया"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"सधैँ अन हुने एम्बियन्ट डिस्प्ले, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, ट्याग, रिडर"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"किबोर्ड, ह्याप्टिक्स, भाइब्रेट"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"भोल्युम, भाइब्रेसन, Do Not Disturb"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"मिडियाको भोल्युम"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"भोल्युम cast गर्नुहोस्"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"सबै फाइलहरूको व्यवस्थापन गर्ने अनुमति दिइयोस्"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"यो एपलाई यो डिभाइस वा जोडिएको कुनै भण्डारणमा रहेका सबै फाइलहरू पढ्ने, परिमार्जन गर्ने तथा मेट्ने अनुमति दिनुहोस्। अनुमति दिइएका खण्डमा यो एपले तपाईंको स्पष्ट अनुमतिविनै फाइलहरू प्रयोग गर्नसक्छ।"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"सबै फाइलहरूमाथि पहुँच राख्न सक्छ।"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"फुल स्क्रिनमा सूचनाहरू देखाउने अनुमति"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"यो एपलाई सूचनाहरू फुल स्क्रिनमा देखाउने अनुमति दिनुहोस्"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"यो एपलाई डिभाइस लक भएका बेला फुल स्क्रिन ढाक्ने खालका सूचनाहरू देखाउने अनुमति दिनुहोस्। एपहरूले अलार्म, आगमन कल वा अन्य महत्त्वपूर्ण सूचनाहरू हाइलाइट गर्ने प्रयोजनका लागि फुल स्क्रिनमा सूचनाहरू देखाउन सक्छन्।"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"तपाईंका डिभाइसमा इन्स्टल गरिएका एपहरूले तपाईंको डिभाइसको नाम हेर्न सक्छन्। तपाईंले ब्लुटुथ चल्ने डिभाइसमा कनेक्ट गर्दा, कुनै Wi-Fi नेटवर्कमा कनेक्ट गर्दा वा कुनै Wi-Fi हटस्पट सेटअप गर्दा अरू मान्छेहरूले पनि डिभाइसको नाम देख्न सक्छन्।"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"ग्रामाटिकल जेन्डर"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"ग्रामाटिकल जेन्डर चयन गर्नुहोस्"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"छलकपट गर्ने उद्देश्यले बनाइएका एपहरू छन् कि छैनन् भन्ने कुरा पत्ता लगाउन स्क्यान गरिँदै छ"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"फिसिङसम्बन्धी गतिविधि गरिएको छ कि छैन भन्ने कुरा पत्ता लगाउनका निम्ति एपमा गरिएका गतिविधि हेर्नुहोस्"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"स्क्यान गर्ने कार्य प्रयोग गर्नुहोस्"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"कामसम्बन्धी एपका लागि स्क्यान गर्ने सुविधा प्रयोग गर्नुहोस्"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 402573a..4a7bfe6 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audio uitzetten"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Hiermee zet je de functie voor Bluetooth LE Audio uit als het apparaat hardwaremogelijkheden voor LE Audio ondersteunt."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Schakelaar voor LE Audio tonen in Apparaatgegevens"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Toelatingslijst voor Bluetooth LE Audio negeren"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Maak standaard gebruik van LE Audio, ook als niet is geverifieerd of LE Audio-randapparatuur voldoet aan de criteria van de toelatingslijst."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Media-apparaten"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Apparaten voor gesprekken"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Andere apparaten"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Opgeslagen apparaten"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Gekoppeld aan account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Eerder gebruikt met account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth wordt aangezet om te koppelen"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Verbindingsvoorkeuren"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Eerder verbonden"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Schrijven in tekstvelden"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Indrukken van stylusknop negeren"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio delen"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Audio delen"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Gesprekken en alarmen"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Verbinden met een LE-audiostream"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Audiostreams in de buurt"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Audiostreams"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Maak verbinding met een audiostream via een QR-code"</string>
<string name="date_and_time" msgid="1788358029823431692">"Datum en tijd"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Wissen"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privéruimte"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Apps verbergen in een privémap"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Ontgrendelen met schermvergrendeling"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Privéruimte tonen"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Verbergen indien vergrendeld"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Privéruimte verbergen indien vergrendeld"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Als je niet wilt dat andere mensen weten dat Privéruimte op je apparaat staat, kun je deze verbergen in de lijst met apps"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Toegang krijgen tot Privéruimte indien verborgen"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Zoek naar Privéruimte in de zoekbalk"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tik op de tegel Privéruimte"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Je Privéruimte ontgrendelen"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Uit"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Aan"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Systeem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Privéruimte maken"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Privéruimte verwijderen"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Privéruimte kan niet worden gemaakt"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Privéruimte verwijderd"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Privéruimte kan niet worden verwijderd"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Schermvergrendeling instellen"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Als je Privéruimte wilt gebruiken, stel je een schermvergrendeling op dit apparaat in."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Schermvergrendeling instellen"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Annuleren"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Annuleren"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Instellen"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Privéruimte instellen"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Verberg privé-apps in een beveiligde ruimte die alleen toegankelijk is voor jou"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Hoe het werkt"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Je kunt toegang tot Privéruimte krijgen vanaf de onderkant van de lijst met apps"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Apps in Privéruimte worden beschermd door een vergrendeling"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Meldingen van apps in Privéruimte worden verborgen als Privéruimte vergrendeld is"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Apps in Privéruimte verschijnen niet in rechtenbeheer, privacydashboard en andere instellingen als Privéruimte vergrendeld is"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Privéruimte instellen…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privéruimte wordt beschermd door een vergrendeling"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Gebruiksinformatie voor apps in Privéruimte is verborgen als Privéruimte vergrendeld is"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Toegang krijgen tot Privéruimte vanuit je lijst met apps"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Kan Privéruimte niet instellen"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Probeer het nu of kom later terug"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Opnieuw proberen"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Schermvergrendeling gebruiken voor ontgrendeling?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Je kunt Privéruimte op dezelfde manier ontgrendelen als je apparaat of een andere vergrendeling kiezen"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Schermvergrendeling gebruiken"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Nieuwe vergrendeling kiezen"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Je bent nu helemaal klaar"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Swipe omhoog vanaf de onderkant van het scherm en scroll omlaag om toegang tot Privéruimte te krijgen"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Klaar"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scroll omlaag om toegang tot Privéruimte te krijgen"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Je kunt maximaal <xliff:g id="COUNT">%d</xliff:g> vingerafdrukken toevoegen"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Je hebt het maximale aantal vingerafdrukken toegevoegd"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Kan geen extra vingerafdrukken toevoegen"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Apps blijven gebruiken bij vouwen"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Hiermee wordt de vernieuwingssnelheid automatisch verhoogd van 60 naar <xliff:g id="ID_1">%1$s</xliff:g> Hz voor bepaalde content. Het batterijgebruik neemt toe."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Verhoogt de vernieuwingssnelheid automatisch naar <xliff:g id="ID_1">%1$d</xliff:g> Hz voor bepaalde content. Het batterijgebruik neemt toe."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Piekvernieuwingssnelheid afdwingen"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"De hoogste vernieuwingssnelheid voor verbeterde responsiviteit voor aanraking en animatiekwaliteit. Het batterijgebruik neemt toe."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Schermaandacht"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Gemeenschappelijke instellingen"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN\'s"</string>
<string name="apn_edit" msgid="2003683641840248741">"Toegangspunt bewerken"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Toegangspunt toevoegen"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Niet ingesteld"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Niet ingesteld"</string>
<string name="apn_name" msgid="6677695784108157953">"Naam"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Knop Toegankelijkheid gebruiken om te openen"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Houd de volumetoetsen ingedrukt om te openen"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Tik 3 keer op het scherm om te openen"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"3·keer op het scherm tikken met 2 vingers om te openen"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Gebaar gebruiken om te openen"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Toegankelijkheidsgebaar gebruiken"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Als je deze functie wilt gebruiken, tik je onderaan het scherm op de knop Toegankelijkheid <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nTik op de knop Toegankelijkheid en houd deze vast om tussen functies te schakelen."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Tik op de knop Toegankelijkheid op het scherm om deze functie te gebruiken."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Als je deze functie wilt gebruiken, houd je beide volumetoetsen ingedrukt."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Tik ergens op je scherm om de vergroting te starten of te stoppen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Tik ergens 3 keer op het scherm met 2 vingers om de vergroting te starten of te stoppen."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Als je deze functie wilt gebruiken, swipe je met twee vingers omhoog vanaf de onderkant van het scherm.\n\nSwipe met twee vingers omhoog en houd vast om tussen functies te schakelen."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Als je deze functie wilt gebruiken, swipe je met 3 vingers omhoog vanaf de onderkant van het scherm.\n\nSwipe met 3 vingers omhoog en houd vast om tussen functies te schakelen."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Als je een toegankelijkheidsfunctie wilt gebruiken, swipe je met twee vingers omhoog vanaf de onderkant van het scherm.\n\nSwipe met twee vingers omhoog en houd vast om tussen functies te schakelen."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Volumetoetsen ingedrukt houden"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"volumetoetsen ingedrukt houden"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Houd beide volumetoetsen ingedrukt"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"3·keer op het scherm tikken met 2 vingers"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"3·keer op het scherm tikken met 2 vingers"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Tik snel {0,number,integer} keer op het scherm met 2 vingers"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"3 keer op het scherm tikken"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"drie keer op het scherm tikken"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Tik snel {0,number,integer} keer op het scherm. Deze snelkoppeling kan je apparaat vertragen."</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Trillen en haptische technologie gebruiken"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Trilling bij wekker"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Trilling bij media"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Toetsenbordtrilling"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Trilling bij bellen"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Trilling bij melding"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Tikfeedback"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Als je de achtergrondactiviteit voor een app beperkt, functioneert de app mogelijk niet meer correct"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Batterijoptimalisatie is niet ingesteld voor deze app. Je kunt de app dus niet beperken.\n\nZet eerst batterijoptimalisatie aan als je de app wilt beperken."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Batterijgebruik beheren"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Achtergrondgebruik toestaan"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Zet aan voor realtime updates, zet uit om de batterij te sparen"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Onbeperkt"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Geoptimaliseerd"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Beperkt"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tekstgrootte, grote letters, groot lettertype, grote tekst, slechtziend, tekst groter maken, lettertype vergroten, vergroting van lettertype"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"inactief scherm altijd aan, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, lezer"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"toetsenbord, haptische technologie, trillen"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, trillen, niet storen"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Mediavolume"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Castvolume"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Toegang geven om alle bestanden te beheren"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Sta toe dat deze app alle bestanden op dit apparaat of gekoppelde opslagvolumes kan lezen, aanpassen of verwijderen. Als je dit toestaat, kan de app zonder jouw medeweten toegang tot bestanden krijgen."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Mag toegang tot alle bestanden hebben"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Meldingen op volledig scherm"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Meldingen op volledig scherm van deze app toestaan"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Toestaan dat deze app meldingen op het volledige scherm toont als het apparaat is vergrendeld. Apps kunnen zo alarmen, inkomende gesprekken of andere urgente meldingen onder de aandacht brengen."</string>
@@ -4251,7 +4305,7 @@
<!-- no translation found for graphics_driver_app_preference_values:2 (5391218026495225599) -->
<!-- no translation found for graphics_driver_app_preference_values:3 (2586045835780389650) -->
<string name="enable_angle_as_system_driver" msgid="4648827560023949786">"Experimenteel: ANGLE aanzetten"</string>
- <string name="enable_angle_as_system_driver_summary" msgid="2170215556348477481">"Waarschuwing: Zet ANGLE aan als standaard OpenGL ES-stuurprogramma. Deze functie is in een experimentele fase en werkt misschien niet met bepaalde camera- en video-apps."</string>
+ <string name="enable_angle_as_system_driver_summary" msgid="2170215556348477481">"Waarschuwing: ANGLE wordt aangezet als standaard OpenGL ES-stuurprogramma. Deze functie is in een experimentele fase en werkt misschien niet met bepaalde camera- en video-apps."</string>
<string name="reboot_dialog_enable_angle_as_system_driver" msgid="2619263039763150810">"Je moet opnieuw opstarten om het OpenGL ES-stuurprogramma van het systeem te wijzigen"</string>
<string name="platform_compat_dashboard_title" msgid="1323980546791790236">"App-compatibiliteitswijzigingen"</string>
<string name="platform_compat_dashboard_summary" msgid="4036546607938791337">"Zet app-compatibiliteitswijzigingen aan/uit"</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"App-activiteit checken op phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Scannen gebruiken"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Scannen gebruiken voor werk-apps"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scans worden privé uitgevoerd op je apparaat, waarbij de app-activiteit wordt gecheckt op phishing of ander misleidend gedrag. Als er iets wordt gevonden, worden bepaalde app-gegevens naar Google Play Protect gestuurd om de dreiging te bevestigen en app-gebruikers te waarschuwen."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Dit is een beschermde beveiligingsfunctie. Er worden geen apparaatgegevens of persoonlijke informatie gedeeld met Google. \n\nPhishing is een poging om inloggegevens of andere persoonlijke informatie te stelen."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 8866f54..b1a28d6 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ବ୍ଲୁଟୁଥ LE ଅଡିଓକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ଯଦି ଡିଭାଇସ LE ଅଡିଓ ହାର୍ଡୱେର କ୍ଷମତାକୁ ସମର୍ଥନ କରେ ତେବେ ଏହା ବ୍ଲୁଟୁଥ LE ଅଡିଓ ଫିଚରକୁ ଅକ୍ଷମ କରେ।"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ଡିଭାଇସ ବିବରଣୀରେ LE ଅଡିଓ ଟୋଗଲ ଦେଖାନ୍ତୁ"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ବାଇପାସ ବ୍ଲୁଟୁଥ LE ଅଡିଓ ଆଲାଉଲିଷ୍ଟ"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ଆଲାଉଲିଷ୍ଟ ମାନଦଣ୍ଡ ପୂରଣ କରିବାକୁ LE ଅଡିଓ ପେରିଫେରାଲକୁ ଯାଞ୍ଚ କରାଯାଇନଥିଲେ ମଧ୍ୟ ଡିଫଲ୍ଟ ଭାବେ LE ଅଡିଓ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"ମିଡିଆ ଡିଭାଇସ୍ଗୁଡ଼ିକ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"କଲ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ଅନ୍ୟ ଡିଭାଇସ୍ଗୁଡ଼ିକ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"ସେଭ ହୋଇଥିବା ଡିଭାଇସଗୁଡ଼ିକ"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ଆକାଉଣ୍ଟ ସହ ସମ୍ବନ୍ଧିତ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ଆକାଉଣ୍ଟରେ ପୂର୍ବରୁ ବ୍ୟବହାର କରାଯାଇଛି"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ପେୟାର କରିବା ପାଇଁ ବ୍ଲୁଟୁଥ ଚାଲୁ ହେବ"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"କନେକ୍ସନ ପସନ୍ଦଗୁଡ଼ିକ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ପୂର୍ବରୁ ସଂଯୋଗ ହୋଇଛି"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ଟେକ୍ସଟ ଫିଲ୍ଡଗୁଡ଼ିକରେ ଲେଖନ୍ତୁ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ସମସ୍ତ ଷ୍ଟାଇଲସ ବଟନ ଦାବିବାକୁ ଅଣଦେଖା କରନ୍ତୁ"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ଷ୍ଟାଇଲସ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ଅଡିଓ ସେୟାରିଂ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ଅଡିଓ ସେୟାର କରନ୍ତୁ"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"କଲ ଏବଂ ଆଲାରାମଗୁଡ଼ିକ"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"ଏକ LE ଅଡିଓ ଷ୍ଟ୍ରିମ ସହ କନେକ୍ଟ କରନ୍ତୁ"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"ଆଖପାଖର ଅଡିଓ ଷ୍ଟ୍ରିମଗୁଡ଼ିକ"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ଅଡିଓ ଷ୍ଟ୍ରିମଗୁଡ଼ିକ"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR କୋଡ ବ୍ୟବହାର କରି ଏକ ଅଡିଓ ଷ୍ଟ୍ରିମ ସହ କନେକ୍ଟ କରନ୍ତୁ"</string>
<string name="date_and_time" msgid="1788358029823431692">"ତାରିଖ ଓ ସମୟ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ପ୍ରକ୍ସି"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ଖାଲି କରନ୍ତୁ"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ପ୍ରାଇଭେଟ ସ୍ପେସ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ଏକ ପ୍ରାଇଭେଟ ଫୋଲ୍ଡରରେ ଆପ୍ସକୁ ଲୁଚାନ୍ତୁ"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରି ଅନଲକ କରନ୍ତୁ"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଦେଖାନ୍ତୁ"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ଲକ ଥିବା ସମୟରେ ଲୁଚାନ୍ତୁ"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଲକ ଥିବା ସମୟରେ ଏହାକୁ ଲୁଚାନ୍ତୁ"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ଡିଭାଇସରେ ପ୍ରାଇଭେଟ ସ୍ପେସ ଥିବା ଅନ୍ୟ ଲୋକମାନଙ୍କୁ ନଜଣାଇବାକୁ ଆପଣ ଆପ୍ସ ତାଲିକାରୁ ଏହାକୁ ଲୁଚାଇପାରିବେ"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଲୁକ୍କାୟିତ ଥିବା ସମୟରେ ଏହାକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ସର୍ଚ୍ଚ ବାରରେ \'ପ୍ରାଇଭେଟ ସ୍ପେସ\' ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଟାଇଲରେ ଟାପ କରନ୍ତୁ"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ଆପଣଙ୍କ ପ୍ରାଇଭେଟ ସ୍ପେସକୁ ଅନଲକ କରନ୍ତୁ"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ବନ୍ଦ ଅଛି"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ଚାଲୁ ଅଛି"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ସିଷ୍ଟମ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ପ୍ରାଇଭେଟ ସ୍ପେସ ତିଆରି କରନ୍ତୁ"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଡିଲିଟ କରନ୍ତୁ"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ପ୍ରାଇଭେଟ ସ୍ପେସ ତିଆରି କରାଯାଇପାରିଲା ନାହିଁ"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ପ୍ରାଇଭେଟ ସ୍ପେସ ସଫଳତାର ସହ ଡିଲିଟ କରାଯାଇଛି"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଡିଲିଟ କରାଯାଇପାରିଲା ନାହିଁ"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ଏକ ସ୍କ୍ରିନ ଲକ ସେଟ କରନ୍ତୁ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ପ୍ରାଇଭେଟ ସ୍ପେସ ବ୍ୟବହାର ପାଇଁ ଏ ଡିଭାଇସରେ ଏକ ସ୍କ୍ରିନ ଲକ ସେଟ କର।"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ସ୍କ୍ରିନ ଲକ ସେଟ କରନ୍ତୁ"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ବାତିଲ କରନ୍ତୁ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ବାତିଲ କରନ୍ତୁ"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"ସେଟ ଅପ କରନ୍ତୁ"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ପ୍ରାଇଭେଟ ସ୍ପେସ ସେଟ ଅପ କରନ୍ତୁ"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ପ୍ରାଇଭେଟ ଆପ୍ସକୁ କେବଳ ଆପଣ ଆକ୍ସେସ କରିପାରୁଥିବା ଏକ ସୁରକ୍ଷିତ ସ୍ପେସରେ ଲୁଚାନ୍ତୁ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ଏହା କିପରି କାମ କରେ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ଆପଣ ଆପଣଙ୍କ ଆପ୍ସ ତାଲିକାର ନିମ୍ନରୁ ପ୍ରାଇଭେଟ ସ୍ପେସକୁ ଆକ୍ସେସ କରିପାରିବେ"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ପ୍ରାଇଭେଟ ସ୍ପେସରେ ଥିବା ଆପ୍ସ ଏକ ଲକ ଦ୍ୱାରା ସୁରକ୍ଷିତ ଅଟେ"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Private Space ଲକ ଥିବା ସମୟରେ ଏଥିରେ ଥିବା ଆପ୍ସରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଲୁଚାଯାଇଥାଏ"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Private Space ଲକ ଥିବା ବେଳେ ଅନୁମତି ପରିଚାଳକ, ଗୋପନୀୟତା ଡେସବୋର୍ଡ ଏବଂ ଅନ୍ୟ ସେଟିଂସରେ Private Space ଆପ୍ସ ଦେଖାଯିବ ନାହିଁ"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Private Space ସେଟ ଅପ କରାଯାଉଛି…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Private Space ଏକ ଲକ ଦ୍ୱାରା ସୁରକ୍ଷିତ ଅଟେ"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Private Space ଆପ୍ସ ଲକ ଥିବା ବେଳେ ଏହାର ବ୍ୟବହାର ସୂଚନା ଲୁକ୍କାୟିତ ରହିଥାଏ"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ଆପଣଙ୍କ ଆପ୍ସ ତାଲିକାରୁ Private Spaceକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Private Space ସେଟ ଅପ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ବର୍ତ୍ତମାନ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ୱା ପରେ ଫେରନ୍ତୁ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ଅନଲକ କରିବା ପାଇଁ ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରିବେ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ଆପଣ ଅନଲକ କରିବା ପରି Private Spaceକୁ ଅନଲକ କରିପାରିବେ କିମ୍ୱା ଏକ ଭିନ୍ନ ଲକ ବାଛିପାରିବେ"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"ନୂଆ ଲକ ବାଛନ୍ତୁ"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ପ୍ରସ୍ତୁତ!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Private Spaceକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଆପଣଙ୍କ ହୋମ ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ କରି ତା\'ପରେ ତଳକୁ ସ୍କ୍ରୋଲ କରନ୍ତୁ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ହୋଇଗଲା"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Private Spaceକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ତଳକୁ ସ୍କ୍ରୋଲ କରନ୍ତୁ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"ଆପଣ ସର୍ବାଧିକ <xliff:g id="COUNT">%d</xliff:g> ଟିପଚିହ୍ନ ଯୋଗ କରିପାରିବେ"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"ଆପଣ ସର୍ବାଧିକ ସଂଖ୍ୟାର ଆଙ୍ଗୁଠି ଚିହ୍ନ ଯୋଡିଛନ୍ତି"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"ଆଉ ଅଧିକ ଟିପଚିହ୍ନ ଯୋଡିପାରିବ ନାହିଁ"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ଫୋଲ୍ଡରେ ଥିବା ଆପ୍ସ ବ୍ୟବହାର କରିବା ଜାରି ରଖନ୍ତୁ"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"ସ୍ମୁଥ୍ ଡିସପ୍ଲେ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"କିଛି ବିଷୟବସ୍ତୁ ପାଇଁ ରିଫ୍ରେସ ରେଟକୁ ସ୍ୱଚାଳିତ ଭାବରେ 60ରୁ <xliff:g id="ID_1">%1$s</xliff:g> Hz ପର୍ଯ୍ୟନ୍ତ ବଢ଼ାଇଥାଏ। ବେଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"କିଛି ବିଷୟବସ୍ତୁ ପାଇଁ ରିଫ୍ରେସ ରେଟକୁ ସ୍ୱତଃ <xliff:g id="ID_1">%1$d</xliff:g> Hz ପର୍ଯ୍ୟନ୍ତ ବଢ଼ାଇଥାଏ। ବେଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ସର୍ବାଧିକ ରିଫ୍ରେସ୍ ହାରକୁ ଲାଗୁ କରନ୍ତୁ"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"ଉନ୍ନତ ସ୍ପର୍ଶ ପ୍ରତିକ୍ରିୟା ଓ ଆନିମେସନ ଗୁଣବତ୍ତା ପାଇଁ ସର୍ବାଧିକ ରିଫ୍ରେସ ରେଟ। ବେଟେରୀର ବ୍ୟବହାର ବଢ଼ାଇଥାଏ।"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ସ୍କ୍ରିନ୍ ଆଟେନ୍ସନ୍"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"କମ୍ୟୁନାଲ ସେଟିଂସ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"ଆକ୍ସେସ ପଏଣ୍ଟକୁ ଏଡିଟ କରନ୍ତୁ"</string>
+ <string name="apn_add" msgid="9069613192201630934">"ଆକ୍ସେସ ପଏଣ୍ଟ ଯୋଗ କରନ୍ତୁ"</string>
<string name="apn_not_set" msgid="8246646433109750293">"ସେଟ ହୋଇନାହିଁ"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"ସେଟ କରାଯାଇନାହିଁ"</string>
<string name="apn_name" msgid="6677695784108157953">"ନାମ"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ଖୋଲିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ବଟନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"ଖୋଲିବାକୁ ଭଲ୍ୟୁମ୍ କୀ\'ଗୁଡ଼ିକୁ ଧରି ରଖନ୍ତୁ"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ଖୋଲିବାକୁ ସ୍କ୍ରିନରେ ତିନି ଥର ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ଖୋଲିବା ପାଇଁ ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନକୁ ତିନିଥର ଟାପ କରନ୍ତୁ"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ଖୋଲିବା ପାଇଁ ଜେଶ୍ଚର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ଏହି ଫିଚର୍ ବ୍ୟବହାର କରିବାକୁ ଆପଣଙ୍କ ସ୍କ୍ରିନର ନିମ୍ନରେ ଥିବା ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>ରେ ଟାପ୍ କରନ୍ତୁ। \n\n ଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ ଆକ୍ସେସିବିଲିଟୀ ବଟନକୁ ଦାବି ଧରନ୍ତୁ।"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ଏହି ଫିଚରକୁ ବ୍ୟବହାର କରିବା ପାଇଁ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଥିବା ଆକ୍ସେସିବିଲିଟୀ ବଟନକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ଏହି ଫିଚର୍ ବ୍ୟବହାର କରିବାକୁ, ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଦବାଇ ଧରନ୍ତୁ।"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ମେଗ୍ନିଫିକେସନ ଆରମ୍ଭ ଏବଂ ବନ୍ଦ କରିବାକୁ, ଆପଣଙ୍କ ସ୍କ୍ରିନର ଯେ କୌଣସି ସ୍ଥାନରେ ତିନି ଥର-ଟାପ କରନ୍ତୁ।"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ମେଗ୍ନିଫିକେସନ ଆରମ୍ଭ ଓ ବନ୍ଦ କରିବାକୁ ନିଜ ସ୍କ୍ରିନର ଯେ କୌଣସି ସ୍ଥାନରେ ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ତିନିଥର-ଟାପ କରନ୍ତୁ।"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ଏହି ଫିଚର୍ ବ୍ୟବହାର କରିବାକୁ 2ଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ।\n\nଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ, 2ଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ଏହି ଫିଚର୍ ବ୍ୟବହାର କରିବାକୁ 3ଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ।\n\nଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ, 3ଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ଏକ ଆକ୍ସେସବିଲିଟୀ ଫିଚର୍ ବ୍ୟବହାର କରିବାକୁ 2ଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ।\n\nଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ, 2ଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ଭଲ୍ୟୁମ୍ କୀ\'ଗୁଡ଼ିକୁ ଧରି ରଖନ୍ତୁ"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ଭଲ୍ୟୁମ୍ କୀ\'ଗୁଡ଼ିକୁ ଧରି ରଖନ୍ତୁ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଦବାଇ ଧରି ରଖନ୍ତୁ"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ଦୁଇଟି-ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନକୁ ତିନିଥର-ଟାପ କରନ୍ତୁ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ଦୁଇଟି-ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନକୁ ତିନିଥର-ଟାପ କରନ୍ତୁ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନକୁ ଶୀଘ୍ର {0,number,integer} ଥର ଟାପ କରନ୍ତୁ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ଟ୍ରିପଲ୍ ଟାପ୍ ସ୍କ୍ରିନ୍"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ଟ୍ରିପଲ୍-ଟାପ୍ ସ୍କ୍ରିନ୍"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ସ୍କ୍ରିନରେ ଶୀଘ୍ର {0,number,integer} ଥର ଟାପ୍ କରନ୍ତୁ। ଏହି ସର୍ଟକଟ୍ ଆପଣଙ୍କ ଡିଭାଇସକୁ ଧୀର କରିପାରେ"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ଭାଇବ୍ରେସନ ଏବଂ ହାପଟିକ୍ସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"ଆଲାରାମ ଭାଇବ୍ରେସନ"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"ମିଡିଆ ଭାଇବ୍ରେସନ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"କୀବୋର୍ଡ ଭାଇବ୍ରେସନ"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ରିଙ୍ଗ ଭାଇବ୍ରେସନ୍"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"ବିଜ୍ଞପ୍ତି ଭାଇବ୍ରେସନ୍"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ଟଚ୍ ଫିଡବ୍ୟାକ୍"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ଯଦି ଆପଣ ଗୋଟିଏ ଆପ୍ର ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ କାର୍ଯ୍ୟକଳାପକୁ ସୀମିତ କରିବେ, ଏହା ଠିକ୍ ଭାବରେ କାମ କରିନପାରେ"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ବ୍ୟାଟେରୀକୁ ଅପ୍ଟିମାଇଜ୍ କରିବା ପାଇଁ ଯେହେତୁ ଏହି ଆପ୍କୁ ସେଟ୍ କରାଯାଇନାହିଁ, ତେଣୁ ଆପଣ ଏହାକୁ ସୀମାବଦ୍ଧ କରିପାରିବେ ନାହିଁ। \n\nଆପ୍କୁ ସୀମାବଦ୍ଧ କରିବା ପାଇଁ ପ୍ରଥମେ ବ୍ୟାଟେରୀ ଅପ୍ଟିମାଇଜେସନ୍କୁ ଚାଲୁ କରନ୍ତୁ।"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ବ୍ୟାଟେରୀ ବ୍ୟବହାର ପରିଚାଳନା କରନ୍ତୁ"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"ପୃଷ୍ଠପଟରେ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"ରିଅଲ-ଟାଇମ ଅପଡେଟ ପାଇଁ ସକ୍ଷମ କରନ୍ତୁ, ବେଟେରୀର ଚାର୍ଜ ସେଭ କରିବାକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ଅପ୍ରତିବନ୍ଧିତ"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ଅପ୍ଟିମାଇଜ କରାଯାଇଛି"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ପ୍ରତିବନ୍ଧିତ"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ଟେକ୍ସଟର ଆକାର, ବଡ଼ ପ୍ରିଣ୍ଟ, ବଡ଼ ଫଣ୍ଟ, ବଡ଼ ଟେକ୍ସଟ୍, କମ୍ ଦେଖାଯାଉଥିବା, ଟେକ୍ସଟ୍ ଆହୁରି ବଡ଼ କରନ୍ତୁ, ଫଣ୍ଟର ଆକାର ବଡ଼ କରୁଥିବା ଟୁଲ୍, ଫଣ୍ଟର ଆକାର ବଡ଼ କରିବା"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ସର୍ବଦା ଚାଲୁ ଆମ୍ବିଏଣ୍ଟ ଡିସପ୍ଲେ, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ଟାଗ, ରିଡର"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"କୀବୋର୍ଡ, ହାପଟିକ୍ସ, ଭାଇବ୍ରେଟ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ଭଲ୍ୟୁମ୍, ଭାଇବ୍ରେସନ୍, ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"ମିଡିଆ ଭଲ୍ୟୁମ"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"କାଷ୍ଟ ଭଲ୍ୟୁମ୍"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ସମସ୍ତ ଫାଇଲକୁ ପରିଚାଳନା ପାଇଁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ଏହି ଡିଭାଇସ୍ କିମ୍ବା ଯେ କୌଣସି ସଂଯୁକ୍ତ ଥିବା ଷ୍ଟୋରେଜ୍ ଭଲ୍ୟୁମରେ ଥିବା ସମସ୍ତ ଫାଇଲକୁ ପଢ଼ିବା, ପରିବର୍ତ୍ତନ କରିବା ଏବଂ ଡିଲିଟ୍ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଯଦି ଅନୁମତି ଦିଆଯାଏ, ତେବେ ଆପ୍ ଆପଣଙ୍କୁ ସ୍ପଷ୍ଟ ନକରି ଫାଇଲଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିପାରେ।"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ସମସ୍ତ ଫାଇଲକୁ ଆକ୍ସେସ୍ କରିପାରିବ"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ଏହି ଆପରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ଡିଭାଇସ ଲକ ହେଲେ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଆଲାରାମ, ଇନକମିଂ କଲ କିମ୍ବା ଅନ୍ୟ ଜରୁରୀ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ହାଇଲାଇଟ କରିବା ପାଇଁ ଆପ୍ସ ଏଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରେ।"</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ଫିସିଂ ପାଇଁ ଆପ କାର୍ଯ୍ୟକଳାପ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ସ୍କାନିଂ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ୱାର୍କ ଆପ୍ସ ପାଇଁ ସ୍କାନିଂ ବ୍ୟବହାର କରନ୍ତୁ"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"ସ୍କାନିଂ ପ୍ରାଇଭେବ ଭାବେ ଆପଣଙ୍କ ଡିଭାଇସରେ ହିଁ ଚାଲିଥାଏ, ଏହା ଫିସିଂ କିମ୍ବା ଅନ୍ୟ ପ୍ରତାରଣାପୂର୍ଣ୍ଣ ଆଚରଣ ପାଇଁ ଆପ କାର୍ଯ୍ୟକଳାପକୁ ଯାଞ୍ଚ କରୁଛି। ଯଦି ଏହା ଚିହ୍ନଟ କରାଯାଏ, ତେବେ ଧମକ ସୁନିଶ୍ଚିତ କରି ଆପ ୟୁଜରମାନଙ୍କୁ ଚେତାବନୀ ଦେବା ପାଇଁ କିଛି ଆପ ସୂଚନା Google Playକୁ ପଠାଯାଏ।"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"ଏହା ଏକ ସୁରକ୍ଷିତ ସୁରକ୍ଷା ଫିଚର ଅଟେ। Google ସହ କୌଣସି ଡିଭାଇସ କିମ୍ବା ବ୍ୟକ୍ତିଗତ ସୂଚନା ସେୟାର କରାଯାଏ ନାହିଁ। \n\nସାଇନ-ଇନ କ୍ରେଡେନସିଆଲ କିମ୍ବା ଅନ୍ୟ ବ୍ୟକ୍ତିଗତ ସୂଚନା ଚୋରି କରିବାକୁ ଫିସିଂ ଏକ ପ୍ରଚେଷ୍ଟା ଅଟେ।"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index b8e6b13..103f4ae 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audio ਨੂੰ ਬੰਦ ਕਰੋ"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ਡੀਵਾਈਸ ਵੱਲੋਂ LE ਆਡੀਓ ਹਾਰਡਵੇਅਰ ਸਮਰੱਥਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਨ \'ਤੇ Bluetooth LE Audio ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ।"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"ਡੀਵਾਈਸ ਵੇਰਵਿਆਂ ਵਿੱਚ LE ਆਡੀਓ ਟੌਗਲ ਦਿਖਾਓ"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ਬਲੂਟੁੱਥ LE ਆਡੀਓ ਪ੍ਰਵਾਨਿਤ ਸੂਚੀ ਨੂੰ ਬਾਈਪਾਸ ਕਰੋ"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE ਆਡੀਓ ਨੂੰ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਤੌਰ \'ਤੇ ਵਰਤੋ, ਭਾਵੇਂ LE ਆਡੀਓ ਪੈਰੀਫੈਰਲ ਦੀ ਆਗਿਆ ਸੂਚੀ ਦੇ ਮਾਪਦੰਡਾਂ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ ਪ੍ਰਮਾਣਿਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"ਮੀਡੀਆ ਡੀਵਾਈਸਾਂ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ਕਾਲ ਡੀਵਾਈਸ"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ਹੋਰ ਡੀਵਾਈਸ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"ਰੱਖਿਅਤ ਕੀਤੇ ਡੀਵਾਈਸ"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ਖਾਤੇ ਨਾਲ ਪਹਿਲਾਂ ਵੀ ਵਰਤਿਆ ਗਿਆ ਹੈ"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"ਜੋੜਾਬੱਧ ਕਰਨ ਲਈ ਬਲੂਟੁੱਥ ਚਾਲੂ ਹੋਵੇਗਾ"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"ਕਨੈਕਸ਼ਨ ਤਰਜੀਹਾਂ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ਪਹਿਲਾਂ ਤੋਂ ਕਨੈਕਟ"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ਲਿਖਤ ਖੇਤਰਾਂ ਵਿੱਚ ਲਿਖੋ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ਸਟਾਈਲਸ ਨਾਲ ਦਬਾਏ ਗਏ ਸਾਰੇ ਬਟਨਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ਸਟਾਈਲਸ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ਆਡੀਓ ਸਾਂਝਾਕਰਨ"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ਆਡੀਓ ਨੂੰ ਸਾਂਝਾ ਕਰੋ"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ਕਾਲ ਅਤੇ ਅਲਾਰਮ"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ਪ੍ਰੌਕਸੀ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ਕਲੀਅਰ ਕਰੋ"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ਨਿੱਜੀ ਸਪੇਸ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ਨਿੱਜੀ ਫੋਲਡਰ ਵਿੱਚ ਐਪਾਂ ਲੁਕਾਓ"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਅਣਲਾਕ ਕਰੋ"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ਨਿੱਜੀ ਸਪੇਸ ਦਿਖਾਓ"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ਲਾਕ ਹੋਣ \'ਤੇ ਲੁਕਾਓ"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ਲਾਕ ਹੋਣ \'ਤੇ ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਲੁਕਾਓ"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ਹੋਰ ਲੋਕਾਂ ਤੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਨਿੱਜੀ ਸਪੇਸ ਲੁਕਾਉਣ ਲਈ, ਇਸਨੂੰ ਤੁਹਾਡੀ ਐਪ ਸੂਚੀ ਵਿੱਚੋਂ ਲੁਕਾ ਸਕਦੇ ਹੋ"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"ਅਦਿੱਖ ਹੋਣ \'ਤੇ ਨਿੱਜੀ ਸਪੇਸ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ਖੋਜ ਪੱਟੀ ਵਿੱਚ \'ਨਿੱਜੀ ਸਪੇਸ\' ਨੂੰ ਖੋਜੋ"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ਨਿੱਜੀ ਸਪੇਸ ਦੀ ਟਾਇਲ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ਆਪਣੀ ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਅਣਲਾਕ ਕਰੋ"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ਬੰਦ ਹੈ"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ਚਾਲੂ ਹੈ"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ਸਿਸਟਮ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ਨਿੱਜੀ ਸਪੇਸ ਬਣਾਓ"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ਨਿੱਜੀ ਸਪੇਸ ਮਿਟਾਓ"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ਨਿੱਜੀ ਸਪੇਸ ਵਰਤਣ ਲਈ, ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ।"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ਰੱਦ ਕਰੋ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ਰੱਦ ਕਰੋ"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"ਸੈੱਟਅੱਪ ਕਰੋ"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ਨਿੱਜੀ ਸਪੇਸ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ਨਿੱਜੀ ਐਪਾਂ ਨੂੰ ਇੱਕ ਸੁਰੱਖਿਅਤ ਥਾਂ ਵਿੱਚ ਲੁਕਾਓ ਜਿਸ ਤੱਕ ਸਿਰਫ਼ ਤੁਸੀਂ ਹੀ ਪਹੁੰਚ ਕਰ ਸਕਦੇ ਹੋ"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ਇਸਦੇ ਕੰਮ ਕਰਨ ਦਾ ਤਰੀਕਾ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ਤੁਸੀਂ ਆਪਣੀ ਐਪਾਂ ਦੀ ਸੂਚੀ ਦੇ ਹੇਠਾਂ ਦਿੱਤੀ ਨਿੱਜੀ ਸਪੇਸ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੇ ਹੋ"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ਨਿੱਜੀ ਸਪੇਸ ਵਿੱਚ ਮੌਜੂਦ ਐਪਾਂ ਨੂੰ ਲਾਕ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"ਨਿੱਜੀ ਸਪੇਸ ਦੇ ਲਾਕ ਹੋਣ \'ਤੇ, ਨਿੱਜੀ ਸਪੇਸ ਵਿੱਚ ਮੌਜੂਦ ਐਪਾਂ ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਲੁਕੀਆਂ ਹੁੰਦੀਆਂ ਹਨ"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"ਨਿੱਜੀ ਸਪੇਸ ਦੇ ਲਾਕ ਹੋਣ \'ਤੇ, ਨਿੱਜੀ ਸਪੇਸ ਐਪਾਂ ਇਜਾਜ਼ਤ ਪ੍ਰਬੰਧਕ, ਪਰਦੇਦਾਰੀ ਸੰਬੰਧੀ ਡੈਸ਼ਬੋਰਡ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦਿਖਾਈ ਨਹੀਂ ਦੇਣਗੀਆਂ"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"ਨਿੱਜੀ ਸਪੇਸ ਦਾ ਸੈੱਟਅੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਲਾਕ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ਨਿੱਜੀ ਸਪੇਸ ਦੇ ਲਾਕ ਹੋਣ \'ਤੇ, ਨਿੱਜੀ ਸਪੇਸ ਐਪਾਂ ਦੀ ਵਰਤੋਂ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਲੁਕੀ ਹੁੰਦੀ ਹੈ"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ਆਪਣੀ ਐਪ ਸੂਚੀ ਤੋਂ ਨਿੱਜੀ ਸਪੇਸ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ਨਿੱਜੀ ਸਪੇਸ ਦਾ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ਹੁਣੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਬਾਅਦ ਵਿੱਚ ਵਾਪਸ ਆਓ"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ਕੀ ਅਣਲਾਕ ਕਰਨ ਲਈ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤਣਾ ਹੈ?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"ਤੁਸੀਂ ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਉਸੇ ਤਰੀਕੇ ਨਾਲ ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ ਜਿਸ ਤਰ੍ਹਾਂ ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਅਣਲਾਕ ਕਰਦੇ ਹੋ, ਜਾਂ ਕੋਈ ਵੱਖਰਾ ਲਾਕ ਚੁਣੋ"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"ਨਵਾਂ ਲਾਕ ਚੁਣੋ"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"ਸਭ ਹੋ ਗਿਆ!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ਨਿੱਜੀ ਸਪੇਸ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ, ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ, ਫਿਰ ਹੇਠਾਂ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ਹੋ ਗਿਆ"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"ਨਿੱਜੀ ਸਪੇਸ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"ਤੁਸੀਂ <xliff:g id="COUNT">%d</xliff:g> ਤੱਕ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰ ਸਕਦੇ ਹੋ"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"ਤੁਸੀਂ ਫਿੰਗਰਪ੍ਰਿੰਟਾਂ ਦੀ ਅਧਿਕਤਮ ਸੰਖਿਆ ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਹੋਇਆ ਹੈ"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"ਹੋਰ ਫਿੰਗਰਪ੍ਰਿੰਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ਫੋਲਡ ਕਰਨ \'ਤੇ ਵੀ ਐਪਾਂ ਨੂੰ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖੋ"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"ਸਮੂਥ ਡਿਸਪਲੇ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕੁਝ ਸਮੱਗਰੀਆਂ ਲਈ ਰਿਫ੍ਰੈਸ਼ ਦਰ ਨੂੰ 60 ਤੋਂ ਵਧਾ ਕੇ <xliff:g id="ID_1">%1$s</xliff:g> Hz ਕਰ ਦਿੰਦਾ ਹੈ। ਬੈਟਰੀ ਵਰਤੋਂ ਵੱਧ ਜਾਂਦੀ ਹੈ।"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕੁਝ ਸਮੱਗਰੀ ਲਈ ਰਿਫ੍ਰੈਸ਼ ਦਰ ਨੂੰ ਵਧਾ ਕੇ <xliff:g id="ID_1">%1$d</xliff:g> Hz ਤੱਕ ਕਰ ਦਿੰਦੀ ਹੈ। ਬੈਟਰੀ ਵਰਤੋਂ ਵੱਧ ਜਾਂਦੀ ਹੈ।"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ਉੱਚ ਰਿਫ੍ਰੈਸ਼ ਦਰ ਸੈੱਟ ਕਰੋ"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"ਬਿਹਤਰ ਸਪਰਸ਼ ਪ੍ਰਤੀਕਿਰਿਆ ਅਤੇ ਐਨੀਮੇਸ਼ਨ ਕੁਆਲਿਟੀ ਲਈ ਉੱਚਤਮ ਰਿਫ੍ਰੈਸ਼ ਦਰ। ਬੈਟਰੀ ਵਰਤੋਂ ਵੱਧ ਜਾਂਦੀ ਹੈ।"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"ਸਕ੍ਰੀਨ ਦਾ ਚੌਕੰਨਾਪਣ"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"ਭਾਈਚਾਰਕ ਸੈਟਿੰਗਾਂ"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"ਪਹੁੰਚ ਬਿੰਦੂ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"ਸੈੱਟ ਨਹੀਂ ਹੈ"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"ਸੈੱਟ ਨਹੀਂ ਹੈ"</string>
<string name="apn_name" msgid="6677695784108157953">"ਨਾਮ"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ਖੋਲ੍ਹਣ ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਵਰਤੋ"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"ਖੋਲ੍ਹਣ ਲਈ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਦਬਾਈ ਰੱਖੋ"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"ਖੋਲ੍ਹਣ ਲਈ ਸਕ੍ਰੀਨ \'ਤੇ ਟ੍ਰਿਪਲ ਟੈਪ ਕਰੋ"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ਖੋਲ੍ਹਣ ਲਈ ਦੋ-ਉਂਗਲਾਂ ਨਾਲ ਟ੍ਰਿਪਲ-ਟੈਪ ਕਰੋ"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ਖੋਲ੍ਹਣ ਲਈ ਸੰਕੇਤ ਵਰਤੋ"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ਪਹੁੰਚਯੋਗਤਾ ਸੰਬੰਧੀ ਇਸ਼ਾਰਾ ਵਰਤੋ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> \'ਤੇ ਟੈਪ ਕਰੋ।\n\nਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਦਬਾ ਕੇ ਰੱਖੋ।"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, ਆਪਣੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿੱਤੇ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ \'ਤੇ ਟੈਪ ਕਰੋ।"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖੋ।"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਨੂੰ ਸ਼ੁਰੂ ਅਤੇ ਬੰਦ ਕਰਨ ਲਈ, ਸਕ੍ਰੀਨ \'ਤੇ ਕਿਤੇ ਵੀ ਟ੍ਰਿਪਲ-ਟੈਪ ਕਰੋ।"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਨੂੰ ਸ਼ੁਰੂ ਅਤੇ ਬੰਦ ਕਰਨ ਲਈ, ਆਪਣੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਕਿਤੇ ਵੀ ਟ੍ਰਿਪਲ-ਟੈਪ ਕਰੋ।"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, 2 ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।\n\nਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, 2 ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, 3 ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।\n\nਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, 3 ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ਕਿਸੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ, 2 ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।\n\nਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, 2 ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾ ਕੇ ਰੱਖੋ"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾ ਕੇ ਰੱਖੋ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖੋ"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ਦੋ-ਉਂਗਲਾਂ ਨਾਲ ਟ੍ਰਿਪਲ-ਟੈਪ ਕਰੋ"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ਦੋ-ਉਂਗਲਾਂ ਨਾਲ ਟ੍ਰਿਪਲ-ਟੈਪ ਕਰੋ"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ਤੇਜ਼ੀ ਨਾਲ ਸਕ੍ਰੀਨ \'ਤੇ ਦੋ ਉਂਗਲਾਂ ਨਾਲ {0,number,integer} ਵਾਰ ਟੈਪ ਕਰੋ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"ਸਕ੍ਰੀਨ \'ਤੇ ਟ੍ਰਿਪਲ ਟੈਪ ਕਰੋ"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ਸਕ੍ਰੀਨ \'ਤੇ ਟ੍ਰਿਪਲ ਟੈਪ ਕਰੋ"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"ਸਕ੍ਰੀਨ \'ਤੇ ਤੇਜ਼ੀ ਨਾਲ {0,number,integer} ਵਾਰ ਟੈਪ ਕਰੋ। ਇਹ ਸ਼ਾਰਟਕੱਟ ਸ਼ਾਇਦ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਹੌਲੀ ਕਰ ਦੇਵੇ"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ਥਰਥਰਾਹਟ ਅਤੇ ਹੈਪਟਿਕਸ ਵਰਤੋ"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"ਅਲਾਰਮ ਥਰਥਰਾਹਟ"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"ਮੀਡੀਆ ਥਰਥਰਾਹਟ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"ਕੀ-ਬੋਰਡ ਥਰਥਰਾਹਟ"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ਘੰਟੀ ਦੀ ਥਰਥਰਾਹਟ"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"ਸੂਚਨਾ ਦੀ ਥਰਥਰਾਹਟ"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ਸਪਰਸ਼ ਸੰਬੰਧੀ ਪ੍ਰਤੀਕਰਮ"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਦੀ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ ਨੂੰ ਸੀਮਿਤ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਹ ਅਜੀਬ ਢੰਗ ਨਾਲ ਵਰਤਾਅ ਕਰ ਸਕਦੀ ਹੈ"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ਇਹ ਐਪ ਬੈਟਰੀ ਨੂੰ ਸੁਯੋਗ ਕਰੋ \'ਤੇ ਸੈੱਟ ਨਾ ਕੀਤੀ ਹੋਣ ਕਰਕੇ, ਤੁਸੀਂ ਇਸ \'ਤੇ ਪਾਬੰਧੀ ਨਹੀਂ ਲਗਾ ਸਕਦੇ।\n\nਐਪ \'ਤੇ ਪਾਬੰਧੀ ਲਗਾਉਣ ਲਈ, ਪਹਿਲਾਂ ਬੈਟਰੀ ਸੁਯੋਗਕਰਨ ਨੂੰ ਚਾਲੂ ਕਰੋ।"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"ਬੈਟਰੀ ਵਰਤੋਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ਅਣ-ਪ੍ਰਤਿਬੰਧਿਤ"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ਸੁਯੋਗ ਬਣਾਈ ਗਈ"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"ਪ੍ਰਤਿਬੰਧਿਤ"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ਲਿਖਤ ਦਾ ਆਕਾਰ, ਵੱਡਾ ਪ੍ਰਿੰਟ, ਵੱਡਾ ਫ਼ੌਂਟ, ਵੱਡੀ ਲਿਖਤ, ਘੱਟ ਨਜ਼ਰ, ਲਿਖਤ ਵੱਡੀ ਕਰੋ, ਫ਼ੌਂਟ ਵੱਡਾ ਕਰੋ, ਫ਼ੌਂਟ ਵੱਡਾ ਕਰਨਾ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ਹਮੇਸ਼ਾਂ ਚਾਲੂ ਐਂਬੀਅੰਟ ਡਿਸਪਲੇ, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, ਟੈਗ, ਰੀਡਰ"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ਕੀ-ਬੋਰਡ, ਹੈਪਟਿਕਸ, ਥਰਥਰਾਹਟ,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ਅਵਾਜ਼, ਥਰਥਰਾਹਟ, ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"ਮੀਡੀਆ ਦੀ ਅਵਾਜ਼"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ਅਵਾਜ਼ ਕਾਸਟ ਕਰੋ"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦਿਓ"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ਇਸ ਐਪ ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਜਾਂ ਇਸ ਨਾਲ ਕਨੈਕਟ ਕਿਸੇ ਵੀ ਸਟੋਰੇਜ ਭਾਗ ਦੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਪੜ੍ਹਨ, ਸੋਧਣ ਅਤੇ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ। ਜੇ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਐਪ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ਇਹ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ਪੂਰੀ ਸਕ੍ਰੀਨ ਸੂਚਨਾਵਾਂ"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ਇਸ ਐਪ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ ਸੂਚਨਾਵਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"ਇਸ ਐਪ ਨੂੰ ਉਹ ਸੂਚਨਾਵਾਂ ਦਿਖਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ ਜੋ ਡੀਵਾਈਸ ਲਾਕ ਹੋਣ \'ਤੇ ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਿਖਾਈ ਦਿੰਦੀਆਂ ਹਨ। ਐਪਾਂ ਇਨ੍ਹਾਂ ਦੀ ਵਰਤੋਂ ਅਲਾਰਮਾਂ, ਇਨਕਮਿੰਗ ਕਾਲਾਂ ਜਾਂ ਹੋਰ ਜ਼ਰੂਰੀ ਸੂਚਨਾਵਾਂ ਨੂੰ ਉਜਾਗਰ ਕਰਨ ਲਈ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ਫ਼ਿਸ਼ਿੰਗ ਲਈ ਐਪ ਸਰਗਰਮੀ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ਸਕੈਨਿੰਗ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਲਈ ਸਕੈਨਿੰਗ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"ਸਕੈਨਿੰਗ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਨਿੱਜੀ ਤੌਰ \'ਤੇ ਚੱਲਦੀ ਹੈ, ਫ਼ਿਸ਼ਿੰਗ ਜਾਂ ਹੋਰ ਧੋਖੇਬਾਜ਼ ਵਿਹਾਰ ਲਈ ਐਪ ਸਰਗਰਮੀ ਦੀ ਜਾਂਚ ਕਰਦੀ ਹੈ। ਜੇ ਇਸਦਾ ਪਤਾ ਲੱਗਦਾ ਹੈ, ਤਾਂ ਖਤਰੇ ਦੀ ਤਸਦੀਕ ਕਰਨ ਅਤੇ ਐਪ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਚਿਤਾਵਨੀ ਦੇਣ ਲਈ ਕੁਝ ਐਪ ਜਾਣਕਾਰੀ Google Play Protect ਨੂੰ ਭੇਜੀ ਜਾਂਦੀ ਹੈ।"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"ਇਹ ਇੱਕ ਸੁਰੱਖਿਅਤ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ। Google ਨਾਲ ਕੋਈ ਵੀ ਡੀਵਾਈਸ ਜਾਂ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸਾਂਝੀ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ। \n\nਫ਼ਿਸ਼ਿੰਗ ਸਾਈਨ-ਇਨ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਜਾਂ ਹੋਰ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਚੋਰੀ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਹੈ।"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 5c1bacb..f87a0ba 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Wyłącz Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Wyłącza funkcję Bluetooth LE Audio, jeśli urządzenie obsługuje sprzętowe funkcje LE Audio"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Pokazuj przełącznik LE Audio w Szczegółach urządzenia"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omijaj listę dozwolonych Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Używaj domyślnie technologii LE Audio, nawet jeśli urządzenie peryferyjne LE Audio nie zostało zweryfikowane jako spełniające kryteria listy dozwolonych."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Nośniki danych"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Urządzenia telefoniczne"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Inne urządzenia"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Zapisane urządzenia"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Powiązane z kontem"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Poprzednio używane z kontem"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth włączy się, by sparować urządzenia"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Ustawienia połączeń"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Wcześniej połączone"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Pisz w polach tekstowych"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignoruj wszystkie naciśnięcia przycisku rysika"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Rysik"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Udostępnianie dźwięku"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Udostępniaj dźwięk"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Połączenia i alarmy"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Data i godzina"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Serwer proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Wyczyść"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Obszar prywatny"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ukryj aplikacje w prywatnym folderze"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Odblokuj za pomocą blokady ekranu"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Pokaż obszar prywatny"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ukryj po zablokowaniu"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ukryj Obszar prywatny po jego zablokowaniu"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Aby inni nie wiedzieli, że na urządzeniu jest Obszar prywatny, można ukryć go na liście aplikacji"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Dostęp do Obszaru prywatnego po jego ukryciu"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"W pasku wyszukiwania wyszukaj „Obszar prywatny”"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Kliknij kafelek Obszar prywatny"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Odblokuj Obszar prywatny"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Wyłączono"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Włączono"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Utwórz obszar prywatny"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Usuń obszar prywatny"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Nie udało się utworzyć obszaru prywatnego"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Usunięto obszar prywatny"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Nie udało się usunąć obszaru prywatnego"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ustaw blokadę ekranu"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Aby korzystać z obszaru prywatnego, ustaw na tym urządzeniu blokadę ekranu."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ustaw blokadę ekranu"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Anuluj"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Anuluj"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Skonfiguruj"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Konfiguracja Obszaru prywatnego"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Ukryj aplikacje prywatne w bezpiecznym obszarze, do którego tylko Ty masz dostęp"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Jak to działa"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Dostęp do Obszaru prywatnego można uzyskać z dołu listy aplikacji"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikacje w Obszarze prywatnym są chronione blokadą"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Powiadomienia z aplikacji w Obszarze prywatnym są ukryte, gdy jest on zablokowany"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikacje w Obszarze prywatnym nie będą wyświetlane w menedżerze uprawnień, panelu prywatności ani innych ustawieniach, gdy Obszar prywatny jest zablokowany"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Konfiguruję Obszar prywatny…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Obszar prywatny jest chroniony blokadą"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Informacje o wykorzystaniu aplikacji w Obszarze prywatnym są ukryte, gdy jest on zablokowany"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Dostęp do Obszaru prywatnego z listy aplikacji"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Nie udało się skonfigurować Obszaru prywatnego"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Spróbuj ponownie teraz lub wróć później"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Spróbuj ponownie"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Używać blokady ekranu do odblokowywania?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Obszar prywatny można odblokować w ten sam sposób, w jaki odblokowuje się urządzenie, lub wybrać inną blokadę"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Używaj blokady ekranu"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Wybierz nową blokadę"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Wszystko gotowe."</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Aby uzyskać dostęp do Obszaru prywatnego, przesuń palcem z dołu ekranu głównego w górę, a następnie przewiń ekran w dół"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Gotowe"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Przewiń w dół, aby uzyskać dostęp do Obszaru prywatnego"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Możesz dodać do <xliff:g id="COUNT">%d</xliff:g> odcisków palców"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Dodano maksymalną liczbę odcisków palców"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nie można dodać więcej odcisków palców"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Nadal używaj aplikacji po złożeniu"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Płynne wyświetlanie"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"W przypadku niektórych treści automatycznie podwyższa częstotliwość odświeżania z 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz. Zwiększa zużycie baterii."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"W przypadku niektórych treści automatycznie podwyższa częstotliwość odświeżania do <xliff:g id="ID_1">%1$d</xliff:g> Hz. Zwiększa wykorzystanie baterii."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Wymuszaj częstotliwość odświeżania na najwyższym poziomie"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Najszybsza częstotliwość odświeżania zapewnia szybszą reakcję na dotyk i wyższą jakość animacji, ale zwiększa zużycie baterii"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Aktywność ekranu"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Wspólne ustawienia"</string>
<string name="apn_settings" msgid="4295467389400441299">"Nazwy APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Edytuj punkt dostępu"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nie ustawiono"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nie ustawiono"</string>
<string name="apn_name" msgid="6677695784108157953">"Nazwa"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Otwieraj przyciskiem ułatwień dostępu"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Aby otworzyć, przytrzymaj przyciski głośności"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Aby otworzyć, trzy razy kliknij ekran"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Otwarcie przez dotknięcie ekranu 3 razy 2 palcami"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Otwieranie gestem"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Użyj gestu ułatwień dostępu"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Aby użyć tej funkcji, kliknij przycisk ułatwień dostępu <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> u dołu ekranu.\n\nAby przełączać się między funkcjami, naciśnij i przytrzymaj przycisk ułatwień dostępu."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Aby użyć tej funkcji, kliknij przycisk ułatwień dostępu na ekranie."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Aby użyć tej funkcji, naciśnij i przytrzymaj oba przyciski głośności."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Aby włączyć lub wyłączyć powiększenie, kliknij trzykrotnie w dowolnym miejscu na ekranie."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Aby włączyć lub wyłączyć powiększenie, dotknij 3 razy 2 palcami dowolnego miejsca na ekranie."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Aby użyć tej funkcji, przesuń 2 palcami z dołu ekranu w górę.\n\nAby przełączać się między funkcjami, przesuń 2 palcami w górę i przytrzymaj."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Aby użyć tej funkcji, przesuń 3 palcami z dołu ekranu w górę.\n\nAby przełączać się między funkcjami, przesuń 3 palcami w górę i przytrzymaj."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Aby użyć ułatwień dostępu, przesuń 2 palcami z dołu ekranu w górę.\n\nAby przełączać się między funkcjami, przesuń 2 palcami w górę i przytrzymaj."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Przytrzymaj przyciski głośności"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"przytrzymaj klawisze głośności"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Naciśnij i przytrzymaj oba przyciski głośności"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Dotknięcie ekranu 3 razy 2 palcami"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"dotknięcie ekranu 3 razy 2 palcami"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Szybko dotknij ekranu {0,number,integer} razy 2 palcami"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Kliknij ekran trzykrotnie"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"trzykrotnie kliknij ekran"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Szybko kliknij ekran {0,number,integer} razy. Ten skrót może spowolnić urządzenie."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Używaj wibracji i reakcji haptycznych"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Wibracje przy alarmie"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Wibracje przy multimediach"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Wibracje klawiatury"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Wibracje przy dzwonku"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Wibracje przy powiadomieniu"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Reakcje na dotyk"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Jeśli ograniczysz aktywność aplikacji w tle, może ona działać nieprawidłowo"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Ta aplikacja nie jest skonfigurowana do optymalnego wykorzystywania baterii, więc nie możesz wprowadzić dla niej ograniczeń.\n\nAby wprowadzić ograniczenia dla aplikacji, najpierw włącz optymalizację baterii."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Zarządzaj wykorzystaniem baterii"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Bez ograniczeń"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Z optymalizacją"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Z ograniczeniami"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"rozmiar tekstu, duży druk, duża czcionka, duży tekst, niedowidzenie, powiększenie tekstu, powiększenie czcionki"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"wygaszacz z powiadomieniami zawsze włączony, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, czytnik"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klawiatura, czujnik haptyczny, wibracje,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Głośność, wibracje, Nie przeszkadzać"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Głośność multimediów"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Głośność przesyłania"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Zezwól na zarządzanie wszystkimi plikami"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Zezwól tej aplikacji na odczytywanie, modyfikowanie i usuwanie plików na tym urządzeniu oraz wszelkich połączonych woluminach pamięci. Aplikacje z tymi uprawnieniami mogą korzystać z dostępu do plików bez konieczności wyraźnego informowania Cię o tym."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Ma dostęp do wszystkich plików"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Powiadomienia pełnoekranowe"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Zezwól na powiadomienia pełnoekranowe z tej aplikacji"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Zezwalaj na wyświetlanie przez tę aplikację powiadomień zajmujących cały ekran, gdy urządzenie jest zablokowane. Aplikacje mogą używać tych uprawnień do powiadamiania o alarmach, połączeniach przychodzących i innych pilnych sprawach."</string>
@@ -4882,16 +4943,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Nazwa urządzenia jest widoczna dla zainstalowanych przez Ciebie aplikacji. Mogą ją też zobaczyć inne osoby, gdy łączysz się z urządzeniami przez Bluetooth, łączysz się z siecią Wi-Fi lub konfigurujesz hotspot Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Rodzaj gramatyczny"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Wybierz rodzaj gramatyczny"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Skanuj w poszukiwaniu podejrzanych aplikacji"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Sprawdzaj aktywność w aplikacjach pod kątem phishingu"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Używaj skanowania"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Skanuj aplikacje służbowe"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index c2eb73a..ea244d8 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Desativar LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Desativa o recurso de áudio Bluetooth de baixo consumo caso o hardware do dispositivo tenha essa opção."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Mostrar a chave do LE Audio nos Detalhes do dispositivo"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Ignorar lista de permissões do áudio Bluetooth de baixo consumo"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Usar o LE Audio por padrão, mesmo que o periférico dele não tenha sido verificado para atender aos critérios da lista de permissões."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivos portáteis de mídia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivos de chamada"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Outros dispositivos"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivos salvos"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associado com a conta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Usado anteriormente com a conta"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"O Bluetooth será ativado para o pareamento"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferências de conexão"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Conectados anteriormente"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escreva nos campos de texto"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorar todos os pressionamentos de botão com a stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Compartilhamento de áudio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Compartilhar áudio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Ligações e alarmes"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Conectar a um stream de LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Streams de áudio por perto"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Streams de áudio"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Conectar a um stream de áudio usando um código QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Data e hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Limpar"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espaço particular"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ocultar apps em uma pasta particular"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloquear usando o bloqueio de tela"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostrar o Espaço particular"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ocultar quando bloqueado"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ocultar o Espaço particular quando bloqueado"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Oculte o Espaço particular na sua lista de apps para que outras pessoas não saibam que ele está no dispositivo"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Acessar o Espaço particular quando oculto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Pesquisar \"Espaço particular\" na barra de pesquisa"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tocar no bloco Espaço particular"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloquear seu Espaço particular"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desativado"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Ativado"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Criar Espaço particular"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Excluir o Espaço particular"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Não foi possível criar um Espaço particular"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"O Espaço particular foi excluído"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Não foi possível excluir o Espaço particular"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Defina um bloqueio de tela"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para usar o Espaço particular, defina um bloqueio de tela neste dispositivo."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Definir bloqueio de tela"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancelar"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancelar"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configurar"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurar o Espaço particular"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Oculte apps particulares em um espaço seguro que só você pode acessar"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Como funciona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Você pode acessar o Espaço particular na parte de baixo da sua lista de apps"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Os apps no Espaço particular ficam protegidos por um bloqueio"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"As notificações de apps no Espaço particular ficam ocultas quando ele está bloqueado"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Os apps do Espaço particular não aparecem na Gestão de permissões, no painel de privacidade e em outras configurações quando esse espaço está bloqueado"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configurando Espaço particular…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"O Espaço particular fica protegido por um bloqueio"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"As informações de uso de apps do Espaço particular ficam ocultas quando ele está bloqueado"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Acessar o Espaço particular da sua lista de apps"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Não foi possível configurar o Espaço particular"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Tente de novo ou volte mais tarde"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Tentar de novo"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Usar bloqueio de tela para desbloquear?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Você pode desbloquear o Espaço particular da mesma maneira que desbloqueia seu dispositivo ou escolher um bloqueio diferente"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usar bloqueio de tela"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Escolher novo bloqueio"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Tudo pronto!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para acessar o Espaço particular, deslize de baixo para cima na tela inicial e role para baixo"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Concluído"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Role a tela para baixo para acessar o Espaço particular"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"É possível adicionar até <xliff:g id="COUNT">%d</xliff:g> digitais"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Você adicionou o número máximo de impressões digitais"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Não é possível adicionar mais impressões digitais"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuar usando apps com a tela dobrada"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Aumenta automaticamente a taxa de atualização de 60 para <xliff:g id="ID_1">%1$s</xliff:g> Hz em alguns conteúdos. Maior uso da bateria."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Aumenta automaticamente a taxa de atualização para <xliff:g id="ID_1">%1$d</xliff:g> Hz para alguns conteúdos. Maior uso da bateria."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forçar taxa de atualização máxima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Maior taxa de atualização para melhoria na resposta tátil e na qualidade das animações. Maior uso da bateria."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Reconhecimento de tela em uso"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Configurações compartilhadas"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editar ponto de acesso"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Adicionar ponto de acesso"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Sem definição"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Não definido"</string>
<string name="apn_name" msgid="6677695784108157953">"Nome"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Usar o botão de acessibilidade para abrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mantenha as teclas de volume pressionadas para abrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Toque três vezes na tela para abrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Tocar três vezes na tela com dois dedos para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Usar gesto para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usar o gesto de acessibilidade"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Para usar esse recurso, toque no botão de acessibilidade <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> na parte inferior da tela.\n\nPara alternar entre os recursos, toque no botão de acessibilidade e o pressione."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para usar esse recurso, toque no botão de acessibilidade na sua tela."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Para usar esse recurso, toque nas duas teclas de volume e as mantenha pressionadas."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para iniciar ou interromper a ampliação, toque três vezes em qualquer lugar da tela."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para iniciar ou interromper a ampliação, toque três vezes em qualquer lugar da tela com dois dedos."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Para usar esse recurso, deslize de baixo para cima na tela com dois dedos.\n\nPara alternar entre os recursos, deslize de baixo para cima com dois dedos, sem soltar."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Para usar esse recurso, deslize de baixo para cima na tela com três dedos.\n\nPara alternar entre os recursos, deslize de baixo para cima com três dedos, sem soltar."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Para usar um recurso de acessibilidade, deslize de baixo para cima na tela com dois dedos.\n\nPara alternar entre recursos, deslize de baixo para cima com dois dedos, sem soltar."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Manter as teclas de volume pressionadas"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"manter as teclas de volume pressionadas"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Toque nas duas teclas de volume e as mantenha pressionadas"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Tocar três vezes na tela com dois dedos"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"tocar três vezes na tela com dois dedos"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Toque na tela {0,number,integer} vezes rapidamente com dois dedos"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tocar na tela três vezes"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tocar na tela três vezes"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Toque na tela {0,number,integer} vezes rapidamente. Esse atalho pode deixar o dispositivo mais lento"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Usar vibração e retorno tátil"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibração do alarme"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibração de mídia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibração do teclado"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibração do toque"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibração das notificações"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Feedback por toque"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Se você limitar as atividades em segundo plano de um app, ele poderá apresentar mau funcionamento"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Como o app não está configurado para otimizar bateria, não é possível restringi-lo.\n\nPara restringir, ative a otimização."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gerenciar uso da bateria"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Permitir o uso em segundo plano"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Ative para receber atualizações em tempo real ou desative para economizar bateria"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sem restrições"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Otimizado"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restrito"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tamanho do texto, letras grandes, fonte grande, texto grande, baixa visão, aumentar texto, ampliador de fonte, aumento de fonte"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"tela ambiente sempre ativada, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiqueta, leitor"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclado, retorno tátil, vibrar,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibração, Não perturbe"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume de mídia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume da transmissão"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Acesso para gerenciar todos os arquivos"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permitir que o app leia, modifique e exclua todos os arquivos deste dispositivo ou de qualquer volume de armazenamento conectado. Se a permissão for concedida, o app poderá acessar arquivos sem nenhum aviso prévio."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Pode acessar todos os arquivos"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificações em tela cheia"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permitir que esse app mostre notificações em tela cheia"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permita que o app mostre notificações que ocupam a tela inteira quando o dispositivo estiver bloqueado. Os apps poderão usar essa permissão para destacar alarmes, ligações recebidas ou outras notificações urgentes."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Verificar atividades no app para detectar phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usar a verificação"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usar a verificação para apps de trabalho"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"A verificação é executada de forma particular e direta em seu dispositivo, analisando as atividades no app para detectar phishing ou outros comportamentos enganosos. Quando algo é detectado, algumas informações do app são enviadas ao Google Play Protect para confirmar a ameaça e alertar usuários do app."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Este é um recurso de segurança protegido. Nenhuma informação pessoal ou do dispositivo será compartilhada com o Google. \n\nPhishing é uma tentativa de roubar credenciais de login ou outras informações pessoais."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index bcb23c1..2c358ce 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Desativar Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Desativa a funcionalidade Bluetooth LE Audio se o dispositivo suportar as capacidades de hardware LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Botão LE Audio – Detalhes do dispositivo"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Contornar lista de autorizações do Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Use o LE Audio por predefinição, mesmo se o cumprimento dos critérios da lista de autorizações pelo periférico com LE Audio não tiver sido validado."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivos multimédia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivos de chamada"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Outros dispositivos"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivos guardados"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associado à conta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Usado anteriormente com a conta"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"O Bluetooth será ativado para a sincronização"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferências de ligação"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Ligados anteriormente"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escrever em campos de texto"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorar todos os botões premidos com a caneta stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Caneta stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Partilha de áudio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Partilhar áudio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Chamadas e alarmes"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Ligue-se a uma stream de LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Streams de áudio próximas"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Streams de áudio"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Ligue-se a uma stream de áudio através do código QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Data e hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Limpar"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espaço privado"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Oculte as apps numa pasta privada"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloquear com o bloqueio de ecrã"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostrar espaço privado"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ocultar quando bloqueado"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ocultar espaço privado quando bloqueado"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Para não saberem que o espaço privado está no seu dispositivo, oculte-o da lista de apps"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Aceda ao espaço privado quando estiver oculto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Pesquise \"espaço privado\" na barra de pesquisa"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Toque no mosaico do espaço privado"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloqueie o seu espaço privado"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desativado"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Ativado"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Criar espaço privado"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Eliminar espaço privado"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Não foi possível criar o espaço privado"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Espaço privado eliminado com êxito"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Não foi possível eliminar o espaço privado"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Defina um bloqueio de ecrã"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para usar o espaço privado, defina bloqueio de ecrã no disp."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Definir bloqueio de ecrã"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancelar"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancelar"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configurar"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurar espaço privado"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Oculte as apps privadas num espaço seguro que pode ser acedido apenas por si"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Como funciona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Pode aceder ao espaço privado a partir da parte inferior da sua lista de apps"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"As apps no espaço privado são protegidas por um bloqueio"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Quando o espaço privado estiver bloqueado, as notificações das respetivas apps são ocultadas"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"As apps do espaço privado não vão aparecer no Gestor de autorizações, no painel de privacidade nem noutras definições quando o espaço privado estiver bloqueado"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"A configurar o espaço privado…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"O espaço privado está protegido por um bloqueio"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Quando o espaço privado estiver bloqueado, as informações de utilização das respetivas apps são ocultadas"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Aceda ao espaço privado a partir da sua lista de apps"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Não foi possível configurar o espaço privado"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Tente novamente agora ou volte mais tarde"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Tentar novamente"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Usar bloqueio de ecrã para desbloquear?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Pode desbloquear o espaço privado da mesma forma que desbloqueia o seu dispositivo ou escolher um bloqueio diferente"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usar bloqueio de ecrã"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Escolher novo bloqueio"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Tudo pronto!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para aceder ao espaço privado, deslize rapidamente para cima a partir da parte inferior do ecrã principal e, em seguida, desloque o ecrã para baixo"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Concluir"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Desloque o ecrã para baixo para aceder ao espaço privado"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Pode adicionar até <xliff:g id="COUNT">%d</xliff:g> impressões digitais"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Adicionou o número máximo de impressões digitais"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Não é possível adicionar mais impressões digitais"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuar a usar apps ao dobrar"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Aumenta automaticamente a taxa de atualização de 60 para <xliff:g id="ID_1">%1$s</xliff:g> Hz para algum conteúdo. Aumenta a utilização da bateria."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Aumenta automaticamente a taxa de atualização para <xliff:g id="ID_1">%1$d</xliff:g> Hz para algum conteúdo. Aumenta a utilização da bateria."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forçar taxa de atualização de pico"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"A taxa de atualização mais elevada para uma capacidade de resposta tátil e uma qualidade de animação melhoradas. Aumenta a utilização da bateria."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atenção ao ecrã"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Definições coletivas"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editar ponto de acesso"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Adicione o ponto de acesso"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Não definido"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Não definido"</string>
<string name="apn_name" msgid="6677695784108157953">"Nome"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Use o botão de acessibilidade para abrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mantenha premidas as teclas de volume para abrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Toque três vezes no ecrã para abrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Toque três vezes no ecrã com dois dedos para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Utilize gestos para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usar gesto de acessibilidade"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Para usar esta funcionalidade, toque no botão Acessibilidade <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> na parte inferior do seu ecrã.\n\nPara alternar entre funcionalidades, toque sem soltar no botão Acessibilidade."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para usar esta funcionalidade, toque no botão Acessibilidade no seu ecrã."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Para usar esta funcionalidade, prima sem soltar as teclas de volume."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para iniciar e parar a ampliação, toque três vezes em qualquer parte do ecrã."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para iniciar e parar a ampliação, toque três vezes em qualquer parte do ecrã com dois dedos."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Para usar esta funcionalidade, deslize rapidamente com dois dedos para cima a partir da parte inferior do ecrã.\n\nPara alternar entre funcionalidades, deslize rapidamente com dois dedos para cima sem soltar."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Para usar esta funcionalidade, deslize rapidamente com três dedos para cima a partir da parte inferior do ecrã.\n\nPara alternar entre funcionalidades, deslize rapidamente com três dedos para cima sem soltar."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Para utilizar uma funcionalidade de acessibilidade, deslize rapidamente com dois dedos para cima a partir da parte inferior do ecrã.\n\nPara alternar entre funcionalidades, deslize rapidamente com dois dedos para cima sem soltar."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Manter premidas as teclas de volume"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"mantenha premidas as teclas de volume"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Prima sem soltar ambas as teclas de volume"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Toque três vezes no ecrã com dois dedos"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"toque três vezes no ecrã com dois dedos"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Toque rapidamente {0,number,integer} vezes no ecrã com dois dedos"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Toque três vezes no ecrã"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"toque três vezes no ecrã"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Toque rapidamente {0,number,integer} vezes no ecrã. Este atalho pode tornar o dispositivo mais lento"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Usar vibração e funcionalidade tátil"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibração do alarme"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibração de multimédia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibração do teclado"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibração do toque"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibração de notificações"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Respostas por toque"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Se limitar a atividade em segundo plano de uma aplicação, esta pode apresentar um comportamento anormal."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"A app não está def. p/ otimizar a bateria, não a pode restringir.\n\nP/ restringir a app, ative a otimiz. da bateria."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Faça a gestão da utilização da bateria"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Permita a utilização em segundo plano"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Ative para atualizações em tempo real, desative para poupar bateria"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sem restrições"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Otimizada"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restrita"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tamanho do texto, formato·grande, tipo de letra grande, texto grande, visão reduzida, aumentar o texto, aumentar o tipo de letra, aumento do tipo de letra"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ecrã ambiente sempre ativado, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, etiqueta, leitor"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclado, funcionalidade tátil, vibrar"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibração, Não incomodar"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume de multimédia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume de transmissão"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Permitir acesso para gerir todos os ficheiros"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permita que esta app leia, modifique e elimine todos os ficheiros neste dispositivo ou em qualquer volume de armazenamento ligado. Se a autorização for concedida, a app poderá aceder aos ficheiros sem o seu conhecimento explícito."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Pode aceder a todos os ficheiros"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificações em ecrã inteiro"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permitir notificações desta app em ecrã inteiro"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permita que esta app mostre notificações que ocupam o ecrã inteiro quando o dispositivo está bloqueado. As apps podem usá-las para destacar alarmes, chamadas recebidas ou outras notificações urgentes."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Verifique a atividade de apps para detetar phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usar análise"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usar análise para apps de trabalho"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"A análise é executada em privado diretamente no seu dispositivo, verificando a atividade de apps para detetar phishing ou outro comportamento enganador. Se for detetado algum destes comportamentos, algumas informações das apps são enviadas para o Google Play Protect de modo a confirmar a ameaça e avisar os utilizadores das apps."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Esta é uma funcionalidade de segurança protegida. Não são partilhadas informações pessoais nem do dispositivo com a Google. \n\nO phishing é uma tentativa de roubar credenciais de início de sessão ou outras informações pessoais."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index c2eb73a..ea244d8 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Desativar LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Desativa o recurso de áudio Bluetooth de baixo consumo caso o hardware do dispositivo tenha essa opção."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Mostrar a chave do LE Audio nos Detalhes do dispositivo"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Ignorar lista de permissões do áudio Bluetooth de baixo consumo"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Usar o LE Audio por padrão, mesmo que o periférico dele não tenha sido verificado para atender aos critérios da lista de permissões."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispositivos portáteis de mídia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispositivos de chamada"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Outros dispositivos"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispositivos salvos"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Associado com a conta"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Usado anteriormente com a conta"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"O Bluetooth será ativado para o pareamento"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferências de conexão"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Conectados anteriormente"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Escreva nos campos de texto"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorar todos os pressionamentos de botão com a stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Compartilhamento de áudio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Compartilhar áudio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Ligações e alarmes"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Conectar a um stream de LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Streams de áudio por perto"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Streams de áudio"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Conectar a um stream de áudio usando um código QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Data e hora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Limpar"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Espaço particular"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ocultar apps em uma pasta particular"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Desbloquear usando o bloqueio de tela"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Mostrar o Espaço particular"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ocultar quando bloqueado"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ocultar o Espaço particular quando bloqueado"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Oculte o Espaço particular na sua lista de apps para que outras pessoas não saibam que ele está no dispositivo"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Acessar o Espaço particular quando oculto"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Pesquisar \"Espaço particular\" na barra de pesquisa"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tocar no bloco Espaço particular"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Desbloquear seu Espaço particular"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Desativado"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Ativado"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistema"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Criar Espaço particular"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Excluir o Espaço particular"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Não foi possível criar um Espaço particular"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"O Espaço particular foi excluído"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Não foi possível excluir o Espaço particular"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Defina um bloqueio de tela"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para usar o Espaço particular, defina um bloqueio de tela neste dispositivo."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Definir bloqueio de tela"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Cancelar"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Cancelar"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configurar"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurar o Espaço particular"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Oculte apps particulares em um espaço seguro que só você pode acessar"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Como funciona"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Você pode acessar o Espaço particular na parte de baixo da sua lista de apps"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Os apps no Espaço particular ficam protegidos por um bloqueio"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"As notificações de apps no Espaço particular ficam ocultas quando ele está bloqueado"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Os apps do Espaço particular não aparecem na Gestão de permissões, no painel de privacidade e em outras configurações quando esse espaço está bloqueado"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Configurando Espaço particular…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"O Espaço particular fica protegido por um bloqueio"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"As informações de uso de apps do Espaço particular ficam ocultas quando ele está bloqueado"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Acessar o Espaço particular da sua lista de apps"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Não foi possível configurar o Espaço particular"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Tente de novo ou volte mais tarde"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Tentar de novo"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Usar bloqueio de tela para desbloquear?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Você pode desbloquear o Espaço particular da mesma maneira que desbloqueia seu dispositivo ou escolher um bloqueio diferente"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Usar bloqueio de tela"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Escolher novo bloqueio"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Tudo pronto!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para acessar o Espaço particular, deslize de baixo para cima na tela inicial e role para baixo"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Concluído"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Role a tela para baixo para acessar o Espaço particular"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"É possível adicionar até <xliff:g id="COUNT">%d</xliff:g> digitais"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Você adicionou o número máximo de impressões digitais"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Não é possível adicionar mais impressões digitais"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuar usando apps com a tela dobrada"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Aumenta automaticamente a taxa de atualização de 60 para <xliff:g id="ID_1">%1$s</xliff:g> Hz em alguns conteúdos. Maior uso da bateria."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Aumenta automaticamente a taxa de atualização para <xliff:g id="ID_1">%1$d</xliff:g> Hz para alguns conteúdos. Maior uso da bateria."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forçar taxa de atualização máxima"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Maior taxa de atualização para melhoria na resposta tátil e na qualidade das animações. Maior uso da bateria."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Reconhecimento de tela em uso"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Configurações compartilhadas"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Editar ponto de acesso"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Adicionar ponto de acesso"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Sem definição"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Não definido"</string>
<string name="apn_name" msgid="6677695784108157953">"Nome"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Usar o botão de acessibilidade para abrir"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mantenha as teclas de volume pressionadas para abrir"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Toque três vezes na tela para abrir"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Tocar três vezes na tela com dois dedos para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Usar gesto para abrir"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Usar o gesto de acessibilidade"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Para usar esse recurso, toque no botão de acessibilidade <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> na parte inferior da tela.\n\nPara alternar entre os recursos, toque no botão de acessibilidade e o pressione."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para usar esse recurso, toque no botão de acessibilidade na sua tela."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Para usar esse recurso, toque nas duas teclas de volume e as mantenha pressionadas."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para iniciar ou interromper a ampliação, toque três vezes em qualquer lugar da tela."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para iniciar ou interromper a ampliação, toque três vezes em qualquer lugar da tela com dois dedos."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Para usar esse recurso, deslize de baixo para cima na tela com dois dedos.\n\nPara alternar entre os recursos, deslize de baixo para cima com dois dedos, sem soltar."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Para usar esse recurso, deslize de baixo para cima na tela com três dedos.\n\nPara alternar entre os recursos, deslize de baixo para cima com três dedos, sem soltar."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Para usar um recurso de acessibilidade, deslize de baixo para cima na tela com dois dedos.\n\nPara alternar entre recursos, deslize de baixo para cima com dois dedos, sem soltar."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Manter as teclas de volume pressionadas"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"manter as teclas de volume pressionadas"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Toque nas duas teclas de volume e as mantenha pressionadas"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Tocar três vezes na tela com dois dedos"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"tocar três vezes na tela com dois dedos"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Toque na tela {0,number,integer} vezes rapidamente com dois dedos"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tocar na tela três vezes"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tocar na tela três vezes"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Toque na tela {0,number,integer} vezes rapidamente. Esse atalho pode deixar o dispositivo mais lento"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Usar vibração e retorno tátil"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibração do alarme"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibração de mídia"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibração do teclado"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibração do toque"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibração das notificações"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Feedback por toque"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Se você limitar as atividades em segundo plano de um app, ele poderá apresentar mau funcionamento"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Como o app não está configurado para otimizar bateria, não é possível restringi-lo.\n\nPara restringir, ative a otimização."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gerenciar uso da bateria"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Permitir o uso em segundo plano"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Ative para receber atualizações em tempo real ou desative para economizar bateria"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Sem restrições"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Otimizado"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Restrito"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"tamanho do texto, letras grandes, fonte grande, texto grande, baixa visão, aumentar texto, ampliador de fonte, aumento de fonte"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"tela ambiente sempre ativada, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiqueta, leitor"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"teclado, retorno tátil, vibrar,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, vibração, Não perturbe"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume de mídia"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume da transmissão"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Acesso para gerenciar todos os arquivos"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permitir que o app leia, modifique e exclua todos os arquivos deste dispositivo ou de qualquer volume de armazenamento conectado. Se a permissão for concedida, o app poderá acessar arquivos sem nenhum aviso prévio."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Pode acessar todos os arquivos"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificações em tela cheia"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permitir que esse app mostre notificações em tela cheia"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permita que o app mostre notificações que ocupam a tela inteira quando o dispositivo estiver bloqueado. Os apps poderão usar essa permissão para destacar alarmes, ligações recebidas ou outras notificações urgentes."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Verificar atividades no app para detectar phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Usar a verificação"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Usar a verificação para apps de trabalho"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"A verificação é executada de forma particular e direta em seu dispositivo, analisando as atividades no app para detectar phishing ou outros comportamentos enganosos. Quando algo é detectado, algumas informações do app são enviadas ao Google Play Protect para confirmar a ameaça e alertar usuários do app."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Este é um recurso de segurança protegido. Nenhuma informação pessoal ou do dispositivo será compartilhada com o Google. \n\nPhishing é uma tentativa de roubar credenciais de login ou outras informações pessoais."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 62e0015..e1430b4 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Dezactivează Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Dezactivează funcția Bluetooth LE Audio dacă dispozitivul acceptă capacitățile de hardware LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Comutator LE Audio în Detalii dispozitiv"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Omite lista cu acces permis Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Folosește în mod prestabilit LE Audio chiar dacă dispozitivul periferic LE Audio nu a fost confirmat ca respectând criteriile Allowlist."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Dispozitive media"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Dispozitive de apel"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Alte dispozitive"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Dispozitive salvate"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Asociate cu contul"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Folosit anterior cu contul"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth se va activa pentru asociere"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferințe pentru conexiune"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Conectat anterior"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Scrie în câmpurile text"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignoră toate apăsările de butoane ale creionului"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Creion"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Trimiterea audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Trimite audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Apeluri și alarme"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Data și ora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Șterge"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Spațiu privat"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ascunde aplicații într-un dosar privat"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Deblochează folosind blocarea ecranului"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Afișează Spațiul privat"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ascunde când este blocat"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ascunde Spațiul privat când este blocat"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Pentru ca alții să nu știe că ai un Spațiu privat pe dispozitiv, ascunde-l din lista de aplicații"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Accesează Spațiul privat când este ascuns"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Caută „Spațiu privat” în bara de căutare"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Atinge cardul Spațiu privat"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Deblochează Spațiul privat"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Dezactivat"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Activat"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Creează un Spațiu privat"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Șterge Spațiul privat"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Spațiul privat nu a putut fi creat"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Spațiul privat a fost șters"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Spațiul privat nu a putut fi șters"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Setează o blocare a ecranului"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Ca să folosești Spațiul privat, setează blocarea ecranului."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Setează blocarea ecranului"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Anulează"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Anulează"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Configurează"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Configurează Spațiul privat"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Ascunde aplicațiile private într-un loc sigur la care numai tu ai acces"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Cum funcționează"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Poți accesa Spațiul privat din partea de jos a listei de aplicații"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplicațiile din Spațiul privat sunt protejate de o blocare"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Notificările de la aplicațiile din Spațiul privat sunt ascunse atunci când acesta este blocat"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplicațiile din Spațiul privat nu vor apărea în managerul de permisiuni, în tabloul de bord de confidențialitate și în alte setări atunci când Spațiul privat este blocat"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Se configurează Spațiul privat…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Spațiul privat este protejat de o blocare"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Informațiile despre utilizarea aplicațiilor din Spațiul privat sunt ascunse atunci când este blocat"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Accesează Spațiul privat din lista de aplicații"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Nu s-a putut configura Spațiul privat"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Încearcă din nou acum sau revino mai târziu"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Încearcă din nou"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Folosești blocarea ecranului pentru deblocare?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Poți să deblochezi Spațiul privat la fel cum deblochezi dispozitivul sau să alegi altă blocare"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Folosește blocarea ecranului"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Alege o nouă blocare"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Gata!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Pentru a accesa Spațiul privat, glisează în sus din partea de jos a ecranului de pornire, apoi derulează în jos"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Gata"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Derulează în jos pentru a accesa Spațiul privat"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Poți să adaugi până la <xliff:g id="COUNT">%d</xliff:g> amprente"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Ai adăugat numărul maxim de amprente digitale"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nu se mai pot adăuga amprente digitale"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Continuă să folosești aplicațiile după pliere"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Ridică automat rata de actualizare de la 60 la <xliff:g id="ID_1">%1$s</xliff:g> Hz pentru unele tipuri de conținut. Mărește utilizarea bateriei."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Crește automat rata de actualizare până la <xliff:g id="ID_1">%1$d</xliff:g> Hz pentru anumite tipuri de conținut. Utilizarea bateriei crește."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Forțează rata maximă de actualizare"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Cea mai ridicată rată de actualizare, pentru receptivitate la atingere îmbunătățită și animații de calitate. Mărește utilizarea bateriei."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atenție la ecran"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Setări comune"</string>
<string name="apn_settings" msgid="4295467389400441299">"Nume APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Modifică punctul de acces"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nesetat(ă)"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nesetată"</string>
<string name="apn_name" msgid="6677695784108157953">"Nume"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Folosește butonul de accesibilitate pentru a deschide"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Apasă lung butoanele de volum pentru a deschide"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Atinge ecranul de trei ori ca să deschizi"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Atinge de trei ori ecranul cu două degete pentru a deschide"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Folosește un gest pentru a deschide"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Folosește gestul de accesibilitate"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Ca să folosești această funcție, atinge butonul de accesibilitate <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> din partea de jos a ecranului.\n\nCa să comuți între funcții, atinge lung butonul de accesibilitate."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Ca să folosești această funcție, atinge butonul de accesibilitate de pe ecran."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Ca să folosești această funcție, apasă lung ambele butoane de volum."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Pentru a porni și a opri mărirea, atinge de trei ori oriunde pe ecran."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Pentru a porni și a opri mărirea, atinge de trei ori oriunde pe ecran cu două degete."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Ca să folosești această funcție, glisează în sus cu două degete din partea de jos a ecranului.\n\nCa să comuți între funcții, glisează în sus cu două degete și ține apăsat."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Ca să folosești această funcție, glisează în sus cu trei degete din partea de jos a ecranului.\n\nCa să comuți între funcții, glisează în sus cu trei degete și ține apăsat."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Ca să folosești o funcție de accesibilitate, glisează în sus cu două degete din partea de jos a ecranului.\n\nCa să comuți între funcții, glisează în sus cu două degete și ține apăsat."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Apasă lung butoanele de volum"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"apasă lung butoanele de volum"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Apasă lung ambele butoane de volum"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Atinge de trei ori ecranul cu două degete"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"atinge de trei ori ecranul cu două degete"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Atinge rapid ecranul de {0,number,integer} ori cu două degete"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Atinge ecranul de trei ori"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"atinge ecranul de trei ori"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Atinge rapid ecranul de {0,number,integer} ori. Această comandă rapidă poate încetini funcționarea dispozitivului"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Folosește vibrațiile și feedbackul tactil"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibrație pentru alarmă"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibrație pentru conținut media"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibrația tastaturii"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibrațiile soneriei"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibrații la notificare"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Feedback la atingere"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Dacă limitezi activitatea de fundal pentru o aplicație, aceasta se poate comporta necorespunzător"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Aplicația nu optimizează bateria, deci nu o poți restricționa.\n\nPentru a o restricționa, activează optimizarea bateriei."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Gestionează utilizarea bateriei"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Fără restricții"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizată"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Limitată"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"dimensiunea textului, caractere mari, font mare, text mare, vedere slabă, mărește textul, instrument de mărire a fontului, mărirea fontului"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"afișaj ambiental activat permanent, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etichetă, cititor"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastatură, feedback tactil, vibrație"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volum, vibrații, Nu deranja"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volum media"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volumul proiectării"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Permite gestionarea fișierelor"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Permite aplicației să citească, să modifice și să șteargă toate fișierele de pe dispozitiv sau din spațiile de stocare conectate. Dacă îi permiți, aplicația poate accesa fișierele fără consimțământul tău explicit."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Poate accesa toate fișierele"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Notificări pe ecran complet"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Permite notificările pe ecran complet de la această aplicație"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Permite aplicației să afișeze notificări care ocupă întregul ecran când dispozitivul e blocat. Aplicațiile le pot folosi pentru a evidenția alarme, apeluri primite sau alte informații urgente."</string>
@@ -4885,6 +4946,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Verifică activitatea în aplicații pentru phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Folosește scanarea"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Folosește scanarea în aplicațiile pentru lucru"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Scanarea rulează în mod privat direct pe dispozitiv, verificând activitatea în aplicații pentru phishing sau alte comportamente înșelătoare. Dacă sunt detectate astfel de comportamente, unele informații din aplicații sunt trimise la Google Play Protect pentru a confirma amenințarea și a avertiza utilizatorii aplicațiilor."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Aceasta este o funcție de siguranță protejată. Nu sunt trimise la Google informații de pe dispozitiv sau informații cu caracter personal. \n\nPhishingul este o încercare de a fura date de conectare sau alte informații cu caracter personal."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 5934dd2..59ea4da 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Отключить Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Отключить Bluetooth LE Audio, если доступны аппаратные возможности"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Переключатель LE Audio в сведениях об устройстве"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Обходить белый список Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Использовать LE Audio по умолчанию, даже если периферийное устройство LE Audio не соответствует критериям белого списка"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Медиаустройства"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Устройства для совершения звонков"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Другие устройства"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Сохраненные устройства"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Связано с аккаунтом"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Уже использовались с аккаунтом"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Будет включен Bluetooth"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Настройки подключения"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Ранее подключенные устройства"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Разрешить рукописный ввод в текстовых полях"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Игнорировать нажатия кнопок стилусом"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Стилус"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Передача аудио"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Передавать аудио"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Звонки и будильники"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Дата и время"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси-сервер"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Очистить"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Личное пространство"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Папка, в которую можно прятать приложения"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Открыть, используя способ разблокировки экрана"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Показать личное пространство"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Скрывать, когда доступ заблокирован"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Скрыть личное пространство, если доступ к нему заблокирован"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Вы можете скрыть личное пространство из списка приложений"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Доступ к личному пространству, когда оно скрыто"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Введите запрос \"Личное пространство\" в строку поиска"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Выберите параметр \"Личное пространство\""</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Разблокируйте личное пространство"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Отключено"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Включено"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Система"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Создать личное пространство"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Удалить личное пространство"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Не удалось создать личное пространство."</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Личное пространство удалено."</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Не получилось удалить личное пространство."</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Настройте блокировку экрана"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Она нужна, чтобы использовать личное пространство."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Настроить"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Отмена"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Отмена"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Настройка"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Настройки личного пространства"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Если вы хотите, чтобы некоторые приложения были видны только вам, добавьте их в личное пространство"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Как это работает"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Вы можете перейти в личное пространство в нижней части списка приложений"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Доступ к приложениям в личном пространстве можно заблокировать"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Когда доступ к личному пространству заблокирован, уведомления из добавленных в него приложений скрываются."</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Когда доступ к личному пространству заблокирован, приложения в нем не видны в меню и панели управления разрешениями, а также в других настройках."</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Настройка личного пространства…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Доступ к личному пространству можно заблокировать"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Когда личное пространство заблокировано, информация об использовании приложений в нем скрыта"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Открывайте личное пространство из списка приложений"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Не удалось создать личное пространство"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Повторите попытку или вернитесь позже."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Повторить"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Использовать разблокировку экрана?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Вы можете использовать тот же способ разблокировки, который используется для экрана, или выбрать другой."</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Использовать блокировку экрана"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Выбрать другой способ"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Готово!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Чтобы перейти в личное пространство, проведите по главному экрану снизу вверх и прокрутите страницу вниз."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Готово"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Чтобы перейти в личное пространство, прокрутите экран вниз."</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Максимальное количество отпечатков пальца, которые можно добавить: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Вы уже добавили максимальное количество отпечатков"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Больше нельзя добавить отпечатки пальцев"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Продолжать использовать приложения при складывании"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Плавный экран"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Автоматически изменять частоту обновления экрана с 60 до <xliff:g id="ID_1">%1$s</xliff:g> Гц для некоторых типов контента. При этом батарея будет разряжаться быстрее."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Автоматически увеличивать частоту обновления экрана до <xliff:g id="ID_1">%1$d</xliff:g> Гц для некоторых типов контента. При этом батарея будет разряжаться быстрее."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Использовать пиковую частоту обновления"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Высокая частота обновления экрана улучшает ответ на касания и делает анимацию более плавной. При этом батарея разряжается быстрее."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Адаптивный спящий режим"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Совместные настройки"</string>
<string name="apn_settings" msgid="4295467389400441299">"Точки доступа"</string>
<string name="apn_edit" msgid="2003683641840248741">"Изменить точку доступа"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Не задано"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Не указано"</string>
<string name="apn_name" msgid="6677695784108157953">"Название"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Используйте кнопку специальных возможностей"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Для запуска удерживайте кнопки громкости"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Для запуска нажмите трижды на экран"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Чтобы открыть, трижды нажмите на экран двумя пальцами"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Используйте жесты"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Используйте жест специальных возможностей"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Чтобы включить эту функцию, нажмите кнопку специальных возможностей <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> в нижней части экрана.\n\nДля переключения между функциями нажмите и удерживайте эту кнопку."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Чтобы включить эту функцию, нажмите кнопку специальных возможностей."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Чтобы включить эту функцию, нажмите и удерживайте обе кнопки регулировки громкости."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Чтобы включить или отключить увеличение, трижды нажмите на любую область экрана."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Чтобы включить или отключить увеличение, трижды нажмите на любую область экрана двумя пальцами."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Чтобы включить эту функцию, проведите вверх от нижнего края экрана двумя пальцами.\n\nДля переключения между функциями проведите по экрану снизу вверх двумя пальцами и задержите их."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Чтобы включить эту функцию, проведите вверх от нижнего края экрана тремя пальцами.\n\nДля переключения между функциями проведите по экрану снизу вверх тремя пальцами и задержите их."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Чтобы воспользоваться специальной возможностью, проведите вверх от нижнего края экрана двумя пальцами.\n\nДля переключения между функциями проведите по экрану снизу вверх двумя пальцами и задержите их."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Удерживать кнопки регулировки громкости"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"удерживание кнопок регулировки громкости"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Нажмите и удерживайте обе кнопки регулировки громкости"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Тройное нажатие двумя пальцами"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"тройное нажатие двумя пальцами"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Быстро нажмите на экран двумя пальцами {0,number,integer} раза"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Тройное нажатие на экран"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"тройное нажатие на экран"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Быстро коснитесь экрана {0,number,integer} раза (этот жест может замедлить работу устройства)."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Вибрация и виброотклик"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Вибрация при срабатывании будильника"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Вибрация при воспроизведении медиаконтента"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Вибрация клавиатуры"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Вибрация при звонке"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Вибрация при уведомлении"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Вибрация при касании"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Это действие может привести к неправильной работе приложения."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Оптимизация расхода заряда батареи для этого приложения не настроена.\n\nВключите ее, чтобы установить ограничения."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Управление расходом заряда"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Без ограничений"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"С оптимизацией"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ограничено"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"размер текста, крупный шрифт, большой шрифт, большой текст, слабое зрение, увеличить текст, увеличить шрифт, увеличение шрифта"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"информация на заблокированном экране, автоматическое включение экрана"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, метка, считыватель"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"клавиатура, тактильная обратная связь, вибрация, вибрировать"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Громкость, вибрация, режим \"Не беспокоить\""</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Музыка, видео, игры"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Громкость трансляции"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Разрешить доступ к управлению всеми файлами"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Приложение сможет читать, изменять и удалять все файлы на этом устройстве и любых подключенных носителях. Доступ к файлам будет осуществляться без дополнительного уведомления."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Приложения, имеющие доступ ко всем файлам"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Уведомления в полноэкранном режиме"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Разрешить уведомления в полноэкранном режиме от этого приложения"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Разрешить этому приложению показывать уведомления в полноэкранном режиме, когда устройство заблокировано. Так приложение сможет сообщать о будильниках, входящих вызовах и других срочных уведомлениях."</string>
@@ -4882,16 +4943,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Название устройства доступно установленным приложениям. Его также могут видеть другие пользователи, когда вы подключаетесь к устройствам Bluetooth и сетям Wi-Fi или настраиваете точку доступа Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Грамматический род"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Выберите грамматический род"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Сканировать на наличие мошеннических приложений"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Проверять историю действий в приложении на фишинг"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Сканировать"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Сканировать рабочие приложения"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 712226f..65f356f 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"බ්ලූටූත් LE ශ්රව්ය අබල කරන්න"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"උපාංගය LE ශ්රව්ය දෘඨාංග හැකියා වෙත සහාය දක්වන්නේ නම් බ්ලූටූත් LE ශ්රව්ය විශේෂාංගය අබල කරයි."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"උපාංග විස්තරවල LE ශ්රව්ය ටොගල පෙන්වන්න"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"බ්ලූටූත් LE ශ්රව්ය ඉඩ දුන් ලැයිස්තුව මඟහරින්න"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ඉඩ දුන් ලැයිස්තුවේ නිර්ණායක සපුරාලීමට LE ශ්රව්ය පර්යන්තය සත්යාපනය කර නොමැති වුවත් පෙරනිමියෙන් LE ශ්රව්ය භාවිතා කරන්න."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"මාධ්ය උපාංග"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"ඇමතුම් උපාංග"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"වෙනත් උපාංග"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"සුරැකි උපාංග"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ගිණුම සමග සම්බන්ධයි"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ගිණුම සමග කලින් භාවිතා කරන ලදි"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"යුගල කිරීමට බ්ලූටූත් ක්රියාත්මක කරනු ඇත"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"සම්බන්ධතා මනාප"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"පෙර සම්බන්ධිත"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"පෙළ ක්ෂේත්රවල ලියන්න"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"සියලු පන්හිඳ බොත්තම් එබීම නොසලකා හරින්න"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"පන්හිඳ"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ශ්රව්ය බෙදා ගැනීම"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ශ්රව්ය බෙදා ගන්න"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"ඇමතුම් සහ එලාම්"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"දිනය සහ වේලාව"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"නියුතු"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"හිස් කරන්න"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"පෞද්ගලික ඉඩ"</string>
<string name="private_space_summary" msgid="8237652417163408001">"පෞද්ගලික ෆෝල්ඩරයක යෙදුම් සඟවන්න"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"තිර අගුල භාවිතයෙන් අගුළු හරින්න"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"පෞද්ගලික ඉඩ පෙන්වන්න"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"අගුළු දැමූ විට සඟවන්න"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"අගුළු දමා ඇති විට පෞද්ගලික අවකාශය සඟවන්න"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"ඔබේ උපාංගයෙහි පෞද්ගලික අවකාශය ඇති බව වෙනත් පුද්ගලයින් දැන ගැනීම නැවැත්වීමට, ඔබට එය ඔබේ යෙදුම් ලැයිස්තුවෙන් සැඟවිය හැක"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"සැඟවුණු විට පෞද්ගලික අවකාශයට ප්රවේශ වන්න"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"සෙවීම් තීරුවේ \'පෞද්ගලික අවකාශය\' සඳහා සොයන්න"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"පෞද්ගලික අවකාශයේ ටයිලය තට්ටු කරන්න"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ඔබේ පෞද්ගලික අවකාශය අගුළු හරින්න"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ක්රියාවිරහිතයි"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ක්රියාත්මකයි"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"පද්ධතිය"</string>
<string name="private_space_create_title" msgid="47273568884806726">"පෞද්ගලික ඉඩ තනන්න"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"පෞද්ගලික ඉඩ මකන්න"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"පෞද්ගලික ඉඩ තැනීම කළ නොහැක"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"පෞද්ගලික ඉඩ සාර්ථකව මකා ඇත"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"පෞද්ගලික ඉඩ මැකීමට නොහැකි විය"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"තිර අගුලක් සකසන්න"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"පෞද්ගලික අවකාශය භාවිතා කිරීමට, මෙම උපාංගයේ තිර අගුලක් සකසන්න."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"තිර අගුල සකසන්න"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"අවලංගු කරන්න"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"අවලංගු කරන්න"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"පිහිටුවන්න"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"පෞද්ගලික අවකාශය පිහිටුවන්න"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ඔබට පමණක් ප්රවේශ විය හැකි සුරක්ෂිත ඉඩක පෞද්ගලික යෙදුම් සඟවන්න"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"එය ක්රියා කරන ආකාරය"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"ඔබට ඔබේ යෙදුම් ලැයිස්තුවේ පහළින් පෞද්ගලික අවකාශය වෙත ප්රවේශ විය හැක"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"පෞද්ගලික අවකාශයේ යෙදුම් අගුලකින් ආරක්ෂා කර ඇත"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"පෞද්ගලික අවකාශය තුළ යෙදුම්වලින් ලැබෙන දැනුම්දීම් එය අගුළු දමා ඇති විට සඟවනු ලැබේ"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"පෞද්ගලික අවකාශය අගුළු දමා ඇති විට අවසර කළමනාකරු, පෞද්ගලිකත්ව උපකරණ පුවරුව, සහ වෙනත් සැකසීම් තුළ පෞද්ගලික අවකාශ යෙදුම් දිස් නොවනු ඇත"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"පෞද්ගලික අවකාශය පිහිටුවමින්…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"පෞද්ගලික අවකාශය අගුලකින් ආරක්ෂා කර ඇත"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"පෞද්ගලික අවකාශ යෙදුම් සඳහා භාවිත තොරතුරු එය අගුළු දමා ඇති විට සඟවා ඇත"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ඔබේ යෙදුම් ලැයිස්තුවෙන් පෞද්ගලික අවකාශය වෙත ප්රවේශ වන්න"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"පෞද්ගලික අවකාශය පිහිටුවීමට නොහැකි විය"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"දැන් නැවත උත්සාහ කරන්න, නැතහොත් පසුව ආපසු එන්න"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"නැවත උත්සාහ කරන්න"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"අගුළු හැරීමට තිර අගුල භාවිත කරන්න ද?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"ඔබට ඔබේ උපාංගය අගුළු හරින ආකාරයටම පෞද්ගලික අවකාශය අගුළු ඇරීමට හෝ වෙනත් අගුලක් තෝරා ගැනීමට හැක"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"තිර අගුල භාවිතා කරන්න"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"නව අගුලක් තෝරා ගන්න"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"සියල්ල සූදානම්!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"පෞද්ගලික අවකාශය වෙත ප්රවේශ වීමට, ඔබේ මුල් තිරයේ පහළ සිට ඉහළට ස්වයිප් කර, පසුව පහළට අනුචලනය කරන්න"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"නිමයි"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"පෞද්ගලික අවකාශයට ප්රවේශ වීමට පහළට අනුචලනය කරන්න"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"ඔබට ඇඟිලි සලකුණු <xliff:g id="COUNT">%d</xliff:g> දක්වා එකතු කළ හැකිය"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"ඔබ ඇඟිලි සලකුණු උපරිම සංඛ්යාව එක් කර ඇත"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"තවත් ඇඟිලි සලකුණු එක් කළ නොහැකිය"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"නැවීම මත යෙදුම් භාවිතය දිගටම කරගෙන යන්න"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"සුමට සංදර්ශකය"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"සමහර අන්තර්ගත සඳහා නැවුම් කිරීමේ අනුපාතය 60 සිට <xliff:g id="ID_1">%1$s</xliff:g> Hz දක්වා ස්වයංක්රීයව ඉහළ නංවයි. බැටරි භාවිතය වැඩි කරයි."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"සමහර අන්තර්ගතය සඳහා නැවුම් කිරීමේ අනුපාතය <xliff:g id="ID_1">%1$d</xliff:g> දක්වා ස්වයංක්රීයව ඉහළ නංවයි. බැටරි භාවිතය වැඩි කරයි."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"කාර්යබහුල යළි නැවුම් කිරීමේ අනුපාතය බල කරන්න"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"වැඩි දියුණු කළ ස්පර්ශ ප්රතිචාර සඳහා ඉහළම යළි නැවුම් කිරීමේ අනුපාතය සහ සජීවිකරණ ගුණාත්මකභාවය. බැටරි භාවිතය වැඩි කරයි."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"තිර අවධානය"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"වාර්ගික සැකසීම්"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"ප්රවේශ ස්ථානය සංස්කරණය"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"පිහිටුවා නැත"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"සකසා නැත"</string>
<string name="apn_name" msgid="6677695784108157953">"නම"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"විවෘත කිරීමට ප්රවේශ්යතා බොත්තම භාවිත කරන්න"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"විවෘත කිරීමට හඬ පරිමා යතුරු අල්ලාගෙන සිටින්න"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"විවෘත කිරීමට තිරය තෙවරක් තට්ටු කරන්න"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"විවෘත කිරීමට ඇඟිලි දෙකකින් තිරය තට්ටු කරන්න"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"විවෘත කිරීමට ඉංගිතය භාවිත කරන්න"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ප්රවේශ්යතා ඉංගිතය භාවිත කරන්න"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"මෙම විශේෂාංගය භාවිත කිරීමට, ඔබේ තිරයේ පහළ ඇති <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ප්රවේශ්යතා බොත්තම තට්ටු කරන්න.\n\nවිශේෂාංග අතර මාරු වීමට, ප්රවේශ්යතා බොත්තම ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"මෙම විශේෂාංගය භාවිත කිරීමට, ඔබගේ තිරයේ ඇති ප්රවේශ්යතා බොත්තම තට්ටු කරන්න."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"මෙම විශේෂාංගය භාවිත කිරීමට, හඬ පරිමා යතුරු දෙකම ඔබා අල්ලාගෙන සිටින්න"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"විශාලනය ආරම්භ කිරීමට සහ නතර කිරීමට, ඔබේ තිරයේ ඕනෑම තැනක තෙවරක් තට්ටු කරන්න."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"විශාලනය ආරම්භ කිරීමට සහ නැවැත්වීමට, ඇඟිලි දෙකකින් ඔබේ තිරයේ ඕනෑම තැනක තෙවරක් තට්ටු කරන්න."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"මෙම විශේෂාංගය භාවිත කිරීමට, ඇඟිලි 2කින් තිරයේ පහළ සිට ඉහළට ස්වයිප් කරන්න.\n\nවිශේෂාංග අතර මාරු වීමට, ඇඟිලි 2කින් ඉහළට ස්වයිප් කර අල්ලාගෙන සිටින්න."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"මෙම විශේෂාංගය භාවිත කිරීමට, ඇඟිලි 3කින් තිරයේ පහළ සිට ඉහළට ස්වයිප් කරන්න.\n\nවිශේෂාංග අතර මාරු වීමට, ඇඟිලි 3කින් ඉහළට ස්වයිප් කර අල්ලාගෙන සිටින්න."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ප්රවේශ්යතා විශේෂාංගයක් භාවිත කිරීමට, ඇඟිලි 2කින් තිරයේ පහළ සිට ඉහළට ස්වයිප් කරන්න.\n\nවිශේෂාංග අතර මාරු වීමට, ඇඟිලි 2කින් ඉහළට ස්වයිප් කර අල්ලාගෙන සිටින්න."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"හඬ පරිමා යතුරු අල්ලාගන්න"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"හඬ පරිමා යතුරු අල්ලාගන්න"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"හඬ පරිමා යතුරු දෙකම ඔබා අල්ලාගෙන සිටින්න"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ඇඟිලි දෙකේ ත්රිත්ව තට්ටු තිරය"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ඇඟිලි දෙකේ ත්රිත්ව තට්ටු තිරය"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ඇඟිලි දෙකකින් තිරය {0,number,integer} වාරයක් ඉක්මනින් තට්ටු කරන්න"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"තිරය තෙවරක් තට්ටු කරන්න"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"තිරය තෙවරක් තට්ටු කරන්න"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"තිරය ඉක්මනින් වාර {0,number,integer}ක් තට්ටු කරන්න. මෙම කෙටි මග ඔබගේ උපාංගය මන්දගාමී කළ හැකිය"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"කම්පනය සහ ස්පර්ශ භාවිත කරන්න"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"එලාම කම්පනය"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"මාධ්ය කම්පනය"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"යතුරු පුවරු කම්පනය"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"නාද කම්පනය"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"දැනුම්දීම් කම්පනය"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ප්රතිපෝෂණය ස්පර්ශ කරන්න"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ඔබ යෙදුමක පසුබිම් ක්රියාකාරිත්වය සීමා කළහොත්, එය වැරදි ලෙස ක්රියා කරනු ඇත"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"මෙම යෙදුම බැටරිය ප්රශස්ත කිරීමට සකසා නැති නිසා, ඔබට එය සීමා කළ නොහැකිය. \n\nයෙදුම සීමා කිරීම සඳහා, පළමුව බැටරි ප්රශස්තකරණය ක්රියාත්මක කරන්න."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"බැටරි භාවිතය කළමනාකරණය"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"සීමා නොකළ"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ප්රශස්ත කළ"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"සීමා කළ"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"පෙළ ප්රමාණය, විශාල මුද්රණය, විශාල අකුරු, විශාල පෙළ, අඩු දෘශ්යතාව, පෙළ වඩා විශාල කරන්න, අකුරු වඩා විශාල කරන්න, අකුරු විශාල කිරීම"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"හැම විට ම ක්රියාත්මක හාත්පස සංදර්ශකය, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC ලේබලය, කියවනය"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"යතුරු පුවරුව, ස්පර්ශ, කම්පනය,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"හඬ, කම්පනය, බාධා නොකරන්න"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"මාධ්ය ශබ්දය"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"විකාශන හඬ"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"සියලු ගොනු කළමනාකරණය කිරීමට ප්රවේශය ඉඩ දෙන්න"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"මෙම යෙදුමට මෙම උපාංගයේ හෝ ඕනෑම සබැඳුණු ගබඩා ධාරිතාවක ඇති සියලු ගොනු කියවීමට, වෙනස් කිරීමට සහ මැකීමට ඉඩ දෙන්න. ප්රදානය කළහොත්, ඔබේ ප්රකාශිත දැනුම රහිතව යෙදුමට ගොනු වෙත ප්රවේශ විය හැකිය."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"සියලු ගොනු වෙත ප්රවේශ විය හැකිය"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"පූර්ණ තිර දැනුම්දීම්"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"මෙම යෙදුමෙන් පූර්ණ තිර දැනුම්දීම්වලට ඉඩ දෙන්න"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"උපාංගය අගුළු දමා ඇති විට පූර්ණ තිරය ගන්නා දැනුම්දීම් පෙන්වීමට මෙම යෙදුමට ඉඩ දෙන්න. එලාම්, එන ඇමතුම්, හෝ වෙනත් හදිසි දැනුම්දීම් උද්දීපනය කිරීමට යෙදුම් මේවා භාවිතා කිරීමට ඉඩ ඇත."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"ඔබේ උපාංගයේ නම ඔබ ස්ථාපනය කර ඇති යෙදුම්වලට දෘශ්යමාන වේ. ඔබ බ්ලූටූත් උපාංග වෙත සම්බන්ධ වන විට, Wi-Fi ජාලයකට සම්බන්ධ වන විට හෝ Wi-Fi හොට්ස්පොට් එකක් පිහිටුවන විට එය වෙනත් පුද්ගලයන් විසින් ද දැකිය හැක."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"ව්යාකරණමය ලිංගභේදය"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"ව්යාකරණමය ලිංගභේදය තෝරන්න"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"රැවටිලිකාර යෙදුම් සඳහා ස්කෑන් කිරීම"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"තතුබෑම් සඳහා යෙදුම් ක්රියාකාරකම් පරීක්ෂා කරන්න"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ස්කෑන් කිරීම භාවිතා කරන්න"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"කාර්යාල යෙදුම් සඳහා ස්කෑන් කිරීම භාවිත කරන්න"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 274f52e..4bb8bf2 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Deaktivovať Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Deaktivovať funkciu Bluetooth LE Audio, keď zariadenie podporuje možnosti hardvéru LE Audio"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Zobrazovať LE Audio v podr. o zariadení"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Obísť zoznam povolených aplikácie Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Používajte LE Audio predvolene, aj keď nebolo overené, či periféria LE Audio spĺňa kritériá zoznamu povolených."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Mediálne zariadenia"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Zariadenia na telefonovanie"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Iné zariadenia"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Uložené zariadenia"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Spojené s účtom"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Použité v minulosti s účtom"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Na párovanie sa zapne Bluetooth"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Nastavenia pripojenia"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Predtým pripojené zariadenia"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Písanie v textových poliach"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorovať všetky stlačenia tlačidla dotykového pera"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Dotykové pero"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Zdieľanie zvuku"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Zdieľať zvuk"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Hovory a budíky"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Dátum a čas"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy server"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Vymazať"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Súkromný priestor"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Skrytie aplikácií do súkromného priečinka"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Odomknutie zámkou obrazovky"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Zobrazenie súkromného priestoru"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Skryť pri uzamknutí"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Skrytie súkromného priestoru pri uzamknutí"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Ak chcete zabrániť ostatným ľuďom, aby sa dozvedeli, že v zariadení máte Súkromný priestor, môžete ho skryť zo zoznamu aplikácií"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Prístup do Súkromného priestoru, keď je skrytý"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Vyhľadajte vo vyhľadávacom paneli položku Súkromný priestor"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Klepnutím zobrazíte dlaždicu Súkromného priestoru"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Odomknite svoj Súkromný priestor"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Vypnuté"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Zapnuté"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Systém"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Vytvorenie súkromného priestoru"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Odstránenie súkromného priestoru"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Súkromný priestor sa nepodarilo vytvoriť"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Súkromný priestor bol úspešne odstránený"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Súkromný priestor sa nepodarilo odstrániť"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Nastavte zámku obrazovky"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Ak chcete používať Súkromný priestor, nastavte v tomto zariadení zámku obrazovky."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Nastaviť zámku obrazovky"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Zrušiť"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Zrušiť"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Nastaviť"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Nastavenie Súkromného priestoru"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Skryte súkromné aplikácie do zabezpečeného priestoru, ku ktorému máte prístup len vy"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Ako to funguje"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Do Súkromného priestoru môžete prejsť z dolnej časti zoznamu aplikácií"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikácie v súkromnom priestore sú chránené zámkou"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Keď je súkromný priestor uzamknutý, upozornenia z jeho aplikácií sú skryté"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Keď je súkromný priestor uzamknutý, jeho aplikácie sa nebudú zobrazovať v sekcii Správca povolení, na paneli ochrany súkromia ani v ďalších nastaveniach"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Nastavuje sa súkromný priestor…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Súkromný priestor je chránený zámkou"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Keď je súkromný priestor uzamknutý, informácie o využití jeho aplikácií sú skryté"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Prístup k súkromnému priestoru v zozname aplikácií"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Súkromný priestor sa nepodarilo nastaviť"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Skúste to znova alebo sa vráťte neskôr"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Skúsiť znova"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Chcete odomykať pomocou zámky obrazovky?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Súkromný priestor môžete uzamknúť rovnakým spôsobom ako svoje zariadenie, prípadne môžete vybrať inú zámku"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Používať zámku obrazovky"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Vybrať novú zámku"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Hotovo!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Ak chcete získať prístup k súkromnému priestoru, potiahnite nahor zdola obrazovky a potom sa posuňte nadol"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Hotovo"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Posunutím nadol získajte prístup k súkromnému priestoru"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Maximálny počet odtlačkov, ktoré môžete pridať: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Pridali ste maximálny počet odtlačkov prstov"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nie je možné pridať ďalšie odtlačky prstov"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Pokračovať v používaní aplikácií po zložení"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Plynulý obraz"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Automaticky zvyšuje frekvenciu obnovenia zo 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz pre určitý obsah. Zvýši sa spotreba batérie."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Automaticky zvýši frekvenciu obnovenia v prípade určitého obsahu až na <xliff:g id="ID_1">%1$d</xliff:g> Hz. Zvýši sa spotreba batérie."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Vynútiť vrcholovú frekvenciu obnovenia"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Najvyššia frekvencia obnovenia zlepšujúca dotykovú odozvu a kvalitu animácií. Zvýši sa spotreba batérie."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Vnímavá obrazovka"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Spoločné nastavenia"</string>
<string name="apn_settings" msgid="4295467389400441299">"Prístupové body"</string>
<string name="apn_edit" msgid="2003683641840248741">"Upraviť prístupový bod"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nenastavené"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nenastavené"</string>
<string name="apn_name" msgid="6677695784108157953">"Názov"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Otváranie tlačidlom dostupnosti"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Otvorte pridržaním tlačidiel hlasitosti"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Otvorenie troma klepnutiami na obrazovku"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Otvorte trojitým klepnutím dvoma prstami na obrazovku"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Otváranie gestom"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Použitie gesta dostupnosti"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Ak chcete použiť túto funkciu, klepnite na tlačidlo dostupnosti <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> v dolnej časti obrazovky.\n\nFunkcie prepnete pridržaním tlačidla dostupnosti."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Ak chcete túto funkciu použiť, klepnite na tlačidlo dostupnosti na obrazovke."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Túto funkciu použijete tak, že pridržíte obe tlačidlá hlasitosti."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Ak chcete spustiť alebo zastaviť zväčšenie, klepnite trikrát na ľubovoľné miesto na obrazovke."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Ak chcete spustiť či zastaviť zväčšenie, klepnite trikrát dvoma prstami kdekoľvek na obrazovku."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Ak chcete použiť túto funkciu, potiahnite dvoma prstami z dolnej časti obrazovky nahor.\n\nFunkcie prepnete potiahnutím dvoma prstami smerom nahor a pridržaním."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Ak chcete použiť túto funkciu, potiahnite troma prstami z dolnej časti obrazovky nahor.\n\nFunkcie prepnete potiahnutím troma prstami smerom nahor a pridržaním."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Ak chcete použiť funkciu dostupnosti, potiahnite dvoma prstami z dolnej časti obrazovky nahor.\n\nFunkcie prepnete potiahnutím dvoma prstami smerom nahor a pridržaním."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Pridržanie tlačidiel hlasitosti"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"podržanie tlačidiel hlasitosti"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Pridržte obe tlačidlá hlasitosti"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Trikrát klepnite dvoma prstami na obrazovku"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trikrát klepnite dvoma prstami na obrazovku"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Rýchlo {0,number,integer}-krát klepnite dvoma prstami na obrazovku"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tri klepnutia na obrazovku"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tri klepnutia na obrazovku"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"{0,number,integer}‑krát rýchlo klepnite na obrazovku. Táto skratka môže zariadenie spomaliť."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Použiť vibrácie a hmatovú spätnú väzbu"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibrovanie pri budíku"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibrovanie pri médiách"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibrovanie klávesnice"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibrovanie pri zvonení"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibrovanie pri upozornení"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Odozva pri klepnutí"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ak obmedzíte aktivitu aplikácie na pozadí, nemusí fungovať správne"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Aplikácia nemá nastavenú optimalizáciu batérie, preto ju nemôžete obmedziť.\n\nAk ju chcete obmedziť, zapnite optimalizáciu."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Správa spotreby batérie"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Bez obmedzení"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimalizované"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Obmedzené"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"veľkosť textu, veľkoformátová tlač, veľké písmo, veľký text, slabozrakosť, zväčšenie textu, zväčšovač písma, zväčšenie písma"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"vždy zapnuté ambientné zobrazenie"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, štítok, čítačka"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klávesnica, hmatová spätná väzba, vibrovať,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Hlasitosť, vibrovanie, režim bez vyrušení"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Hlasitosť médií"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Hlasitosť prenášania"</string>
@@ -3700,7 +3755,7 @@
<string name="usb_transcode_files_summary" msgid="307102635711961513">"Videá sa budú prehrávať vo viacerých prehrávačoch médií, ale ich kvalita môže byť znížená"</string>
<string name="usb_use_tethering" msgid="2897063414491670531">"Tethering cez USB"</string>
<string name="usb_use_MIDI" msgid="8621338227628859789">"MIDI"</string>
- <string name="usb_use" msgid="6783183432648438528">"Používať USB na"</string>
+ <string name="usb_use" msgid="6783183432648438528">"Používať USB pre"</string>
<string name="usb_default_label" msgid="3372838450371060750">"Predvolená konfigurácia USB"</string>
<string name="usb_default_info" msgid="167172599497085266">"Tieto nastavenia sa použijú, keď bude pripojené ďalšie zariadenie a telefón bude odomknutý. Pripájajte sa iba k dôveryhodným zariadeniam."</string>
<string name="usb_power_title" msgid="5602112548385798646">"Možnosti napájania"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Povoliť prístup na správu všetkých súborov"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Povoľte tejto aplikácii čítať, upravovať a odstraňovať všetky súbory v tomto zariadení alebo akýchkoľvek pripojených úložiskách. Po udelení tohto povolenia bude môcť aplikácia používať súbory bez vášho vedomia."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Má prístup k všetkým súborom"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Upozornenia na celej obrazovke"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Povoliť zobrazovanie upozornení z tejto aplikácie na celej obrazovke"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Povoľte tejto aplikácii zobrazovať upozornenia na celú obrazovku, keď bude zariadenie uzamknuté. Aplikácie vás môžu pomocou nich informovať o budíkoch, prichádzajúcich hovoroch a ďalších dôležitých upozorneniach."</string>
@@ -4886,6 +4947,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Kontrola aktivity v aplikácii, či nedochádza k phishingu"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Použiť kontrolu"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Použiť kontrolu pracovných aplikácií"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Kontrola prebieha súkromne priamo v zariadení, pričom sa preveruje aktivita v aplikácii, či nedochádza k phishingu alebo inému klamlivému správaniu. Ak sa zistí, niektoré informácie o aplikácii sa odošlú do súpravy Google Play Protect na potvrdenie hrozby a upozornenie používateľov aplikácie."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Toto je chránená bezpečnostná funkcia. S Googlom sa nezdieľajú žiadne informácie zo zariadení ani osobné údaje. \n\nPhishing je pokus o krádež prihlasovacích údajov alebo iných osobných údajov."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 8a015bd..1572cee 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Onemogoči funkcijo Bluetooth LE zvok"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Onemogoči funkcijo Bluetooth LE zvok, če naprava podpira strojno opremo za LE zvok."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Pokaži preklopnik za LE zvok v podrobnostih o napravi"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Zaobidenje seznama dovoljenih za funkcijo Bluetooth LE zvok"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Privzeta uporaba funkcije LE zvok, tudi če dodatna oprema LE zvok ni potrjena, da izpolnjuje merila za uvrstitev na seznam dovoljenih."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Predstavnostne naprave"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Klicne naprave"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Druge naprave"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Shranjene naprave"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Povezano s tem računom"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Že uporabljeno z računom"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth bo vklopljen, da bo omogočeno seznanjanje."</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Nastavitve povezave"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Predhodno povezane naprave"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Pisanje v besedilnih poljih"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Prezri vse pritiske gumbov pisala"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Pisalo"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Deljenje zvoka"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Deli zvok"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Klici in alarmi"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Datum in ura"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Strežnik proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Počisti"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Zasebni prostor"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Skrivanje aplikacij v zasebni mapi"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Odklepanje z načinom za odklepanje zaslona"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Prikaz zasebnega prostora"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Skrivanje, kadar je zaklenjeno"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Skrivanje zasebnega prostora, kadar je zaklenjen"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Če ne želite, da bi druge osebe vedele, da je v napravi zasebni prostor, ga lahko skrijete, da ni prikazan na seznamu aplikacij"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Dostop do zasebnega prostora, kadar je skrit"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"V vrstici za iskanje poiščite izraz »Zasebni prostor«"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Dotaknite se ploščice »Zasebni prostor«"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Odklepanje zasebnega prostora"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Izklopljeno"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Vklopljeno"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Ustvarjanje zasebnega prostora"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Brisanje zasebnega prostora"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Zasebnega prostora ni bilo mogoče ustvariti"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Zasebni prostor je bil uspešno izbrisan"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Zasebnega prostora ni bilo mogoče izbrisati"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Nastavite zaklepanje zaslona"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Če želite uporabljati zasebni prostor, v napravi nastavite zaklepanje zaslona."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Nastavite zaklepanje zaslona"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Prekliči"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Prekliči"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Nastavi"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Nastavitev zasebnega prostora"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Skrivanje zasebnih aplikacij na varnem mestu, ki je dostopno samo vam"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Kako deluje"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Do zasebnega prostora lahko dostopate z dna seznama aplikacij"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikacije v zasebnem prostoru so zaščitene z zaklepanjem"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Obvestila aplikacij v zasebnem prostoru so skrita, kadar je zasebni prostor zaklenjen"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikacije v zasebnem prostoru ne bodo prikazane v upravitelju dovoljenj, na nadzorni plošči za zasebnost in v drugih nastavitvah, kadar je zasebni prostor zaklenjen"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Nastavljanje zasebnega prostora …"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Zasebni prostor je zaščiten z zaklepanjem"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Podatki o uporabi aplikacij v zasebnem prostoru so skriti, kadar je zasebni prostor zaklenjen"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Dostop do zasebnega prostora s seznama aplikacij"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Zasebnega prostora ni bilo mogoče nastaviti"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Poskusite znova zdaj ali se vrnite pozneje"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Poskusi znova"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Želite odklepati z načinom za odklepanje zaslona?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Zasebni prostor lahko odklepate na enak način kot napravo, lahko pa izberete drug način zaklepanja"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Uporabi način za odklepanje zaslona"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Izberite nov način zaklepanja"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Končano"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Za dostop do zasebnega prostora povlecite navzgor z dna začetnega zaslona in se nato pomaknite navzdol."</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Končano"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Za dostop do zasebnega prostora se pomaknite navzdol"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Dodate lahko do toliko prstnih odtisov: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Dodali ste največje dovoljeno število prstnih odtisov"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Prstnih odtisov ni več mogoče dodati"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Še naprej uporabljaj aplikacije po zlaganju naprave"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Tekoč prikaz"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Samodejno povečanje hitrosti osveževanja s 60 na <xliff:g id="ID_1">%1$s</xliff:g> Hz za nekatere vsebine. Poveča porabo energije baterije."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Samodejno poveča hitrost osveževanja do največ <xliff:g id="ID_1">%1$d</xliff:g> Hz za nekatere vsebine. Poveča porabo energije baterije."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Vsili največjo hitrost osveževanja"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Višja hitrost osveževanja za izboljšano odzivnost na dotik in kakovost animacij. Povečana poraba energije baterije."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Zaznavanje pogleda na zaslon"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Skupne nastavitve"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-ji"</string>
<string name="apn_edit" msgid="2003683641840248741">"Urejanje dostopne točke"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ni nastavljeno"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ni nastavljeno"</string>
<string name="apn_name" msgid="6677695784108157953">"Ime"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Odpiranje z gumbom za dostopnost"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Za odpiranje pridržite tipki za glasnost"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Za odpiranje se trikrat dotaknite zaslona"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Trikratni dotik zaslona z dvema prstoma za odpiranje"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Odpiranje s potezo"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Uporaba poteze za dostopnost"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Če želite uporabljati to funkcijo, se na dnu zaslona dotaknite gumba za dostopnost <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>.\n\nČe želite preklopiti med funkcijami, se dotaknite gumba za dostopnost in ga pridržite."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Za uporabo te funkcije se na zaslonu dotaknite gumba za dostopnost."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Če želite uporabljati to funkcijo, pritisnite obe tipki za glasnost in ju pridržite."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Če želite vklopiti ali izklopiti povečavo, se trikrat dotaknite poljubnega mesta na zaslonu."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Za vklop ali izklop povečave se z dvema prstoma trikrat dotaknite poljubnega mesta na zaslonu."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Če želite uporabljati to funkcijo, z dvema prstoma povlecite z dna zaslona navzgor.\n\nČe želite preklopiti med funkcijami, z dvema prstoma povlecite navzgor in pridržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Če želite uporabljati to funkcijo, s tremi prsti povlecite z dna zaslona navzgor.\n\nČe želite preklopiti med funkcijami, s tremi prsti povlecite navzgor in pridržite."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Če želite uporabljati funkcijo za dostopnost, z dvema prstoma povlecite z dna zaslona navzgor.\n\nČe želite preklopiti med funkcijami, z dvema prstoma povlecite navzgor in pridržite."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Pridržanje tipk za glasnost"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"pridržanje tipk za glasnost"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Pritisnite in pridržite obe tipki za glasnost."</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Trikratni dotik zaslona z dvema prstoma"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trikratni dotik zaslona z dvema prstoma"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Z dvema prstoma se {0,number,integer}-krat hitro dotaknite zaslona"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Trikratni dotik zaslona"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"trikratni dotik zaslona"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"{0,number,integer}-krat se hitro dotaknite zaslona. Ta bližnjica bo morda upočasnila delovanje naprave."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Uporabi vibriranje in tipni odziv"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibriranje alarma"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibriranje predstavnosti"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Vibriranje tipkovnice"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibriranje pri zvonjenju"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibriranje pri obvestilih"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Odziv na dotik"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Če boste omejili dejavnost aplikacije v ozadju, morda ne bo pravilno delovala"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Ker za to aplikacijo ni izbrana nastavitev optimiziranja porabe baterije, je ni mogoče omejiti.\n\nČe želite omejiti aplikacijo, najprej vklopite optimizacijo baterije."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Upravljanje porabe energije baterije"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Neomejeno"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimizirano"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Omejeno"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"velikost besedila, velika pisava, velike črke, veliko besedilo, slabovidnost, povečaj besedilo, povečevalnik pisave, povečanje pisave"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"stalno vklopljen ambientalni ohranjevalnik zaslona, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, oznaka, bralnik"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tipkovnica, tipna tehnologija, vibriranje"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Glasnost, vibriranje, ne moti"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Glasnost predstavnosti"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Glasnost predvajanja"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Dovoli dostop za upravljanje vseh datotek"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Tej aplikaciji dovolite, da bere, spreminja in briše vse datoteke v tej napravi ali drugih povezanih nosilcih za shranjevanje. Če daste to dovoljenje, bo aplikacija morda dostopala do datotek brez vaše vednosti."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Lahko dostopa do vseh datotek"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Celozaslonska obvestila"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Dovoli celozaslonska obvestila te aplikacije"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Dovolite, da ta aplikacija prikazuje obvestila, ki zavzamejo celoten zaslon, ko je naprava zaklenjena. Aplikacije lahko z njimi izpostavijo alarme, dohodne klice ali druga nujna obvestila."</string>
@@ -4882,16 +4943,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Ime naprave je vidno aplikacijam, ki ste jih namestili. Ko vzpostavite povezavo z napravami Bluetooth ali omrežjem Wi-Fi ali nastavite dostopno točko Wi-Fi, ga bodo morda videle tudi druge osebe."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Slovnični spol"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Izbira slovničnega spola"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Iskanje zavajajočih aplikacij"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Iskanje znakov lažnega predstavljanja v dejavnostih v aplikacijah"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Uporaba pregledovanja"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Uporabi pregledovanje za delovne aplikacije"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index f1ec66f..7ae517f 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Çaktivizo Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Çaktivizon veçorinë Bluetooth LE Audio nëse pajisja mbështet aftësitë e harduerit të LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Shfaq çelësin për LE Audio te \"Detajet e pajisjes\""</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Anashkalo \"Listën e lejimeve\" të Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Përdor LE Audio si parazgjedhje edhe nëse LE Audio periferike nuk është verifikuar se i ka plotësuar kriteret e \"Listës së lejimeve\"."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Pajisjet për median"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Pajisjet për telefonata"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Pajisjet e tjera"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Pajisjet e ruajtura"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Lidhur me llogarinë"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"E përdorur më parë me këtë llogari"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth-i do të aktivizohet për çiftimin"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Preferencat e lidhjes"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Të lidhura më parë"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Shkruaj në fushat e tekstit"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Shpërfill të gjitha shtypjet e butonave me stilolapsin"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stilolapsi"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Ndarja e audios"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Ndaj audion"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Telefonatat dhe alarmet"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Data dhe ora"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Pastro"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Hapësira private"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Fshih aplikacionet në një dosje private"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Shkyç duke përdorur kyçjen e ekranit"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Shfaq \"Hapësirën private\""</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Fshih kur është e kyçur"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Fshih \"Hapësirën private\" kur është e kyçur"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Për të ndaluar që të tjerët të dinë se \"Hapësira private\" është në pajisjen tënde, mund ta fshehësh nga lista jote e aplikacioneve"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Qasu te \"Hapësira private\" kur është e fshehur"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Kontrollo për \"Hapësirën private\" në shiritin e kërkimit"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Trokit te pllakëza e \"Hapësirës private\""</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Shkyç \"Hapësirën private\""</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Joaktive"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Aktive"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistemi"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Krijo \"Hapësirën private\""</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Fshi \"Hapësirën private\""</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"\"Hapësira private\" nuk mund të krijohej"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"\"Hapësira private\" u fshi me sukses"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"\"Hapësira private\" nuk mund të fshihej"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Cakto një kyçje ekrani"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Për të përdorur \"Hapësirën private\", cakto një kyçje ekrani në këtë pajisje."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Cakto kyçjen e ekranit"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Anulo"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Anulo"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Konfiguro"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Konfiguro \"Hapësirën private\""</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Fshih aplikacionet private në një hapësirë të sigurt ku vetëm ti mund të qasesh"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Si funksionon"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Mund të qasesh te \"Hapësira private\" nga fundi i listës së aplikacioneve"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Aplikacionet në \"Hapësirën private\" janë të mbrojtura me një kyçje"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Njoftimet nga aplikacionet në \"Hapësirën private\" janë të fshehura kur ajo është e kyçur"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Aplikacionet e \"Hapësirës private\" nuk do të shfaqen te menaxheri i lejeve, paneli i privatësisë dhe në cilësime të tjera kur \"Hapësira private\" është e kyçur"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"\"Hapësira private\" po konfigurohet…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"\"Hapësira private\" është e mbrojtur me një kyçje"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Informacionet e përdorimit për aplikacionet e \"Hapësirës private\" janë të fshehura kur ajo është e kyçur"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Qasu te \"Hapësira private\" nga lista jote e aplikacioneve"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"\"Hapësira private\" nuk mund të konfigurohej"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Provo përsëri tani ose kthehu më vonë"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Provo përsëri"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Të përdoret kyçja e ekranit për ta shkyçur?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"\"Hapësirën private\" mund ta shkyçësh në të njëjtën mënyrë që shkyç pajisjen tënde ose mund të zgjedhësh një kyçje tjetër"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Përdor kyçjen e ekranit"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Zgjidh një kyçje të re"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Plotësisht gati!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Për t\'u qasur te \"Hapësira private\", rrëshqit shpejt lart nga fundi i ekranit bazë dhe më pas lëviz poshtë"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"U krye"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Lëviz poshtë për t\'u qasur te \"Hapësira private\""</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Mund të shtosh deri në <xliff:g id="COUNT">%d</xliff:g> gjurmë gishtash"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Ke shtuar numrin maksimal të gjurmëve të gishtave"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Nuk mund të shtohen gjurmë të tjera të gishtave"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Vazhdo të përdorësh aplikacionet në Fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Ngre automatikisht shpejtësinë e rifreskimit nga 60 në <xliff:g id="ID_1">%1$s</xliff:g> Hz për disa përmbajtje. Rrit përdorimin e baterisë."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Rrit automatikisht shpejtësinë e rifreskimit deri në <xliff:g id="ID_1">%1$d</xliff:g> Hz për disa përmbajtje. Rrit përdorimin e baterisë."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Detyro shpejtësinë maksimale të rifreskimit"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Shpejtësia më e lartë e rifreskimit për përmirësimin e reagueshmërisë së prekjes dhe cilësisë së animacioneve. Rrit përdorimin e baterisë."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Vëmendja ndaj ekranit"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Cilësimet e përbashkëta"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN-të"</string>
<string name="apn_edit" msgid="2003683641840248741">"Redakto pikën e qasjes"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Nuk është caktuar"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Nuk është caktuar"</string>
<string name="apn_name" msgid="6677695784108157953">"Emri"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Përdor butonin e qasshmërisë për të hapur"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Mbaj shtypur tastet e volumit për ta hapur"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Trokit tri herë në ekran për ta hapur"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Trokit tri herë me dy gishta në ekran për të hapur"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Përdor gjestin për të hapur"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Përdor gjestin e qasshmërisë"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Për ta përdorur këtë veçori, trokit te butoni i qasshmërisë <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> në fund të ekranit.\n\nPër të ndërruar mes veçorive, mbaj të shtypur butonin e qasshmërisë."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Për të përdorur këtë veçori, trokit te butoni i qasshmërisë në ekranin tënd."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Për ta përdorur këtë veçori, mbaj shtypur të dyja tastet e volumit."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Për të filluar dhe ndaluar zmadhimin, trokit tri herë diku në ekran."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Për të filluar dhe ndaluar zmadhimin, trokit tri herë me dy gishta diku në ekran."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Për ta përdorur këtë veçori, rrëshqit shpejt lart nga fundi i ekranit me 2 gishta.\n\nPër të ndërruar mes veçorive, rrëshqit shpejt lart me 2 gishta dhe mbaje të shtypur."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Për ta përdorur këtë veçori, rrëshqit shpejt lart nga fundi i ekranit me 3 gishta.\n\nPër të ndërruar mes veçorive, rrëshqit shpejt lart me 3 gishta dhe mbaje të shtypur."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Për të përdorur një veçori të qasshmërisë, rrëshqit shpejt lart nga fundi i ekranit me 2 gishta.\n\nPër të ndërruar mes veçorive, rrëshqit shpejt lart me 2 gishta dhe mbaje të shtypur."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Mbaj shtypur tastet e volumit"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"mbaj shtypur tastet e volumit"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Shtyp dhe mbaj shtypur të dyja tastet e volumit"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Trokit tri herë me dy gishta në ekran"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"trokit tri herë me dy gishta në ekran"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Trokit shpejt {0,number,integer} herë me dy gishta në ekran"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Trokit tri herë mbi ekran"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"trokit tri herë mbi ekran"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Trokit me shpejtësi {0,number,integer} herë në ekran. Kjo shkurtore mund të ngadalësojë pajisjen tënde"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Përdor dridhjen dhe prekjen"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Dridhja e alarmit"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Dridhja e medias"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Dridhja e tastierës"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Dridhja e ziles"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Dridhja e njoftimit"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Reagimi me prekje"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Nëse e kufizon aktivitetin në sfond për një aplikacion, mund të ketë çrregullime në funksionimin e tij"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Duke qenë se ky aplikacion nuk është caktuar për të optimizuar baterinë, nuk mund ta kufizosh atë.\n\nPër të kufizuar aplikacionin, në fillim aktivizo optimizimin e baterisë."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Menaxho përdorimin e baterisë"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Pa kufizim"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"I optimizuar"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"I kufizuar"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"madhësia e tekstit, shkronja të mëdha, fonti i madh, teksti i madh, shikim i dobët, bëje tekstin më të madh, zmadhuesi i fontit, zmadhimi i fontit"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"shfaqja e ambientit gjithmonë aktive, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiketë, lexues"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tastierë, prekje, dridhje,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volum, dridhje, \"Mos shqetëso\""</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volumi i medias"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volumi i transmetimit"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Lejo qasjen për të menaxhuar të gjithë skedarët"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Lejo që ky aplikacion të lexojë, modifikojë dhe fshijë të gjithë skedarët në këtë pajisje ose në çdo volum hapësire ruajtjeje të lidhur. Nëse lejohet, aplikacioni mund të ketë qasje te skedarët pa dijeninë tënde të qartë."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Mund të ketë qasje te të gjithë skedarët"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Njoftimet në ekranin e plotë"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Të lejohen njoftimet në ekranin e plotë nga ky aplikacion"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Lejo këtë aplikacion të shfaqë njoftime që zënë ekranin e plotë kur pajisja është e kyçur. Aplikacionet mund t’i përdorin këto për të vendosur në fokus alarmet, telefonatat hyrëse apo njoftimet e tjera urgjente."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Kontrollo aktivitetin e aplikacioneve për mashtrime"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Përdor skanimin"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Përdor skanimin për aplikacionet e punës"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Skanimi ekzekutohet në mënyrë private pikërisht në pajisjen tënde, duke kontrolluar aktivitetin e aplikacioneve për mashtrime ose sjellje të tjera mashtruese. Nëse zbulohen, disa informacione të aplikacionit dërgohen te Google Play Protect për të konfirmuar kërcënimin dhe për të paralajmëruar përdoruesit e tjerë të aplikacionit."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Kjo është një veçori e mbrojtur sigurie. Nuk ndahen informacionet e pajisjes apo informacione personale me Google. \n\nMashtrimi është një përpjekje për të vjedhur kredencialet e identifikimit ose informacione të tjera personale."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 1e5d3f4..ee7d179 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Онемогући Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Онемогућава функцију Bluetooth LE audio ако уређај подржава могућности LE audio хардвера."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"LE Audio прекидач у детаљима о уређају"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Заобиђи Bluetooth LE Audio листу дозвољених"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Подразумевано користи LE Audio чак и ако није потврђено да LE Audio периферни уређај задовољава критеријуме листе дозвољених."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Медијски уређаји"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Уређаји за позивање"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Други уређаји"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Сачувани уређаји"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Повезано са налогом"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Претходно коришћено са налогом"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth ће се укључити ради упаривања"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Подешавања повезивања"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Претходно повезани"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Пишите у пољима за текст"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Игнориши сва притискања дугмета помоћу писаљке"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Писаљка"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Дељење звука"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Дели звук"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Позиви и аларми"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Повежите се са LE audio стримом"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Аудио стримови у близини"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Аудио стримови"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Повежите се са аудио стримом помоћу QR кода"</string>
<string name="date_and_time" msgid="1788358029823431692">"Датум и време"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Прокси"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Обриши"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Приватни простор"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Сакриј апликације у приватном фолдеру"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Откључај помоћу откључавања екрана"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Сакриј приватни простор"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Сакриј кад је закључан"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Сакријте приватни простор кад је закључан"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Приватни простор можете да сакријете са листе апликација"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Приступите приватном простору кад је сакривен"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Потражите Приватни простор на траци за претрагу"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Додирните плочицу Приватни простор"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Откључајте приватни простор"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Искључено"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Укључeно"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Систем"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Направи приватни простор"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Избриши приватни простор"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Прављење приватног простора није успело"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Приватни простор је избрисан"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Брисање приватног простора није успело"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Подесите закључавање екрана"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"За приватни простор подесите закључавање екрана на уређају."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Подеси закључавање екрана"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Откажи"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Откажи"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Подеси"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Подесите приватни простор"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Сакријте приватне апликације у безбедном простору ком само ви можете да приступите"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Принцип рада"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Приватном простору можете да приступите са дна листе апликација"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Апликације у приватном простору су закључане"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Обавештења из апликација приватног простора су скривена кад је он закључан"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Апликације приватног простора неће се појавити у менаџеру дозвола, на контролној табли за приватност и у другим подешавањима кад је приватни простор закључан"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Подешава се приватни простор…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Приватни простор је заштићен закључавањем"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Информације о коришћењу за апликације из приватног простора су скривене када је закључан"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Приступајте приватном простору са листе апликација"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Подешавање приватног простора није успело"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Пробајте поново сада или се вратите касније"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Пробај поново"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Желите да откључате помоћу откључавања екрана?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Можете да откључавате приватни простор исто као што откључавате уређај или да одаберете другачији тип откључавања"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Користи откључавање екрана"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Одабери нови тип закључавања"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Готово!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Да бисте приступали приватном простору, превуците нагоре од дна почетног екрана, па скролујте надоле"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Готово"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Скролујте надоле да бисте приступали приватном простору"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Можете да их додате до <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Додали сте максималан број отисака прстију"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Не можете да додате још отисака прстију"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Настави са коришћењем апликација при преклапању"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Течан приказ"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Аутоматски подиже учесталост освежавања са 60 на <xliff:g id="ID_1">%1$s</xliff:g> Hz за одређени садржај. Повећава потрошњу батерије."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Аутоматски подиже учесталост освежавања до <xliff:g id="ID_1">%1$d</xliff:g> Hz за одређени садржај. Повећава потрошњу батерије."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Наметни максималну учесталост освежавања"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Највећа учесталост освежавања за побољшан одзив на додир и квалитет анимације. Повећава потрошњу батерије."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Пажња екрана"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Заједничка подешавања"</string>
<string name="apn_settings" msgid="4295467389400441299">"Називи приступних тачака"</string>
<string name="apn_edit" msgid="2003683641840248741">"Измена приступне тачке"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Додајте приступну тачку"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Није подешено"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Није подешено"</string>
<string name="apn_name" msgid="6677695784108157953">"Назив"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Отварајте помоћу дугмета за приступачност"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Задржите тастере за јачину звука да бисте отворили"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Трипут додирните екран да бисте отворили"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Додирните екран три пута помоћу два прста да бисте отворили"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Отварајте помоћу покрета"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Користите покрет за приступачност"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Да бисте користили ову функцију, додирните дугме Приступачност <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> у дну екрана.\n\nДа бисте прелазили са једне функције на другу, додирните и задржите дугме Приступачност."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Да бисте користили ову функцију, додирните дугме Приступачност на екрану."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Да бисте користили ову функцију, притисните и задржите оба тастера за јачину звука."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Да бисте покренули и зауставили увећање, трипут додирните било где на екрану."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Да бисте покренули и зауставили увећање, додирните три пута било где на екрану помоћу два прста."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Да бисте користили ову функцију, превуците нагоре од дна екрана помоћу 2 прста.\n\nДа бисте прелазили са једне функције на другу, превуците нагоре помоћу 2 прста и задржите."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Да бисте користили ову функцију, превуците нагоре од дна екрана помоћу 3 прста.\n\nДа бисте прелазили са једне функције на другу, превуците нагоре помоћу 3 прста и задржите."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Да бисте користили функцију приступачности, превуците нагоре од дна екрана помоћу 2 прста.\n\nДа бисте прелазили са једне функције на другу, превуците нагоре помоћу 2 прста и задржите."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Задржите тастере за јачину звука"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"задржите тастере за јачину звука"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Притисните и задржите оба тастера за јачину звука"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Додирните екран три пута помоћу два прста"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"додирните екран три пута помоћу два прста"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Брзо додирните екран {0,number,integer} пута помоћу два прста"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Додирните екран трипут"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"додирните екран трипут"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Брзо додирните екран {0,number,integer} пута. Ова пречица може да успори уређај"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Користи вибрирање и хаптику"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Вибрирање аларма"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Вибрирање медија"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Вибрација тастатуре"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Вибрирање звона"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Вибрирање обавештења"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Тактилни одзив"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ако ограничите активности апликације у позадини, можда ће се понашати неочекивано."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Апл. није подешена за оптимизацију батерије, па не можете да је ограничите. \n\nЗа огр. апл. укључите оптимизацију батерије."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Управљајте потрошњом батерије"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Дозволи коришћење у позадини"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Омогућите за ажурирања у реалном времену, онемогућите да бисте уштедели батерију"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Неограничено"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оптимизовано"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Ограничено"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"величина текста, велика слова, велик фонт, велик текст, слабовидост, повећање текста, увећавање фонта, повећање фонта"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"звек укључен амбијентални приказ, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, ознака, читач"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"тастатура, хаптика, вибрација,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Јачина звука, вибрација, Не узнемиравај"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Јачина звука медија"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Јачина звука за пребацивање"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Дозволи приступ за управљање свим датотекама"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Дозволите да ова апликација чита, мења и брише све датотеке на овом уређају или свим повезаним уређајима за складиштење. Ако то дозволите, апликација може да приступа датотекама без вашег знања."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Може да приступа свим датотекама"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Обавештења преко целог екрана"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Дозволите обавештења преко целог екрана од ове апликације"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Дозволите овој апликацији да приказује обавештења преко целог екрана када је уређај закључан. Апликације могу да их користе ради истицања аларма, долазних позива или других хитних обавештења."</string>
@@ -4885,6 +4939,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Проверите активности у апликацијама ради откривања „пецања“"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Користи проверу"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Користи проверу за пословне апликације"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Провера се обавља приватно и директно на уређају, а њоме се проверавају активности у апликацијама ради откривања „пецања“ или другог обмањујућег понашања. Ако се то открије, неки подаци о апликацији се шаљу Google Play заштити да би се потврдила претња и упозорили корисници."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Ово је заштићена безбедносна функција. Са Google-ом се не деле подаци о уређају ни лични подаци. \n\n„Пецање“ је покушај крађе акредитива за пријављивање или других личних података."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index e267118..bb8fd40 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Inaktivera Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Inaktiverar Bluetooth LE Audio-funktionen om enheten har stöd för funktioner för LE Audio-maskinvara."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Visa reglage för LE Audio i Enhetsinfo"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Hoppa över godkännandelistan för Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Använd LE Audio som standard även om LE Audio-kringutrustningen inte har bekräftats uppfylla kraven för godkännandelistan."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medieenheter"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Telefonenheter"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Andra enheter"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Sparade enheter"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Kopplad till kontot"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Användes tidigare med kontot"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth aktiveras för parkoppling"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Anslutningsval"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Tidigare anslutna enheter"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Skriv i textfälten"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ignorera alla knapptryckningar på e-pennan"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"E-penna"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Ljuddelning"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Dela ljud"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Samtal och alarm"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Datum och tid"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Rensa"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Privat rum"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Dölj appar i en privat mapp"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Lås upp med skärmlåset"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Visa privat rum"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Dölj när det är låst"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Dölj privat rum när det är låst"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Du kan dölja privat rum i applistan så andra inte ser det"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Kom åt privat rum när det är dolt"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Sök efter privat rum i sökfältet"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Tryck på rutan för privat rum"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Lås upp ditt privata rum"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Av"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"På"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Skapa privat rum"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Radera privat rum"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Det gick inte att skapa det privata rummet"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Det privata rummet har raderats"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Det gick inte att radera det privata rummet"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ställ in skärmlås"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Ange ett skärmlås för enheten om du vill använda Privat rum."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Konfigurera skärmlås"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Avbryt"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Avbryt"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Ställ in"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Ställ in privat rum"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Dölj privata appar i ett säkert rum som bara du kan komma åt"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Så fungerar det"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Du kan komma åt privat rum längst ned i applistan"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Appar i privat rum skyddas av ett lås"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Aviseringar från appar i privat rum döljs när det är låst"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Appar i privat rum visas inte i behörighetshanteringen, integritetsöversikten eller andra inställningar när privat rum är låst"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Konfigurera privat rum …"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Privat rum är skyddat med ett lås"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Användarinformation för appar i privat rum döljs när det är låst"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Åtkomst till Privat rum från din applista"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Det gick inte att konfigurera privat rum"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Försök igen nu eller kom tillbaka senare"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Försök igen"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Vill du använda skärmlåset för att låsa upp?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Du kan låsa upp privat rum på samma sätt som du låser upp din enhet, eller så väljer du ett annat lås"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Använd skärmlås"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Välj ett nytt lås"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Klart!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Svep uppåt från startskärmens nederkant och scrolla sedan nedåt för att få åtkomst till Privat rum"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Klar"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Scrolla nedåt för att få åtkomst till privat rum"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Du kan lägga till upp till <xliff:g id="COUNT">%d</xliff:g> fingeravtryck"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Du har lagt till det högsta tillåtna antalet fingeravtryck"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Det går inte att lägga till fler fingeravtryck"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Fortsätt att använda appar i hopvikt läge"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Höjer automatiskt uppdateringsfrekvensen från 60 till <xliff:g id="ID_1">%1$s</xliff:g> Hz för visst innehåll. Ökar batteriförbrukningen."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Höjer automatiskt uppdateringsfrekvensen till <xliff:g id="ID_1">%1$d</xliff:g> Hz för visst innehåll. Ökar batteriförbrukningen."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Tvinga att den högsta uppdateringsfrekvensen körs"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Den högsta uppdateringsfrekvensen ger bättre tryckkänslighet och animationskvalitet. Ökar batteriförbrukningen."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Blickavkänning"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Allmänna inställningar"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN:er"</string>
<string name="apn_edit" msgid="2003683641840248741">"Redigera åtkomstpunkt"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ej fastställt"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Har inte angetts"</string>
<string name="apn_name" msgid="6677695784108157953">"Namn"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Öppna med tillgänglighetsknappen"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Öppna genom att hålla ned volymknapparna"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Öppna genom att trycka snabbt tre gånger"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Tryck snabbt tre gånger på skärmen med två fingrar för att öppna"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Öppna med rörelse"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Använda tillgänglighetsrörelser"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Tryck på tillgänglighetsknappen <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> längst ned på skärmen om du vill använda denna funktion.\n\nByt funktion genom att hålla in tillgänglighetsknappen."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Tryck på tillgänglighetsknappen på skärmen om du vill använda den här funktionen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Håll båda volymknapparna nedtryckta om du vill använda den här funktionen."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Tryck snabbt tre gånger någonstans på skärmen för att starta och avsluta förstoring."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Tryck snabbt tre gånger någonstans på skärmen med två fingrar för att starta och avsluta förstoring."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Svep uppåt med två fingrar från skärmens nederkant om du vill använda den här funktionen.\n\nByt funktion genom att svepa uppåt med två fingrar och hålla kvar dem."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Svep uppåt med tre fingrar från skärmens nederkant om du vill använda den här funktionen.\n\nByt funktion genom att svepa uppåt med tre fingrar och hålla kvar dem."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Svep uppåt med två fingrar från skärmens nederkant om du vill använda en tillgänglighetsfunktion.\n\nByt funktion genom att svepa uppåt med två fingrar och hålla kvar dem."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Håll ned volymknapparna"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"håll ned volymknapparna"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Håll båda volymknapparna nedtryckta"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Skärm för snabbt tryck tre gånger med två fingrar"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"skärm för snabbt tryck tre gånger med två fingrar"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Tryck snabbt {0,number,integer} gånger på skärmen med två fingrar"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Tryck snabbt tre gånger på skärmen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"tryck snabbt tre gånger på skärmen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Tryck snabbt {0,number,integer} gånger på skärmen. Detta kortkommando kan göra enheten långsammare"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Använd vibration och haptik"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Vibration för alarm"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Vibration för medieinnehåll"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Tangentbordsvibration"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Vibration för ringsignal"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Vibration för aviseringar"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Tryckåterkoppling"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Om du begränsar bakgrundaktiviteten för en app kanske den inte fungerar som den ska"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Appen kan inte begränsas eftersom batterioptimering inte har angetts.\n\nAktivera batterioptimering för att begränsa appen."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Hantera batterianvändning"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Obegränsad"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimerad"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Begränsad"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"textstorlek, stora tecken, stort teckensnitt, stor text, nedsatt syn, göra texten större, teckenförstoring, förstora teckensnitt"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"aktiv låsskärm alltid på, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etikett, läsare"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"tangentbord, haptik, vibrera,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volym, vibrera, stör ej"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Medievolym"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Castvolym"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Tillåt hanteringsåtkomst för alla filer"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Tillåt att den här appen får läsa, redigera och radera alla filer på enheten och eventuella anslutna lagringsutrymmen. Om du beviljar behörigheten kan appen komma åt filer utan att du informeras."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Har åtkomst till alla filer"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Aviseringar i helskärm"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Tillåt aviseringar i helskärm från den här appen"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Tillåt att den här appen visar aviseringar som täcker hela skärmen när enheten är låst. Sådana aviseringar kan användas i appar för att lyfta fram alarm, inkommande samtal och andra brådskande aviseringar."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Enhetens namn är synligt för appar du har installerat. Det kan också vara synligt för andra personer när du ansluter till Bluetooth-enheter eller ett wifi-nätverk, eller om du skapar en wifi-surfzon."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Genus"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Välj genus"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Söker efter bedrägliga appar"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Kontrollera appaktivitet för att upptäcka nätfiske"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Använd genomsökning"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Använd genomsökning för jobbappar"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 2165c56..8006e6d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Zima Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Huzima kipengele cha Bluetooth LE audio ikiwa kifaa kinatumia maunzi yenye uwezo wa kutumia LE audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Onyesha LE Audio kwenye Maelezo ya Kifaa"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Kwepa Faili Zilizoruhusiwa za Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Tumia LE Audio kwa chaguomsingi hata ikiwa kifaa cha LE Audio hakijathibitishwa kuwa kimetimiza masharti."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Vifaa vya kuhifadhia data"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Vifaa vya kupiga simu"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Vifaa vingine"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Vifaa vilivyohifadhiwa"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Zinazohusishwa na akaunti"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Kilichotumiwa awali kwenye akaunti"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth itawaka ili ioanishe"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Mapendeleo ya muunganisho"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Vilivyounganishwa awali"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Andika kwenye sehemu za maandishi"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Puuza mibofyo yote ya kitufe cha stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Kushiriki faili ya sauti"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Shiriki faili ya sauti"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Simu na kengele"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Unganisha kwenye mtiririko wa LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Mitiririko ya maudhui ya sauti iliyo karibu nawe"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Mitiririko ya maudhui ya sauti"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Unganisha kwenye mtiririko wa maudhui ya sauti ukitumia msimbo wa QR"</string>
<string name="date_and_time" msgid="1788358029823431692">"Tarehe na saa"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Seva mbadala"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Futa"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Nafasi ya Faragha"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ficha programu katika folda ya faragha"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Fungua ukitumia mbinu ya kufunga skrini"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Onyesha Nafasi ya Faragha"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ficha wakati umefunga"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ficha Nafasi ya Faragha wakati umefunga"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Ili Nafasi ya Faragha isionekane na wengine wanaotumia kifaa chako, ifiche kwenye orodha ya programu"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Fikia Nafasi ya Faragha wakati imefichwa"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Tafuta \'Nafasi ya Faragha\' kwenye upau wa kutafutia"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Gusa kigae cha Nafasi ya Faragha"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Fungua Nafasi yako ya Faragha"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Umezima"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Umewasha"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Mfumo"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Buni Nafasi ya Faragha"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Futa Nafasi ya Faragha"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Imeshindwa kubuni Nafasi ya Faragha"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Imefuta Nafasi ya Faragha"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Imeshindwa kufuta Nafasi ya Faragha"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Weka mbinu ya kufunga skrini"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Ili utumie Chumba cha Faragha weka mbinu ya kufunga skrini kwenye kifaa hiki."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Weka mbinu ya kufunga skrini"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Ghairi"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Ghairi"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Weka mipangilio"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Weka mipangilio ya Nafasi ya Faragha"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Ficha programu za faragha katika sehemu salama isiyoweza kufikiwa na mtu mwingine"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Jinsi inavyofanya kazi"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Unaweza kufikia Nafasi ya Faragha kwenye sehemu ya chini ya orodha ya programu zako"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Programu katika Nafasi ya Faragha zinalindwa kupitia mbinu ya kufunga"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Arifa za programu kwenye Nafasi ya Faragha hufichwa wakati imefungwa"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Programu za Nafasi ya Faragha hazitaonekana kwenye kidhibiti cha ruhusa, dashibodi ya faragha na mipangilio mingine wakati umefunga Nafasi ya Faragha"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Inaweka mipangilio ya Nafasi ya Faragha…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Nafasi ya Faragha hulindwa kwa mbinu ya kufunga"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Maelezo ya matumizi ya programu za Nafasi ya Faragha yamefichwa wakati imefungwa"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Fikia Nafasi ya Faragha kwenye orodha ya programu zako"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Imeshindwa kuweka mipangilio ya Nafasi ya Faragha"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Jaribu tena sasa, au urudi baadaye"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Jaribu Tena"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Ungependa kutumia mbinu ya kufungua skrini?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Unaweza kufungua Nafasi ya Faragha kwa mbinu unayotumia kufungua kifaa chako, au kuchagua mbinu tofauti ya kufunga"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Tumia mbinu ya kufunga skrini"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Chagua mbinu mpya ya kufunga"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Uko tayari kuanza!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Ili ufikie Nafasi ya Faragha, telezesha kidole kuelekea juu kutoka sehemu ya chini ya skrini yako ya kwanza, kisha usogeze chini"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Nimemaliza"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Sogeza chini ili ufikie Nafasi ya Faragha"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Unaweza kuongeza hadi alama za vidole <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Umeongeza idadi ya juu inayoruhusiwa ya alama za kidole"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Haiwezi kuongeza alama zaidi za kidole"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Endelea kutumia programu ukiwa umekunja"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Onyesho Laini"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Huongeza kiotomatiki kiwango cha kuonyesha upya kutoka Hz 60 hadi Hz <xliff:g id="ID_1">%1$s</xliff:g> kwa baadhi ya maudhui. Huongeza matumizi ya betri."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Hupandisha kiotomatiki kiwango cha kuonyesha upya hadi Hz <xliff:g id="ID_1">%1$d</xliff:g> kwa baadhi ya maudhui. Huongeza matumizi ya betri."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Lazimisha kiwango cha juu cha kuonyesha upya"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Kiwango cha juu kabisa cha kuonyesha upya kwa utendakazi wa mguso ulioboreshwa na ubora wa uhuishaji. Huongeza matumizi ya betri."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Utashi wa skrini"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Mipangilio ya jumuiya"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Badilisha mahali pa kufikia"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Weka mlango wa mtandao"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Haijawekwa"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Haijawekwa"</string>
<string name="apn_name" msgid="6677695784108157953">"Jina"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Tumia kitufe cha ufikivu kufungua"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Shikilia vitufe vya sauti ili ufungue"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Gusa skrini mara tatu ili ufungue"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Gusa skrini mara tatu kwa vidole viwili ili ufungue"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Tumia ishara ili ufungue"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Tumia ishara ya ufikivu"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Ili utumie kipengele hiki, gusa kitufe cha zana za ufikivu cha <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> katika sehemu ya chini ya skrini yako.\n\nIli ubadilishe kati ya vipengele, gusa na ushikilie kitufe cha zana za ufikivu."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Ili utumie kipengele hiki, gusa kitufe cha zana za ufikivu kwenye skrini yako."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Ili utumie kipengele hiki, bonyeza na ushikilie vitufe vyote viwili vya sauti."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Ili uanzishe na kusimamisha ukuzaji, gusa mara tatu mahali popote kwenye skrini yako."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Ili uanze au ukomeshe ukuzaji, gusa mara tatu mahali popote kwenye skrini yako kwa vidole viwili."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Ili utumie kipengele hiki, telezesha vidole viwili juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole viwili juu na ushikilie."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Ili utumie kipengele hiki, telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole vitatu juu na ushikilie."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Ili utumie kipengele cha ufikivu, telezesha vidole viwili juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole viwili juu na ushikilie."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Shikilia vitufe vya sauti"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"shikilia vitufe vya sauti"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Bonyeza na ushikilie vitufe vyote viwili vya sauti"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Gusa skrini mara tatu kwa vidole viwili"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"gusa skrini mara tatu kwa vidole viwili"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Gusa skrini kwa haraka mara {0,number,integer} kwa vidole viwili"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Gusa skrini mara tatu"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"gusa skrini mara tatu"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Gusa skrini mara {0,number,integer} kwa haraka. Huenda njia hii ya mkato ikapunguza kasi ya kifaa chako"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Tumia mtetemo na miguso"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Mtetemo wa kengele"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Mtetemo wa maudhui"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Mtetemo wa kibodi"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Mtetemo wa mlio"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Mtetemo wa arifa"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Mtetemo kifaa kinapoguswa"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Ikiwa utadhibiti shughuli za chini chini za programu, huenda isifanye kazi vizuri"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Kwa kuwa programu hii haiboreshi matumizi ya betri, huwezi kuizuia.\n\nIli uizuie, washa kuboresha matumizi ya betri."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Dhibiti matumizi ya betri"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Ruhusu matumizi ya chinichini"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"Washa upate masasisho katika wakati halisi, zima ili uokoe betri"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Yasiyodhibitiwa"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Yaliyoboreshwa"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Yanayodhibitiwa"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ukubwa wa maandishi, chapa kubwa, fonti kubwa, maandishi makubwa, uwezo mdogo wa kuona, ongeza ukubwa wa maandishi, kikuza fonti, kuongeza ukubwa wa fonti"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"onyesho tulivu lisilozimwa kamwe, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tagi, kisomaji"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"kibodi, miguso, mtetemo,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Kiwango cha sauti, mtetemo, Usinisumbue"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Sauti ya maudhui"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Sauti ya maudhui ya kutumwa"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Ruhusu ufikiaji ili idhibiti faili zote"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Ruhusu programu hii isome, irekebishe na kufuta faili zote kwenye kifaa hiki au nafasi zozote za hifadhi zilizounganishwa. Ukiipa ruhusa, huenda programu ikafikia faili bila ufahamu wako."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Inaweza kufikia faili zote"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Arifa za skrini nzima"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Ruhusu programu hii ionyeshe arifa kwenye skrini nzima"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Ruhusu programu hii ionyeshe arifa kwenye skrini nzima ukiwa umefunga kifaa. Programu zinaweza kutumia arifa hizi kuonyesha kengele, simu unazopigiwa au arifa nyingine muhimu."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Kagua shughuli kwenye programu ili kubaini iwapo kuna wizi wa data binafsi"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Tumia ukaguzi"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Tumia ukaguzi kwa programu za kazini"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Ukaguzi huendeshwa kwa faragha kwenye kifaa chako kukagua shughuli kwenye programu ili kubaini iwapo kuna wizi wa data binafsi au tabia nyingine ya udanganyifu. Ikitambuliwa, maelezo fulani ya programu hutumwa kwa Google Play Protect ili kuthibitisha tishio na kutoa tahadhari kwa watumiaji wa programu."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Hiki ni kipengele cha usalama kinacholindwa. Hakuna taarifa binafsi au maelezo ya kifaa yanayoshirikiwa kwa Google. \n\nWizi wa data binafsi ni jaribio la kuiba vitambulisho vya kuingia katika akaunti au taarifa nyingine binafsi."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 117471d..3fe2c8b 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"புளூடூத் LE ஆடியோவை முடக்கு"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"LE ஆடியோ துணைப் பொருள் திறன்களைச் சாதனம் ஆதரித்தால் புளூடூத் LE ஆடியோ அம்சத்தை முடக்கும்."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"சாதன விவரங்களில் LE ஆடியோ டாகிளை காட்டு"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"புளூடூத் LE ஆடியோ ஏற்புப் பட்டியலை பைபாஸ் செய்தல்"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ஏற்புப் பட்டியல் நிபந்தனைகளை LE ஆடியோ வெளிப்புறச் சாதனம் பூர்த்திசெய்கிறதா என்று சரிபார்க்கப்படவில்லை என்றாலும் LE ஆடியோவை இயல்பாகப் பயன்படுத்தும்."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"மீடியா சாதனங்கள்"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"அழைப்பதற்கான சாதனங்கள்"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"பிற சாதனங்கள்"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"சேமிக்கப்பட்ட சாதனங்கள்"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"கணக்குடன் தொடர்புடையது"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ஏற்கெனவே பயன்படுத்திய கணக்கு"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"இணைப்பதற்கு, புளூடூத் ஆன் செய்யப்படும்"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"இணைப்பு விருப்பத்தேர்வுகள்"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"இதற்கு முன்னர் இணைத்தவை"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"எழுதுவதற்கான புலங்களில் எழுதுங்கள்"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ஸ்டைலஸ் மூலம் பட்டன்களை அழுத்துவதைத் தவிர்த்தல்"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"ஸ்டைலஸ்"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ஆடியோவைப் பகிர்தல்"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ஆடியோவைப் பகிர்"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"அழைப்புகளும் அலாரங்களும்"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"தேதி & நேரம்"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ப்ராக்ஸி"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"அழி"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"தனிப்பட்ட சேமிப்பிடம்"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ஆப்ஸைத் தனிப்பட்ட ஃபோல்டரில் மறைக்கலாம்"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"திரைப் பூட்டைப் பயன்படுத்தி அன்லாக் செய்தல்"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"தனிப்பட்ட சேமிப்பிடத்தைக் காட்டுதல்"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"பூட்டப்பட்டிருக்கும்போது மறைத்தல்"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"பூட்டப்பட்டிருக்கும்போது தனிப்பட்ட சேமிப்பிடத்தை மறைத்தல்"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"சாதனத்தில் உள்ள தனிப்பட்ட சேமிப்பிடத்தைப் பிறர் அறியக்கூடாதெனில், உங்கள் ஆப்ஸ் பட்டியலில் இருந்து அதை மறைக்கலாம்"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"மறைக்கப்பட்டிருக்கும்போது தனிப்பட்ட சேமிப்பிடத்தை அணுகுதல்"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"தேடல் பட்டியில் \'தனிப்பட்ட சேமிப்பிடம்\' எனத் தேடுங்கள்"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"தனிப்பட்ட சேமிப்பிடக் கட்டத்தைத் தட்டுங்கள்"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"உங்கள் தனிப்பட்ட சேமிப்பிடத்தை அன்லாக் செய்யுங்கள்"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"முடக்கப்பட்டுள்ளது"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"இயக்கப்பட்டுள்ளது"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"சிஸ்டம்"</string>
<string name="private_space_create_title" msgid="47273568884806726">"தனிப்பட்ட சேமிப்பிடத்தை உருவாக்குதல்"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"தனிப்பட்ட சேமிப்பிடத்தை நீக்குதல்"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"தனிப்பட்ட சேமிப்பிடத்தை உருவாக்க முடியவில்லை"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"தனிப்பட்ட சேமிப்பிடம் நீக்கப்பட்டது"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"தனிப்பட்ட சேமிப்பிடத்தை நீக்க முடியவில்லை"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"திரைப் பூட்டை அமையுங்கள்"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"தனிப்பட்ட சேமிப்பிடத்தை உபயோகிக்க, திரைப் பூட்டை அமைக்கவும்."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"திரைப் பூட்டை அமை"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ரத்துசெய்"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ரத்துசெய்"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"அமை"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"தனிப்பட்ட சேமிப்பிடத்தை அமைத்தல்"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"நீங்கள் மட்டுமே அணுகக்கூடிய பாதுகாப்பான இடத்தில் தனிப்பட்ட ஆப்ஸை மறைக்கலாம்"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"இது செயல்படும் விதம்"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"உங்கள் ஆப்ஸ் பட்டியலின் கீழ்ப்பகுதியில் இருந்து தனிப்பட்ட சேமிப்பிடத்தை அணுகலாம்"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"தனிப்பட்ட சேமிப்பிடத்தில் உள்ள ஆப்ஸ் ஒரு பூட்டால் பாதுகாக்கப்படுகின்றன"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"தனிப்பட்ட சேமிப்பிடம் பூட்டப்பட்டிருக்கும்போது அதிலுள்ள ஆப்ஸின் அறிவிப்புகள் மறைக்கப்படும்"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"தனிப்பட்ட சேமிப்பிடம் பூட்டப்பட்டிருக்கும்போது அதிலுள்ள ஆப்ஸ், அனுமதி நிர்வாகம், தனியுரிமை டாஷ்போர்டு மற்றும் பிற அமைப்புகளில் காட்டப்படாது"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"தனிப்பட்ட சேமிப்பிடத்தை அமைக்கிறது…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"தனிப்பட்ட சேமிப்பிடம் பூட்டு மூலம் பாதுகாக்கப்படுகிறது"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"தனிப்பட்ட சேமிப்பிடம் பூட்டப்பட்டிருக்கும்போது அதிலுள்ள ஆப்ஸின் உபயோகத் தகவல்கள் மறைக்கப்படும்"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"ஆப்ஸ் பட்டியலில் உள்ள தனிப்பட்ட சேமிப்பிடத்தை அணுகுதல்"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"தனிப்பட்ட சேமிப்பிடத்தை அமைக்க முடியவில்லை"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"இப்போது முயலவும் அல்லது பிறகு வந்து பார்க்கவும்"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"மீண்டும் முயல்க"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"அன்லாக் செய்ய திரைப் பூட்டைப் பயன்படுத்தவா?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"உங்கள் சாதனத்தை அன்லாக் செய்வதுபோலவே தனிப்பட்ட சேமிப்பிடத்தை அன்லாக் செய்யலாம் அல்லது வேறு பூட்டைத் தேர்ந்தெடுக்கலாம்"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"திரைப் பூட்டைப் பயன்படுத்து"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"புதிய பூட்டைத் தேர்ந்தெடு"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"எல்லாம் தயார்!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"தனிப்பட்ட சேமிப்பிடத்தை அணுக, முகப்புத் திரையின் கீழிருந்து மேல்நோக்கி ஸ்வைப் செய்து பின்பு கீழே செல்லவும்"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"முடிந்தது"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"தனிப்பட்ட சேமிப்பிடத்தை அணுக கீழே செல்லவும்"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"<xliff:g id="COUNT">%d</xliff:g> கைரேகைகள் வரை சேர்க்கலாம்"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"அனுமதிக்கப்படும் அதிகபட்சக் கைரேகைகளைச் சேர்த்துவிட்டீர்கள்"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"மேலும் கைரேகைகளைச் சேர்க்க முடியவில்லை"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"மடக்கிய நிலையிலேயே தொடர்ந்து ஆப்ஸைப் பயன்படுத்துதல்"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"சீரான காட்சி"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"சில உள்ளடக்கத்திற்கான புதுப்பிக்கும் விகிதத்தை 60 Hzல் இருந்து <xliff:g id="ID_1">%1$s</xliff:g> Hzக்குத் தானாகவே உயர்த்தும். பேட்டரி உபயோகத்தை அதிகரிக்கும்."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"சில உள்ளடக்கத்திற்குப் புதுப்பிக்கும் விகிதத்தை <xliff:g id="ID_1">%1$d</xliff:g> Hzக்குத் தானாகவே உயர்த்தும். பேட்டரி உபயோகத்தை அதிகரிக்கும்."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"கட்டாயமான அதிகபட்ச ரெஃப்ரெஷ் விகிதம்"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"மேம்பட்ட தொடு இயக்கத்திறனுக்கும் அனிமேஷன் தரத்திற்குமான அதிவேக ரெஃப்ரெஷ் விகிதம். இதனால் பேட்டரி உபயோகம் அதிகரிக்கும்."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"திரை மீது கவனம்"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"சமூக அமைப்புகள்"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN பட்டியல்"</string>
<string name="apn_edit" msgid="2003683641840248741">"ஆக்சஸ் பாயிண்ட்டைத் திருத்து"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"அமைக்கப்படவில்லை"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"அமைக்கப்படவில்லை"</string>
<string name="apn_name" msgid="6677695784108157953">"பெயர்"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"திறக்க அணுகல்தன்மை பட்டனைப் பயன்படுத்துதல்"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"திறக்க ஒலியளவு விசைகளைப் பிடித்திருக்கவும்"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"திறக்க திரையில் 3 முறை தட்டவும்"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"இரண்டு விரல்களால் திரையில் மூன்று முறை தட்டி திறத்தல்"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"திறக்க சைகைகளைப் பயன்படுத்துதல்"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"அணுகல்தன்மை சைகையைப் பயன்படுத்தவும்"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"இந்த அம்சத்தைப் பயன்படுத்த திரையின் கீழ்ப்பகுதியில் உள்ள அணுகல்தன்மை பட்டனை <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> தட்டவும்.\n\nஅம்சங்களுக்கு இடையே மாற, அணுகல்தன்மை பட்டனைத் தொட்டுப் பிடித்திருக்கவும்."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"இந்த அம்சத்தைப் பயன்படுத்த, உங்கள் திரையிலுள்ள அணுகல்தன்மை பட்டனைத் தட்டுங்கள்."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"இந்த அம்சத்தைப் பயன்படுத்த ஒலியளவுக்கான விசைகளை அழுத்திப் பிடித்திருக்கவும்."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"பெரிதாக்குவதைத் தொடங்கவும் நிறுத்தவும், திரையில் எங்காவது மூன்று முறை தட்டவும்."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"பெரிதாக்குவதைத் தொடங்கவும் நிறுத்தவும், திரையில் எங்காவது இரண்டு விரல்களால் மூன்று முறை தட்டவும்."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"இந்த அம்சத்தைப் பயன்படுத்த திரையின் கீழிருந்து மேலாக 2 விரல்களால் ஸ்வைப் செய்யவும்.\n\nஅம்சங்களுக்கு இடையே மாற 2 விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடித்திருக்கவும்."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"இந்த அமசத்தைப் பயன்படுத்த திரையின் கீழிருந்து மேலாக 3 விரல்களால் ஸ்வைப் செய்யவும்.\n\nஅம்சங்களுக்கு இடையே மாற 3 விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடித்திருக்கவும்."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"அணுகல்தன்மை அம்சத்தைப் பயன்படுத்த திரையின் கீழிருந்து மேலாக 2 விரல்களால் ஸ்வைப் செய்யவும்.\n\nஅம்சங்களுக்கு இடையே மாற 2 விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடித்திருக்கவும்."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"ஒலியளவுக்கான விசைகளைப் பிடிக்கவும்"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ஒலியளவு விசைகளைப் பிடித்திருக்கவும்"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"இரண்டு ஒலியளவு விசைகளையும் அழுத்திப் பிடித்திருக்கவும்"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"இரண்டு விரல்களால் திரையில் மூன்று முறை தட்டுதல்"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"இரண்டு விரல்களால் திரையில் மூன்று முறை தட்டுதல்"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"இரண்டு விரல்களால் திரையில் {0,number,integer} முறை விரைவாகத் தட்டுங்கள்"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"திரையில் மூன்று முறை தட்டுதல்"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"திரையில் மூன்று முறை தட்டவும்"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"திரையை விரைவாக {0,number,integer} முறை தட்டவும். இந்த ஷார்ட்கட் உங்கள் சாதனத்தின் வேகத்தைக் குறைக்கக்கூடும்"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"அதிர்வு & ஹாப்டிக்ஸைப் பயன்படுத்துதல்"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"அலார அதிர்வு"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"மீடியா அதிர்வு"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"கீபோர்டு அதிர்வு"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"ரிங் அதிர்வு"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"அறிவிப்பு அதிர்வு"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"தொட்டு கருத்து தெரிவித்தல்"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"ஆப்ஸின் பின்னணி செயல்பாட்டைக் கட்டுப்படுத்தினால், சரியாக வேலை செய்யாது."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"பேட்டரியை மேம்படுத்த அமைக்கப்படவில்லை, எனவே கட்டுப்படுத்த முடியாது.\n\nஆப்ஸை கட்டுப்படுத்த, பேட்டரி மேம்படுத்தலை ஆன் செய்க."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"பேட்டரி உபயோகத்தை நிர்வகித்தல்"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"கட்டுப்பாடற்ற பேட்டரி"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"மேம்படுத்தப்பட்டது"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"வரம்பிடப்பட்டது"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"உரை அளவு, பெரிய அச்சு, பெரிய எழுத்து, பெரிய உரை, குறைந்த பார்வைத்திறன், உரையைப் பெரிதாக்குதல், எழுத்துப் பெரிதாக்கி, எழுத்தைப் பெரிதாக்குவது"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"எப்போதும் ஆம்பியன்ட் டிஸ்பிளேயில், AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, குறி, ரீடர்"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"கீபோர்டு, ஹாப்டிக்ஸ், அதிர்வு,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ஒலியளவு, அதிர்வு, தொந்தரவு செய்யாதே"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"மீடியா ஒலியளவு"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"அலைபரப்புவதற்கான ஒலியளவு"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ஃபைல்கள் அனைத்தையும் நிர்வகிப்பதற்கு அனுமதி"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"இந்த சாதனத்திலோ இணைக்கப்பட்டுள்ள சேமிப்பகங்களிலோ உள்ள ஃபைல்கள் அனைத்தையும் படிக்கவும் நீக்கவும் அவற்றில் மாற்றங்களைச் செய்யவும் இந்த ஆப்ஸை அனுமதிக்கும். அனுமதி வழங்கப்படும் பட்சத்தில் உங்களுக்குத் தெரியாமலேயே ஃபைல்களை ஆப்ஸ் அணுகக்கூடும்."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"அனைத்து ஃபைல்களையும் அணுகமுடிந்த ஆப்ஸ்"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"முழுத்திரை அறிவிப்புகள்"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"இந்த ஆப்ஸிலிருந்து முழுத்திரை அறிவிப்புகளைக் காட்ட அனுமதித்தல்"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"சாதனம் பூட்டப்பட்டிருக்கும்போது முழுத்திரையில் அறிவிப்புகளைக் காட்ட இந்த ஆப்ஸை அனுமதிக்கும். அலாரங்கள், உள்வரும் அழைப்புகள் அல்லது பிற அவசர அறிவிப்புகளைத் தனிப்படுத்திக் காட்ட ஆப்ஸ் இவற்றைப் பயன்படுத்தக்கூடும்."</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"நீங்கள் நிறுவிய ஆப்ஸால் உங்கள் சாதனத்தின் பெயரைப் பார்க்க முடியும். புளூடூத் சாதனங்கள், வைஃபை நெட்வொர்க் ஆகியவற்றுடன் இணைக்கும்போதோ வைஃபை ஹாட்ஸ்பாட்டை அமைக்கும்போதோ அப்பெயர் பிறருக்கும் காட்டப்படக்கூடும்."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"இலக்கணப் பாலினம்"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"இலக்கணப் பாலினத்தைத் தேர்ந்தெடுத்தல்"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"ஏமாற்றுகின்ற ஆப்ஸிற்கு ஸ்கேன் செய்தல்"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"ஃபிஷிங்கிற்கான ஆப்ஸ் உபயோகத்தைப் பாருங்கள்"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ஸ்கேனிங்கைப் பயன்படுத்துதல்"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"பணி ஆப்ஸிற்கு ஸ்கேனிங்கைப் பயன்படுத்துதல்"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 4bfccdc..eaa63ba 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"బ్లూటూత్ LE ఆడియోను డిజేబుల్ చేయండి"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"పరికరం LE ఆడియో హార్డ్వేర్ సామర్థ్యాలను సపోర్ట్ చేస్తే బ్లూటూత్ LE ఆడియో ఫీచర్ని డిజేబుల్ చేస్తుంది."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"పరికర వివరాలలో LE ఆడియో టోగుల్ను చూపండి"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"బ్లూటూత్ LE ఆడియో వైట్లిస్ట్ను బైపాస్ చేయండి"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"వైట్లిస్ట్ ప్రమాణాలకు అనుగుణంగా LE ఆడియో పెరిఫెరల్ వెరిఫై చేయబడనప్పటికీ ఆటోమేటిక్గా LE ఆడియోను ఉపయోగించండి."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"మీడియా పరికరాలు"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"కాల్ పరికరాలు"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"ఇతర పరికరాలు"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"సేవ్ చేసిన పరికరాలు"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"ఈ ఖాతాతో అనుబంధించబడిన పరికరాలు"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ఖాతాతో గతంలో ఉపయోగించబడింది"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"పెయిరింగ్ కోసం బ్లూటూత్ ఆన్ చేయబడుతుంది"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"కనెక్షన్ ప్రాధాన్యతలు"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"ఇంతకు మునుపు కనెక్ట్ చేయబడినవి"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"టెక్స్ట్ ఫీల్డ్లలో రాయండి"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"అన్ని స్టైలస్ బటన్ ప్రెస్లను విస్మరించండి"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"స్టైలస్"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"ఆడియో షేరింగ్"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"ఆడియోను షేర్ చేయండి"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"కాల్స్, అలారాలు"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE ఆడియో స్ట్రీమ్కు కనెక్ట్ చేయండి"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"సమీపంలోని ఆడియో స్ట్రీమ్లు"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"ఆడియో స్ట్రీమ్లు"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR కోడ్ను ఉపయోగించి ఆడియో స్ట్రీమ్కు కనెక్ట్ చేయండి"</string>
<string name="date_and_time" msgid="1788358029823431692">"తేదీ & సమయం"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"ప్రాక్సీ"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"క్లియర్ చేయండి"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"ప్రైవేట్ స్పేస్"</string>
<string name="private_space_summary" msgid="8237652417163408001">"యాప్లను ప్రైవేట్ ఫోల్డర్లో దాచండి"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"స్క్రీన్ లాక్ను ఉపయోగించి అన్లాక్ చేయండి"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"ప్రైవేట్ స్పేస్ను చూడండి"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"లాక్ చేయబడినప్పుడు దాచండి"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"లాక్ చేయబడినప్పుడు ప్రైవేట్ స్పేస్ను దాచండి"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"మీ పరికరంలో ప్రైవేట్ స్పేస్ ఉందని ఇతర వ్యక్తులకు తెలియకుండా ఆపడానికి, మీరు దానిని మీ యాప్ల లిస్ట్లో దాచవచ్చు"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"దాచినప్పుడు ప్రైవేట్ స్పేస్ను యాక్సెస్ చేయండి"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"సెర్చ్ బార్లో \'ప్రైవేట్ స్పేస్\' కోసం సెర్చ్ చేయండి"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"ప్రైవేట్ స్పేస్ టైల్ను ట్యాప్ చేయండి"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"మీ ప్రైవేట్ స్పేస్ను అన్లాక్ చేయండి"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ఆఫ్లో ఉంది"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"ఆన్లో ఉంది"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"సిస్టమ్"</string>
<string name="private_space_create_title" msgid="47273568884806726">"ప్రైవేట్ స్పేస్ను క్రియేట్ చేయండి"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ప్రైవేట్ స్పేస్ను తొలగించండి"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"ప్రైవేట్ స్పేస్ను క్రియేట్ చేయడం సాధ్యం కాలేదు"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ప్రైవేట్ స్పేస్ విజయవంతంగా తొలగించబడింది"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ప్రైవేట్ స్పేస్ను తొలగించడం సాధ్యం కాలేదు"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"స్క్రీన్ లాక్ను సెట్ చేయండి"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"ప్రైవేట్ స్పేస్ కోసం, ఈ పరికరంలో స్క్రీన్ లాక్ సెట్ చేయండి."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"స్క్రీన్ లాక్ను సెట్ చేయండి"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"రద్దు చేయండి"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"రద్దు చేయండి"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"సెటప్ చేయండి"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ప్రైవేట్ స్పేస్ను సెటప్ చేయండి"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"మీరు మాత్రమే యాక్సెస్ చేయగల సెక్యూర్ స్పేస్లో ప్రైవేట్ యాప్లను దాచండి"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"ఇది ఎలా పని చేస్తుంది"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"మీరు మీ యాప్ల జాబితా కింద నుండి ప్రైవేట్ స్పేస్ను యాక్సెస్ చేయవచ్చు"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"ప్రైవేట్ స్పేస్లోని యాప్లు లాక్ చేయడం ద్వారా రక్షించబడతాయి"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"ప్రైవేట్ స్పేస్ లాక్ అయ్యి ఉన్నప్పుడు, అందులోని యాప్ల నుండి నోటిఫికేషన్లు రావు"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"ప్రైవేట్ స్పేస్ లాక్ అయ్యి ఉన్నప్పుడు, అందులోని యాప్లు అనుమతి మేనేజర్లో, గోప్యతా డ్యాష్బోర్డ్లో, ఇతర సెట్టింగ్లలో కనిపించవు"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"ప్రైవేట్ స్పేస్ సెటప్ ప్రోగ్రెస్లో ఉంది…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"ప్రైవేట్ స్పేస్కు లాక్ రక్షణ ఉంటుంది"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ప్రైవేట్ స్పేస్ లాక్ అయ్యి ఉన్నప్పుడు, అందులోని యాప్లకు సంబంధించిన వినియోగ సమాచారం దాచబడి ఉంటుంది"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"మీ యాప్ల లిస్ట్ నుండి ప్రైవేట్ స్పేస్ను యాక్సెస్ చేయండి"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ప్రైవేట్ స్పేస్ను సెటప్ చేయడం సాధ్యపడలేదు"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ఇప్పుడే మళ్లీ ట్రై చేయండి, లేదా తర్వాత తిరిగి రండి"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"మళ్లీ ట్రై చేయండి"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"అన్లాకింగ్కు స్క్రీన్ లాక్ వాడాలనుకుంటున్నారా?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"మీరు మీ పరికరాన్ని ఎలా అయితే అన్లాక్ చేస్తారో, అలాగే ప్రైవేట్ స్పేస్ను అన్లాక్ చేయవచ్చు, లేదా వేరే లాక్ను ఎంచుకోవచ్చు"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"స్క్రీన్ లాక్ను ఉపయోగించండి"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"కొత్త లాక్ను ఎంచుకోండి"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"సెటప్ పూర్తయింది!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"ప్రైవేట్ స్పేస్ను యాక్సెస్ చేయడానికి, మీ మొదటి స్క్రీన్ కింది నుండి పైకి స్వైప్ చేసి, ఆపై కిందికి స్క్రోల్ చేయండి"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"పూర్తయింది"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"ప్రైవేట్ స్పేస్ యాక్సెస్ చేయడానికి కిందికి స్క్రోల్ చేయండి"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"మీరు గరిష్ఠంగా <xliff:g id="COUNT">%d</xliff:g> వేలిముద్రలను జోడించవచ్చు"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"మీరు గరిష్ట సంఖ్యలో వేలిముద్రలను జోడించారు"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"మరిన్ని వేలిముద్రలను జోడించడం సాధ్యపడదు"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ఫోల్డ్లో ఉన్న యాప్లను ఉపయోగించడం కొనసాగించండి"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"స్మూత్ డిస్ప్లే"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"కొంత కంటెంట్ కోసం రిఫ్రెష్ రేటును ఆటోమేటిక్గా 60 నుండి <xliff:g id="ID_1">%1$s</xliff:g> Hz వరకు పెంచుతుంది. బ్యాటరీ వినియోగం పెరుగుతుంది."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"కొంత కంటెంట్ విషయంలో, రిఫ్రెష్ రేటును ఆటోమేటిక్గా <xliff:g id="ID_1">%1$d</xliff:g> Hz వరకు పెంచుతుంది. బ్యాటరీ వినియోగం పెరుగుతుంది."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"ఫోర్స్ పీక్ రిఫ్రెష్ రేటు"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"మెరుగైన స్పర్శ ప్రతిస్పందన & యానిమేషన్ క్వాలిటీ కోసం అత్యధిక రిఫ్రెష్ రేటు. ఇది బ్యాటరీ వినియోగం పెరిగేలా చేస్తుంది."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"స్క్రీన్ అటెన్షన్"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"కమ్యూనల్ సెట్టింగ్లు"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNలు"</string>
<string name="apn_edit" msgid="2003683641840248741">"యాక్సెస్ పాయింట్ను ఎడిట్ చేయండి"</string>
+ <string name="apn_add" msgid="9069613192201630934">"యాక్సెస్ పాయింట్ను జోడించండి"</string>
<string name="apn_not_set" msgid="8246646433109750293">"సెట్ చేయలేదు"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"సెట్ చేయలేదు"</string>
<string name="apn_name" msgid="6677695784108157953">"పేరు"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"తెరవడానికి యాక్సెసిబిలిటీ బటన్ను ఉపయోగించండి"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"తెరవడానికి వాల్యూమ్ కీలను పట్టుకుని అలాగే ఉండండి"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"తెరవడానికి స్క్రీన్పై మూడు సార్లు ట్యాప్ చేయండి"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"తెరవడానికి రెండు వేళ్లతో స్క్రీన్ను మూడుసార్లు ట్యాప్ చేయండి"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"తెరవడానికి సంజ్ఞను ఉపయోగించండి"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"యాక్సెసిబిలిటీ సంజ్ఞను ఉపయోగించండి"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"ఈ ఫీచర్ను ఉపయోగించడానికి, మీ స్క్రీన్ దిగువన ఉన్న యాక్సెసిబిలిటీ బటన్ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>ను ట్యాప్ చేయండి.\n\nఫీచర్ల మధ్య స్విచ్ అవడానికి, యాక్సెసిబిలిటీ బటన్ను నొక్కి & పట్టుకోండి."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"ఈ ఫీచర్ను ఉపయోగించడానికి, మీ స్క్రీన్ మీద ఉన్న యాక్సెసిబిలిటీ బటన్ను ట్యాప్ చేయండి."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"ఈ ఫీచర్ను ఉపయోగించడానికి, రెండు వాల్యూమ్ కీలను నొక్కి, పట్టుకోండి."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"మ్యాగ్నిఫికేషన్ను ప్రారంభించడానికి అలాగే ఆపడానికి, మీ స్క్రీన్పై ఎక్కడైనా మూడు సార్లు ట్యాప్ చేయండి."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"మ్యాగ్నిఫికేషన్ను ప్రారంభించడానికి, ఆపడానికి స్క్రీన్పై ఎక్కడైనా 2 వేళ్లతో 3 సార్లు ట్యాప్ చేయండి."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"ఈ ఫీచర్ను ఉపయోగించడానికి, స్క్రీన్ దిగువ నుండి 2 వేళ్లతో పైకి స్వైప్ చేయండి.\n\nఫీచర్ల మధ్య స్విచ్ అవడానికి, 2 వేళ్లతో పైకి స్వైప్ చేసి పట్టుకోండి."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"ఈ ఫీచర్ను ఉపయోగించడానికి, స్క్రీన్ దిగువ నుండి 3 వేళ్లతో పైకి స్వైప్ చేయండి.\n\nఫీచర్ల మధ్య స్విచ్ అవడానికి, 3 వేళ్లతో పైకి స్వైప్ చేసి పట్టుకోండి."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"యాక్సెస్ సౌలభ్య ఫీచర్లను ఉపయోగించడానికి, స్క్రీన్ దిగువ నుండి 2 వేళ్లతో పైకి స్వైప్ చేయండి.\n\nఫీచర్ల మధ్య స్విచ్ అవడానికి, 2 వేళ్లతో పైకి స్వైప్ చేసి పట్టుకోండి."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"వాల్యూమ్ కీలను నొక్కి ఉంచండి"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"వాల్యూమ్ కీలను పట్టుకుని అలాగే ఉండండి"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"వాల్యూమ్ కీలు రెండింటినీ నొక్కి పట్టుకోండి"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"రెండు వేళ్లతో స్క్రీన్ను మూడుసార్లు ట్యాప్ చేయండి"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"రెండు వేళ్లతో స్క్రీన్ను మూడుసార్లు ట్యాప్ చేయండి"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"రెండు వేళ్లతో స్క్రీన్ను {0,number,integer} సార్లు ఫాస్ట్గా ట్యాప్ చేయండి"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"స్క్రీన్పై మూడు సార్లు నొక్కండి"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"స్క్రీన్పై మూడు సార్లు ట్యాప్ చేయండి"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"స్క్రీన్ను {0,number,integer} సార్లు త్వరగా ట్యాప్ చేయండి. ఈ షార్ట్కట్ వల్ల మీ పరికరం పనితీరు నెమ్మదించవచ్చు"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"\'వైబ్రేషన్ & ప్రతిస్పందనలు\' వాడండి"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"అలారం వైబ్రేషన్"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"మీడియా వైబ్రేషన్"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"కీబోర్డ్ వైబ్రేషన్"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"రింగ్ వైబ్రేషన్"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"నోటిఫికేషన్ వైబ్రేషన్"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"టచ్ ఫీడ్బ్యాక్"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"మీరు యాప్ నేపథ్య యాక్టివిటీని పరిమితం చేస్తే, అది సరిగ్గా పని చేయకపోవచ్చు."</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"ఈ యాప్ బ్యాటరీని ఆప్టిమైజ్ చేయికి సెట్ చేయబడలేదు కనుక, దీన్ని మీరు పరిమితం చేయలేరు.\n\nయాప్ను పరిమితం చేయడానికి, మొదట బ్యాటరీ ఆప్టిమైజేషన్ను ఆన్ చేయండి."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"బ్యాటరీ వినియోగాన్ని మేనేజ్ చేయండి"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"బ్యాక్గ్రౌండ్ వినియోగాన్ని అనుమతించండి"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"రియల్-టైమ్ అప్డేట్ల కోసం ఎనేబుల్ చేయండి, బ్యాటరీని సేవ్ చేయడానికి డిజేబుల్ చేయండి"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"అపరిమిత"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"ఆప్టిమైజ్ చేయబడినది"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"పరిమితం చేయబడిన సెట్టింగ్లు"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"టెక్స్ట్ సైజ్, పెద్ద ప్రింట్, పెద్ద ఫాంట్, పెద్ద టెక్స్ట్, తక్కువ విజన్, టెక్స్ట్ను పెద్దగా చేయి, ఫాంట్ పెద్దగా చేసేది, పెద్ద ఫాంట్"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ఎల్లప్పుడూ యాంబియెంట్ డిస్ప్లేలో, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, ట్యాగ్, రీడర్"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"కీబోర్డ్, స్పర్శ ప్రతిస్పందన టెక్నాలజీ, వైబ్రేట్,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"వాల్యూమ్, వైబ్రేషన్, అంతరాయం కలిగించవద్దు"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"మీడియా వాల్యూమ్"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ప్రసారం వాల్యూమ్"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"అన్ని ఫైళ్లను మేనేజ్ చేయడానికి అనుమతించండి"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ఈ పరికరంలో, లేదా కనెక్ట్ చేయబడిన ఏవైనా స్టోరేజ్ వాల్యూమ్లలో, అన్ని ఫైళ్లను చదవడానికి, మార్చడానికి, తొలగించడానికి ఈ యాప్నకు అనుమతిని ఇవ్వండి. అటువంటి అనుమతిని మీరు మంజూరు చేస్తే, మీకు ప్రత్యేకంగా తెలియపరచకుండానే మీ ఫైళ్లను యాప్, యాక్సెస్ చేయవచ్చు."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"అన్ని ఫైళ్లను యాక్సెస్ చేయగలవు"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"ఫుల్ స్క్రీన్ నోటిఫికేషన్లు"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"ఈ యాప్ నుండి ఫుల్ స్క్రీన్ నోటిఫికేషన్లను అనుమతించండి"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"పరికరం లాక్లో ఉన్నప్పుడు నోటిఫికేషన్లను చూపడానికి ఈ యాప్ను అనుమతించండి. ఈ నోటిఫికేషన్లు ఫుల్ స్క్రీన్లో కనిపిస్తాయి. అలారాలు, ఇన్కమింగ్ కాల్స్ లేదా ఇతర అత్యవసర నోటిఫికేషన్లను హైలైట్ చేయడానికి యాప్లు వీటిని ఉపయోగించవచ్చు."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ఫిషింగ్ కోసం యాప్ యాక్టివిటీని చెక్ చేయండి"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"స్కానింగ్ను ఉపయోగించండి"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"వర్క్ యాప్ల కోసం స్కానింగ్ను ఉపయోగించండి"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"స్కానింగ్ మీ పరికరంలో ప్రైవేట్గా జరుగుతుంది, ఇది ఫిషింగ్, ఇతర మోసపూరిత ప్రవర్తన కోసం యాప్ యాక్టివిటీని చెక్ చేస్తుంది. ఫిషింగ్ గుర్తించబడితే, ప్రమాదాన్ని నిర్ధారించి, యాప్ యూజర్లను అప్రమత్తం చేయడానికి కొంత యాప్ సమాచారం Google Play Protectకు పంపబడుతుంది."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"ఇది ఒక సురక్షిత సెక్యూరిటీ ఫీచర్. Googleతో పరికరం లేదా వ్యక్తిగత సమాచారం ఏదీ షేర్ చేయబడదు. \n\nఫిషింగ్ అనేది సైన్-ఇన్ ఆధారాలు లేదా ఇతర వ్యక్తిగత సమాచారాన్ని దొంగిలించే ఒక ప్రయత్నం."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 89fd921..71cb6bd 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"ปิดใช้ Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"ปิดใช้ฟีเจอร์ Bluetooth LE Audio หากอุปกรณ์รองรับความสามารถของฮาร์ดแวร์ LE Audio"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"แสดงปุ่มสลับ LE Audio ในรายละเอียดอุปกรณ์"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"ข้ามรายการที่อนุญาต Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"ใช้ LE Audio โดยค่าเริ่มต้นแม้ว่าอุปกรณ์ต่อพ่วง LE Audio จะไม่ได้รับการยืนยันว่าเป็นไปตามเกณฑ์รายการที่อนุญาตก็ตาม"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"อุปกรณ์สื่อ"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"อุปกรณ์สำหรับโทร"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"อุปกรณ์อื่นๆ"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"อุปกรณ์ที่บันทึกไว้"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"เชื่อมโยงกับบัญชี"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"ใช้กับบัญชีก่อนหน้านี้"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"บลูทูธจะเปิดเพื่อจับคู่อุปกรณ์"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"ค่ากำหนดการเชื่อมต่อ"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"อุปกรณ์ที่เคยเชื่อมต่อ"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"เขียนในช่องข้อความ"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"ไม่ต้องสนใจการกดปุ่มสไตลัสทั้งหมด"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"สไตลัส"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"การแชร์เสียง"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"แชร์เสียง"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"การโทรและการปลุก"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"เชื่อมต่อกับสตรีม LE Audio"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"สตรีมเสียงที่อยู่ใกล้เคียง"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"สตรีมเสียง"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"เชื่อมต่อกับสตรีมเสียงโดยใช้คิวอาร์โค้ด"</string>
<string name="date_and_time" msgid="1788358029823431692">"วันที่และเวลา"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"พร็อกซี"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"ล้างข้อมูล"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"พื้นที่ส่วนตัว"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ซ่อนแอปในโฟลเดอร์ส่วนตัว"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"ปลดล็อกโดยใช้ล็อกหน้าจอ"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"แสดงพื้นที่ส่วนตัว"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"ซ่อนเมื่อล็อก"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"ซ่อนพื้นที่ส่วนตัวเมื่อล็อกไว้"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"คุณซ่อนพื้นที่ส่วนตัวจากรายการแอปได้ เพื่อไม่ให้คนอื่นรู้ว่ามีพื้นที่ส่วนตัวอยู่ในอุปกรณ์ของคุณ"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"เข้าถึงพื้นที่ส่วนตัวเมื่อซ่อนไว้"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"ค้นหา \"พื้นที่ส่วนตัว\" ในแถบค้นหา"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"แตะการ์ดพื้นที่ส่วนตัว"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"ปลดล็อกพื้นที่ส่วนตัว"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"ปิด"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"เปิด"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"ระบบ"</string>
<string name="private_space_create_title" msgid="47273568884806726">"สร้างพื้นที่ส่วนตัว"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"ลบพื้นที่ส่วนตัว"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"สร้างพื้นที่ส่วนตัวไม่ได้"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"ลบพื้นที่ส่วนตัวเรียบร้อยแล้ว"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"ลบพื้นที่ส่วนตัวไม่ได้"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"ตั้งการล็อกหน้าจอ"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"หากต้องการใช้พื้นที่ส่วนตัว ให้ตั้งการล็อกหน้าจอในอุปกรณ์นี้"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"ตั้งล็อกหน้าจอ"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"ยกเลิก"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"ยกเลิก"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"ตั้งค่า"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"ตั้งค่าพื้นที่ส่วนตัว"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"ซ่อนแอปส่วนตัวในพื้นที่ปลอดภัยที่มีเพียงคุณเท่านั้นที่เข้าถึงได้"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"วิธีการทำงาน"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"คุณเข้าถึงพื้นที่ส่วนตัวได้จากด้านล่างของรายชื่อแอป"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"แอปในพื้นที่ส่วนตัวได้รับการปกป้องโดยการล็อก"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"การแจ้งเตือนจากแอปในพื้นที่ส่วนตัวจะถูกซ่อนเมื่อมีการล็อกไว้"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"แอปพื้นที่ส่วนตัวจะไม่ปรากฏในเครื่องมือจัดการสิทธิ์ แดชบอร์ดความเป็นส่วนตัว และการตั้งค่าอื่นๆ เมื่อมีการล็อกพื้นที่ส่วนตัวไว้"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"กำลังตั้งค่าพื้นที่ส่วนตัว…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"พื้นที่ส่วนตัวได้รับการปกป้องโดยการล็อก"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"ข้อมูลการใช้งานสำหรับแอปพื้นที่ส่วนตัวจะถูกซ่อนเมื่อมีการล็อกไว้"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"เข้าถึงพื้นที่ส่วนตัวจากรายชื่อแอป"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"ตั้งค่าพื้นที่ส่วนตัวไม่ได้"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ลองอีกครั้งตอนนี้ หรือกลับมาภายหลัง"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"ลองอีกครั้ง"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"ใช้การล็อกหน้าจอเพื่อปลดล็อกใช่ไหม"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"คุณจะปลดล็อกพื้นที่ส่วนตัวได้โดยใช้วิธีเดียวกับที่คุณปลดล็อกอุปกรณ์ หรือเลือกการล็อกอื่น"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"ใช้การล็อกหน้าจอ"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"เลือกการล็อกใหม่"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"เรียบร้อยแล้ว"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"หากต้องการเข้าถึงพื้นที่ส่วนตัว ให้ปัดขึ้นจากด้านล่างของหน้าจอหลัก แล้วเลื่อนลง"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"เสร็จสิ้น"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"เลื่อนลงเพื่อเข้าถึงพื้นที่ส่วนตัว"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"คุณสามารถเพิ่มได้ถึง <xliff:g id="COUNT">%d</xliff:g> ลายนิ้วมือ"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"คุณได้เพิ่มลายนิ้วมือถึงขีดจำกัดสูงสุดแล้ว"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"เพิ่มลายนิ้วมืออีกไม่ได้แล้ว"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"ใช้แอปต่อได้เมื่อพับ"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"เพิ่มอัตราการรีเฟรชจาก 60 เป็น <xliff:g id="ID_1">%1$s</xliff:g> Hz โดยอัตโนมัติสำหรับเนื้อหาบางรายการ เพิ่มการใช้งานแบตเตอรี่"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"เพิ่มอัตราการรีเฟรชไปจนถึง <xliff:g id="ID_1">%1$d</xliff:g> Hz โดยอัตโนมัติสำหรับเนื้อหาบางรายการ เพิ่มการใช้งานแบตเตอรี่"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"บังคับอัตราการรีเฟรชเป็นสูงสุด"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"อัตราการรีเฟรชสูงสุดสำหรับการตอบสนองต่อการแตะและคุณภาพของภาพเคลื่อนไหวที่ดียิ่งขึ้น เพิ่มการใช้งานแบตเตอรี่"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"การจดจ่อที่หน้าจอ"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"การตั้งค่าส่วนกลาง"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"แก้ไขจุดเข้าใช้งาน"</string>
+ <string name="apn_add" msgid="9069613192201630934">"เพิ่มจุดเข้าใช้งาน"</string>
<string name="apn_not_set" msgid="8246646433109750293">"ไม่ได้ตั้งค่า"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"ไม่ได้ตั้งค่า"</string>
<string name="apn_name" msgid="6677695784108157953">"ชื่อ"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"ใช้ปุ่มการช่วยเหลือพิเศษเพื่อเปิด"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"กดปุ่มปรับระดับเสียงค้างไว้เพื่อเปิด"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"แตะหน้าจอ 3 ครั้งเพื่อเปิด"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"ใช้ 2 นิ้วแตะหน้าจอ 3 ครั้งเพื่อเปิด"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"ใช้ท่าทางสัมผัสเพื่อเปิด"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ใช้ท่าทางสัมผัสการช่วยเหลือพิเศษ"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"หากต้องการใช้ฟีเจอร์นี้ ให้แตะปุ่มการช่วยเหลือพิเศษ <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ที่ด้านล่างของหน้าจอ\n\nหากต้องการสลับระหว่างฟีเจอร์ต่างๆ ให้แตะปุ่มการช่วยเหลือพิเศษค้างไว้"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"หากต้องการใช้ฟีเจอร์นี้ ให้แตะปุ่มการช่วยเหลือพิเศษบนหน้าจอ"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"หากต้องการใช้ฟีเจอร์นี้ ให้กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"หากต้องการเริ่มหรือหยุดการขยาย ให้แตะ 3 ครั้งที่ใดก็ได้บนหน้าจอ"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"หากต้องการเริ่มหรือหยุดการขยาย ให้ใช้ 2 นิ้วแตะ 3 ครั้งที่ใดก็ได้บนหน้าจอ"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"หากต้องการใช้ฟีเจอร์นี้ ให้ใช้ 2 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ\n\nหากต้องการสลับระหว่างฟีเจอร์ต่างๆ ให้ใช้ 2 นิ้วเลื่อนขึ้นแล้วค้างไว้"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"หากต้องการใช้ฟีเจอร์นี้ ให้ใช้ 3 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ\n\nหากต้องการสลับระหว่างฟีเจอร์ต่างๆ ให้ใช้ 3 นิ้วเลื่อนขึ้นแล้วค้างไว้"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"หากต้องการใช้ฟีเจอร์การช่วยเหลือพิเศษ ให้ใช้ 2 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ\n\nหากต้องการสลับระหว่างฟีเจอร์ต่างๆ ให้ใช้ 2 นิ้วเลื่อนขึ้นแล้วค้างไว้"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"กดปุ่มปรับระดับเสียงค้างไว้"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"กดปุ่มปรับระดับเสียงค้างไว้"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"ใช้ 2 นิ้วแตะหน้าจอ 3 ครั้ง"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ใช้ 2 นิ้วแตะหน้าจอ 3 ครั้ง"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"ใช้ 2 นิ้วแตะหน้าจอ {0,number,integer} ครั้งเร็วๆ"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"แตะหน้าจอ 3 ครั้ง"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"แตะหน้าจอ 3 ครั้ง"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"แตะหน้าจอเร็วๆ {0,number,integer} ครั้ง ทางลัดนี้อาจทำให้อุปกรณ์ทำงานช้าลง"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"ใช้การสั่นและการโต้ตอบการสัมผัส"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"การสั่นเมื่อปลุก"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"การสั่นของสื่อ"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"การสั่นของแป้นพิมพ์"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"การสั่นเมื่อมีเสียงเรียกเข้า"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"การสั่นเมื่อมีการแจ้งเตือน"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"การตอบสนองการสัมผัส"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"แอปอาจทำงานผิดพลาดหากคุณจำกัดกิจกรรมในพื้นหลัง"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"เนื่องจากแอปนี้ไม่ได้ตั้งค่าให้เพิ่มประสิทธิภาพแบตเตอรี่ คุณจึงจำกัดการใช้งานไม่ได้\n\nหากต้องการจำกัด ให้เปิดการเพิ่มประสิทธิภาพแบตเตอรี่ก่อน"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"จัดการการใช้งานแบตเตอรี่"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"อนุญาตการใช้งานในเบื้องหลัง"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"เปิดใช้เพื่อให้อัปเดตแบบเรียลไทม์ ปิดใช้เพื่อประหยัดแบตเตอรี่"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"ไม่จำกัด"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"เพิ่มประสิทธิภาพ"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"จำกัด"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ขนาดข้อความ, ตัวอักษรขนาดใหญ่, แบบอักษรขนาดใหญ่, ข้อความขนาดใหญ่, สายตาเลือนราง, ทำให้ข้อความใหญ่ขึ้น, เครื่องมือขยายแบบอักษร, การขยายแบบอักษร"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"การแสดงภาพพักหน้าจอเปิดตลอดเวลา, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, แท็ก, เครื่องอ่าน"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"แป้นพิมพ์ การโต้ตอบการสัมผัส การสั่น"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"ระดับเสียง การสั่น ห้ามรบกวน"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"ระดับเสียงของสื่อ"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"ระดับเสียงเมื่อแคสต์"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"อนุญาตให้เข้าถึงเพื่อจัดการไฟล์ทั้งหมด"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"อนุญาตให้แอปนี้อ่าน แก้ไข และลบไฟล์ทั้งหมดในอุปกรณ์นี้หรือวอลุ่มของพื้นที่เก็บข้อมูลใดๆ ที่เชื่อมต่อ หากได้รับอนุญาต แอปอาจเข้าถึงไฟล์ได้โดยที่คุณไม่ทราบอย่างชัดแจ้ง"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"เข้าถึงไฟล์ทั้งหมดได้"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"การแจ้งเตือนแบบเต็มหน้าจอ"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"อนุญาตให้แอปนี้แสดงการแจ้งเตือนแบบเต็มหน้าจอ"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"อนุญาตให้แอปนี้แสดงการแจ้งเตือนได้เต็มหน้าจอเมื่ออุปกรณ์ล็อกอยู่ แอปอาจใช้การแจ้งเตือนเหล่านี้เพื่อให้เห็นการปลุก สายเรียกเข้า หรือการแจ้งเตือนอื่นๆ ที่เร่งด่วนได้อย่างเด่นชัด"</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"ตรวจสอบกิจกรรมบนแอปเพื่อหาฟิชชิง"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"ใช้การสแกน"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ใช้การสแกนกับแอปงาน"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"การสแกนจะเกิดขึ้นในอุปกรณ์ของคุณอย่างเป็นส่วนตัวเพื่อตรวจสอบกิจกรรมบนแอปหาฟิชชิงหรือลักษณะการทำงานที่หลอกลวงอื่นๆ หากตรวจพบ ระบบจะส่งข้อมูลแอปบางส่วนไปยัง Google Play Protect เพื่อยืนยันภัยคุกคามและเตือนผู้ใช้แอป"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"นี่เป็นฟีเจอร์ความปลอดภัยที่มีการป้องกัน ไม่มีการแชร์ข้อมูลอุปกรณ์หรือข้อมูลส่วนบุคคลใดๆ กับ Google \n\nฟิชชิงคือการพยายามขโมยข้อมูลเข้าสู่ระบบหรือข้อมูลส่วนบุคคลอื่นๆ"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index ff53e0a..0de8d87 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"I-disable ang Bluetooth LE audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Dini-disable ang feature na Bluetooth LE audio kung sinusuportahan ng device ang mga kakayahan ng LE audio hardware."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Ipakita ang toggle ng LE audio sa Mga Detalye ng Device"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"I-bypass ang Allowlist ng Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Gamitin ang LE Audio bilang default kahit na hindi pa na-verify ang peripheral ng LE Audio para matugunan ang mga pamantayan sa Allowlist."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Mga media device"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Mga device sa pagtawag"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Iba pang device"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Mga naka-save na device"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Nauugnay sa account"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Dating ginamit sa account"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Mag-o-on ang Bluetooth para magpares"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Kagustuhan sa koneksyon"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Dating nakakonekta"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Sumulat sa mga field ng text"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Huwag pansinin ang lahat ng pagpindot ng button sa stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Pagbabahagi ng audio"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Ibahagi ang Audio"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Mga tawag at alarm"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"Kumonekta sa isang LE audio stream"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"Mga audio stream sa malapit"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"Mga audio stream"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"Kumonekta sa isang audio stream gamit ang QR code"</string>
<string name="date_and_time" msgid="1788358029823431692">"Petsa at oras"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"I-clear"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Pribadong Space"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Itago ang mga app sa pribadong folder"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"I-unlock gamit ang lock ng screen"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Ipakita ang Pribadong Space"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Itago kapag naka-lock"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Itago ang Pribadong Space kapag naka-lock"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Para hindi malaman ng iba na may Pribadong Space ka, puwede itong itago sa listahan ng mga app"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"I-access ang Pribadong Space kapag nakatago"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Hanapin ang \'Pribadong Space\' sa search bar"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"I-tap ang tile ng Pribadong Space"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"I-unlock ang iyong Pribadong Space"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Naka-off"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Naka-on"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"System"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Gumawa ng Pribadong Space"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"I-delete ang Pribadong Space"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Hindi magawa ang Pribadong Space"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Na-delete ang Pribadong Space"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Hindi ma-delete ang Pribadong Space"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Magtakda ng lock ng screen"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Para gamitin ang Private Space, magtakda ng lock ng screen."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Itakda ang lock ng screen"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Kanselahin"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Kanselahin"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"I-set up"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"I-set up ang Pribadong Space"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Itago ang mga pribadong app sa secure na space na ikaw lang ang makaka-access"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Paano ito gumagana"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Puwede mong i-access ang Pribadong Space mula sa ibaba ng iyong listahan ng mga app"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Pinoprotektahan ang mga app sa Pribadong Space ng isang lock"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Nakatago ang mga notification mula sa mga app sa Pribadong Space kapag naka-lock ito"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Hindi lalabas ang mga app sa Pribadong Space sa manager ng pahintulot, privacy dashboard, at iba pang setting kapag naka-lock ang Pribadong Space"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Sine-set up ang Pribadong Space…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Protektado ng lock ang Pribadong Space"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Nakatago ang impormasyon ng paggamit para sa mga app sa Pribadong Space kapag naka-lock ito"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"I-access ang Pribadong Space mula sa listahan ng mga app mo"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Hindi ma-set up ang Pribadong Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Subukan ulit ngayon, o bumalik sa ibang pagkakataon"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Subukan Ulit"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Gamitin ang lock ng screen para i-unlock?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Puwede mong i-unlock ang Pribadong Space sa parehong paraan kung paano mo i-unlock ang iyong device, o pumili ng ibang lock"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Gumamit ng lock ng screen"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Pumili ng bagong lock"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Handa na lahat!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Para ma-access ang Pribadong Space, mag-swipe pataas mula sa ibaba ng home screen mo, pagkatapos ay mag-scroll pababa"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Tapos na"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Mag-scroll pababa para ma-access ang Pribadong Space"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Puwede kang magdagdag ng hanggang <xliff:g id="COUNT">%d</xliff:g> (na) fingerprint"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Naidagdag mo na ang maximum na bilang ng mga fingerprint"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Hindi na makapagdagdag ng higit pang fingerprint"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Magpatuloy sa paggamit ng mga app kapag naka-fold"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth na Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Awtomatikong itinataas sa <xliff:g id="ID_1">%1$s</xliff:g> Hz, mula sa 60 Hz ang refresh rate para sa ilang content. Nakakadagdag sa paggamit ng baterya."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Awtomatikong tinataasan ang rate ng pag-refresh hanggang <xliff:g id="ID_1">%1$d</xliff:g> Hz para sa ilang content. Nakakadagdag sa paggamit ng baterya."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Puwersahin sa pinakamataas na rate ng pag-refresh"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Pinakamataas na rate ng pag-refresh para sa pinahusay na pagiging responsive ng pagpindot at kalidad ng animation. Pinapalakas ang paggamit ng baterya."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Atensyon sa screen"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Mga communal setting"</string>
<string name="apn_settings" msgid="4295467389400441299">"Mga APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"I-edit ang access point"</string>
+ <string name="apn_add" msgid="9069613192201630934">"Magdagdag ng access point"</string>
<string name="apn_not_set" msgid="8246646433109750293">"Hindi nakatakda"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Hindi nakatakda"</string>
<string name="apn_name" msgid="6677695784108157953">"Pangalan"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Gamitin ang button ng accessibility para buksan"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"I-hold ang mga volume key para buksan"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"I-triple tap ang screen para buksan"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"I-triple tap ang screen gamit ang dalawang daliri para buksan"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Gumamit ng galaw para buksan"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Gamitin ang galaw para sa accessibility"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Para magamit ang feature na ito, i-tap ang button ng accessibility <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> sa ibaba ng iyong screen.\n\nPara magpalipat-lipat sa mga feature, pindutin nang matagal ang button ng accessibility."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Para gamitin ang feature na ito, i-tap ang button ng accessibility sa iyong screen."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Para magamit ang feature na ito, pindutin nang matagal ang parehong volume key."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Para magsimula at huminto sa pag-magnify, mag-tap nang tatlong beses kahit saan sa iyong screen."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Para simulan at ihinto ang pag-magnify, mag-triple tap kahit saan sa screen mo gamit ang dalawang daliri."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Para magamit ang feature na ito, mag-swipe pataas mula sa ibaba ng screen gamit ang 2 daliri.\n\nPara magpalipat-lipat sa mga feature, mag-swipe pataas gamit ang 2 daliri at i-hold ang mga ito."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Para magamit ang feature na ito, mag-swipe pataas mula sa ibaba ng sceen gamit ang 3 daliri.\n\nPara magpalipat-lipat sa mga feature, mag-swipe pataas gamit ang 3 daliri at i-hold ang mga ito."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Para gumamit ng feature ng pagiging naa-access, mag-swipe pataas mula sa ibaba ng screen gamit ang 2 daliri.\n\nPara magpalipat-lipat sa mga feature, mag-swipe pataas gamit ang 2 daliri at i-hold ang mga ito."</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"I-hold ang mga volume key"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"i-hold ang mga volume key"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Pindutin nang matagal ang parehong volume key"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"I-triple tap ang screen gamit ang dalawang daliri"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"i-triple tap ang screen gamit ang dalawang daliri"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Mabilis na i-tap ang screen nang {0,number,integer} (na) beses gamit ang dalawang daliri"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"I-triple tap ang screen"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"i-triple tap ang screen"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Mabilis na i-tap ang screen nang {0,number,integer} beses. Posibleng mapabagal ng shortcut na ito ang iyong device"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Gumamit ng pag-vibrate at haptics"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Pag-vibrate ng alarm"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Pag-vibrate ng media"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Pag-vibrate ng keyboard"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Pag-vibrate kapag nag-ring"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Pag-vibrate kapag may notification"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Feedback sa pagpindot"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Kung lilimitahan mo ang aktibidad sa background ng app, maaari itong gumana nang hindi tama"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Hindi nakatakda ang app na mag-optimize ng baterya kaya hindi ito malilimitahan.\n\nPara malimitahan, i-on ang battery optimization."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Pamahalaan ang paggamit ng baterya"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"Payagan ang paggamit sa background"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"I-enable para sa mga real-time na update, i-disable para makatipid sa baterya"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Hindi pinaghihigpitan"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Naka-optimize"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Limitado"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"laki ng text, malaking print, malaking font, malaking text, malabong paningin, palakihin ang text, pampalaki ng font, pagpapalaki ng font"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"palaging naka-on na ambient display, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, tag, reader"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"keyboard, haptics, pag-vibrate,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Volume, pag-vibrate, Huwag Istorbohin"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Volume ng media"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Volume ng pag-cast"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Payagan para mapamahalaan ang lahat ng file"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Payagan ang app na ito na basahin, baguhin, at i-delete ang lahat ng file sa device na ito o sa anumang nakakonektang storage volume. Kung pagbibigyan ito, puwedeng mag-access ng mga file ang app nang hindi mo nalalaman."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Makaka-access sa lahat ng file"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Mga full screen na notification"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Payagan ang mga full screen na notification mula sa app na ito"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Payagan ang app na ito na magpakita ng mga notification na sakop ang buong screen kapag naka-lock ang device. Puwedeng gamitin ng mga app ang mga ito para mag-highlight ng mga alarm, papasok na tawag, o iba pang agarang notification."</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Suriin ang aktibidad sa app para mag-detect ng phishing"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Gamitin ang pag-scan"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Gamitin ang pag-scan para sa mga app pra sa trabaho"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Pribadong tumatakbo ang pag-scan sa iyong device, na sumusuri sa aktibidad sa app para mag-detect ng phishing o iba pang mapanlinlang na gawi. Kung ma-detect ito, ipapadala ang ilang impormasyon ng app sa Google Play Protect para kumpirmahin ang banta at bigyan ng babala ang mga user ng app."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Isa itong protektadong panseguridad na feature. Walang device o personal na impormasyong ibinabahagi sa Google. \n\nAng phishing ay isang pagtatangkang magnakaw ng mga kredensyal sa pag-sign in o iba pang personal na impormasyon."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 372233d..7ae8b1a 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audio\'yu devre dışı bırak"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Cihaz, LE Audio donanımı özelliklerini destekliyorsa Bluetooth LE Audio özelliğini devre dışı bırakır."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Cihaz Ayrıntıları\'nda LE Audio açma/kapatmayı göster"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio izin verilenler listesini atla"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio çevre biriminin, izin verilenler listesi kriterlerini karşıladığı doğrulanmamış olsa bile varsayılan olarak LE Audio\'yu kullanın."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Medya cihazları"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Cihazları ara"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Diğer cihazlar"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Kayıtlı cihazlar"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Hesapla ilişkili"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Hesapta daha önce kullanıldı"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth, eşleme işlemi için açılır"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Bağlantı tercihleri"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Daha önce bağlanılmış cihazlar"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Metin alanlarına yazın"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ekran kalemiyle basılan düğmeleri yoksay"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Ekran kalemi"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Ses paylaşımı"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Sesi paylaş"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Aramalar ve alarmlar"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Tarih ve saat"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Temizle"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Gizli Alan"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Uygulamalar gizli klasörde gizlenir"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Ekran kilidini kullanarak kilidi aç"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Gizli alanı göster"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Kilitli olduğunda gizle"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Kilitli olduğunda gizli alanı gizle"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Başkalarının, cihazınızda gizli alan olduğunu bilmesini önlemek için bunu uygulama listenizde gizleyin"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Gizli olduğunda gizli alana erişin"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Arama çubuğuna \"Gizli alan\" yazın"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Gizli alan kutusuna dokunun"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Gizli alanınızın kilidini açın"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Kapalı"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Açık"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Sistem"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Gizli alan oluştur"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Gizli alanı sil"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Gizli alan oluşturulamadı"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Gizli alan silindi"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Gizli alan silinemedi"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ekran kilidi ayarlayın"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Gizli alanı kullanmak için cihazda ekran kilidi ayarlayın."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ekran kilidi ayarla"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"İptal"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"İptal"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Kurulum"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Gizli alanı kurun"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Özel uygulamaları yalnızca sizin erişebildiğiniz güvenli bir alanda gizleyin"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Nasıl çalışır?"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Gizli alana, uygulama listenizin alt tarafından erişebilirsiniz"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Gizli alandaki uygulamalar kilit ile korunur"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Kilitli olduğunda gizli alandaki uygulamaların gönderdiği bildirimler gizlenir"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Gizli alan kilitli olduğunda izin yöneticisi, gizlilik kontrol paneli ve diğer ayarlarda gizli alan uygulamaları görünmez"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Gizli alan kuruluyor…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Gizli alan kilit ile korunur"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Kilitli olduğunda gizli alan uygulamalarıyla ilgili kullanım bilgileri gizlenir"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Gizli alana, uygulama listenizden erişin"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Gizli alan kurulamadı"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Şimdi tekrar deneyin veya daha sonra tekrar gelin"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Tekrar Dene"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Kilidi açmak için ekran kilidi kullanılsın mı?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Gizli alanın kilidini, cihazınızın kilidini açtığınız şekilde açabilir veya farklı bir kilit seçebilirsiniz"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Ekran kilidi kullan"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Yeni kilit seç"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"İşlem tamam!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Gizli alana erişmek için ana ekranınızın alt kısmından yukarı doğru kaydırdıktan sonra aşağı doğru kaydırın"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Bitti"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Gizli alana erişmek için aşağı kaydırın"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"<xliff:g id="COUNT">%d</xliff:g> adede kadar parmak izi ekleyebilirsiniz"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Maksimum sayıda parmak izi eklediniz"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Daha fazla parmak izi eklenemez"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Cihaz katlıyken uygulamaları kullanmaya devam et"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Bazı içerikler için yenileme hızını otomatik olarak 60 Hz\'den <xliff:g id="ID_1">%1$s</xliff:g> Hz\'e yükseltir. Pil kullanımını artırır."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Bazı içerikler için yenileme hızını otomatik olarak <xliff:g id="ID_1">%1$d</xliff:g> Hz\'e yükseltir. Pil kullanımını artırır."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Yoğun yenileme hızına zorla"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Geliştirilmiş dokunma duyarlılığı ve animasyon kalitesi için en yüksek yenileme hızı. Pil kullanımını artırır."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Ekrana dikkat verme"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Ortak ayarlar"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN\'ler"</string>
<string name="apn_edit" msgid="2003683641840248741">"Erişim noktasını düzenle"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Ayarlanmadı"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ayarlanmadı"</string>
<string name="apn_name" msgid="6677695784108157953">"Ad"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Açmak için erişilebilirlik düğmesini kullanın"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Açmak için ses düğmelerini basılı tutun"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Açmak için ekrana üç kez dokunun"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Açmak için ekrana iki parmağınızla üç kez dokunun"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Açmak için hareketi kullanın"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Erişilebilirlik hareketini kullan"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Bu özelliği kullanmak için ekranınızın alt kısmındaki erişilebilirlik düğmesine <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> dokunun.\n\nÖzellikler arasında geçiş yapmak için erişilebilirlik düğmesine dokunup basılı tutun."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Bu özelliği kullanmak için ekranınızdaki erişilebilirlik düğmesine dokunun."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Bu özelliği kullanmak için ses tuşlarının ikisine birden basın ve basılı tutun."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Büyütmeyi başlatıp durdurmak için ekranınızda herhangi bir yere üç kez dokunun."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Büyütmeyi başlatıp durdurmak için ekranınızda herhangi bir yere iki parmağınızla üç kez dokunun."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Bu özelliği kullanmak için 2 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 2 parmağınızla yukarı kaydırıp basılı tutun."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Bu özelliği kullanmak için 3 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 3 parmağınızla yukarı kaydırıp basılı tutun."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Bir erişilebilirlik özelliğini kullanmak için 2 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 2 parmağınızla yukarı kaydırıp basılı tutun."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Ses seviyesi tuşlarını basılı tut"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"ses tuşlarını basılı tut"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Ses seviyesi tuşlarının ikisini birden basılı tutun"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Ekrana iki parmağınızla üç kez dokunun"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"ekrana iki parmağınızla üç kez dokunun"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"İki parmağınızla ekrana {0,number,integer} kez hızlıca dokunun"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ekrana üç kez dokun"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ekrana üç kez dokun"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ekrana {0,number,integer} kez hızlıca dokunun. Bu kısayol cihazınızı yavaşlatabilir"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Titreşimi ve dokunma teknolojisini kullan"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Alarm titreşimi"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Medya titreşimi"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Klavye titreşimi"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Zili çaldırma titreşimi"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Bildirim titreşimi"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Dokunma geri bildirimi"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Uygulama için arka plan etkinliğini sınırlarsanız hatalı davranabilir"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Uygulama, pili optimize etmek için ayarlanmadığından kısıtlanamaz.\n\nUygulamayı kısıtlamak için önce pil optimizasyonunu açın."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Pil kullanımını yönetme"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Kısıtlanmamış"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimize edilmiş"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Kısıtlı"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"metin boyutu, büyük baskı, büyük harfler, büyük metin, az görme, metni büyüt, yazı tipi büyütücü, yazı tipi büyütme"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ambiyans ekranı her zaman açık, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, etiket, okuyucu"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klavye, dokunma teknolojisi, titreşim"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Ses düzeyi, titreşim, Rahatsız Etmeyin"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Medya ses düzeyi"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Yayın ses düzeyi"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Tüm dosyaları yönetme erişimine izin ver"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Bu uygulamanın, bu cihazdaki veya cihaza bağlı depolama birimlerindeki tüm dosyaları okumasına, değiştirmesine ve silmesine izin verin. İzin verilirse uygulama size açıkça bildirmeden dosyalara erişebilir."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Tüm dosyalara erişebilir"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Tam ekran bildirimler"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Bu uygulamanın tam ekran bildirim göndermesine izin ver"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Cihaz kilitliyken bu uygulamanın tüm ekranı kaplayan bildirimler göstermesine izin verin. Uygulamalar bunu alarmları, gelen aramaları ve diğer acil bildirimleri göstermek için kullanabilir."</string>
@@ -4884,6 +4945,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Uygulama etkinliğini kimlik avı açısından kontrol edin"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Taramayı kullan"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"İş uygulamaları için taramayı kullan"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Doğrudan cihazınızda gizli olarak yürütülen tarama işlemi, uygulama etkinliğini kimlik avı veya diğer yanıltıcı davranışlar açısından kontrol eder. Böyle bir durum tespit edilirse tehdidi onaylamak ve uygulama kullanıcılarını uyarmak için bazı uygulama bilgileri Google Play Protect\'e gönderilir."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Bu, koruma amaçlı bir güvenlik özelliğidir. Cihaz veya kişisel bilgileriniz Google ile paylaşılmaz. \n\nKimlik avı, oturum açma kimlik bilgilerini veya diğer kişisel bilgileri çalmaya yönelik bir girişimdir."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index d3d6c8e..d927e40 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Вимкнути Bluetooth LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Вимикає функцію Bluetooth LE Audio, якщо пристрій підтримує апаратні можливості LE Audio."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Перемикач LE Audio в інф. про пристрій"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Обходити білий список Bluetooth LE Audio"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio використовуватиметься за умовчанням, навіть якщо периферійний пристрій LE Audio не перевірено на відповідність критеріям білого списку."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Носії"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Пристрої для дзвінків"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Інші пристрої"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Збережені пристрої"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Зв’язано з обліковим записом"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Пристрої, на яких раніше використовувався обліковий запис"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth увімкнеться, щоб створити пару"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Параметри підключень"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Підключені раніше"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Писати в текстових полях"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ігнорувати всі натискання кнопок стилусом"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Стилус"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Надання доступу до аудіо"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Поділитись аудіо"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Дзвінки й будильники"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Дата й час"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Проксі"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Очистити"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Приватний простір"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ховайте додатки в приватній папці"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Використовувати спосіб розблокування екрана"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Показати приватний простір"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Не показувати на заблокованому екрані"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Приховати приватний простір, коли його заблоковано"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Приховайте приватний простір зі списку додатків, щоб ніхто не дізнався про його наявність на пристрої"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Отримуйте доступ до приватного простору, коли його приховано"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"У рядку пошуку введіть \"приватний простір\""</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Натисніть панель \"Приватний простір\""</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Розблокуйте приватний простір"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Вимкнено"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Увімкнено"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Система"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Створити приватний простір"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Видалити приватний простір"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Не вдалося створити приватний простір"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Приватний простір видалено"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Не вдалося видалити приватний простір"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Налаштуйте блокування екрана"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Щоб застосовувати приватний простір, налаштуйте блокування."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Налаштувати блокування екрана"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Скасувати"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Скасувати"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Налаштувати"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Налаштуйте приватний простір"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Сховайте приватні додатки в безпечному місці, доступ до якого маєте лише ви"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Як це працює"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Ви можете отримати доступ до приватного простору внизу списку додатків"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Додатки в приватному просторі захищено блокуванням"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Сповіщення додатків у приватному просторі приховуються, коли його заблоковано"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Коли приватний простір заблоковано, його додатки не відображатимуться в менеджері дозволів, на панелі керування дозволами й в інших налаштуваннях."</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Налаштування приватного простору…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Приватний простір захищено блокуванням"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Коли приватний простір заблоковано, дані про використання його додатків приховуються"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Доступ до приватного простору зі списку додатків"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Не вдалося налаштувати приватний простір"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Повторіть спробу зараз або поверніться пізніше"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Повторити"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Використовувати спосіб розблокування екрана?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Ви можете розблоковувати приватний простір так само, як і свій пристрій, або вибрати інший спосіб розблокування"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Використовувати спосіб розблокування екрана"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Вибрати новий спосіб розблокування"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Готово."</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Щоб отримати доступ до приватного простору, проведіть пальцем угору від нижнього краю головного екрана, а потім прокрутіть сторінку вниз"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Готово"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Прокрутіть униз, щоб увійти в приватний простір"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Можна додати максимум стільки відбитків: <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Ви додали максимальну кількість відбитків пальців"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Більше не можна додати відбитки пальців"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Далі користуватися додатками на складеному пристрої"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Плавне відображення"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Автоматично збільшує частоту оновлення певного контенту із 60 до <xliff:g id="ID_1">%1$s</xliff:g> Гц. Збільшує використання заряду акумулятора."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Автоматично збільшує частоту оновлення до <xliff:g id="ID_1">%1$d</xliff:g> Гц для певного контенту. Збільшує використання заряду акумулятора."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Примусово найбільша частота оновлення"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Найвища частота оновлення для кращого реагування на дотики й вищої якості анімації. Підвищує використання заряду акумулятора."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Адаптивний сплячий режим"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Налаштування для спільного використання"</string>
<string name="apn_settings" msgid="4295467389400441299">"Точки доступу"</string>
<string name="apn_edit" msgid="2003683641840248741">"Змінити точку доступу"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Не встановлено"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Не задано"</string>
<string name="apn_name" msgid="6677695784108157953">"Назва"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Використайте кнопку функцій доступності"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Утримуйте клавіші гучності, щоб відкрити"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Тричі торкніться екрана, щоб відкрити"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Тричі торкніться екрана двома пальцями, щоб відкрити"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Використовуйте жест"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Використовувати жест функцій доступності"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Щоб використовувати цю функцію, натисніть кнопку спеціальних можливостей <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> унизу екрана.\n\nЩоб переключитися між функціями, натисніть і утримуйте кнопку спеціальних можливостей."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Щоб використовувати цю функцію, натисніть кнопку функцій доступності на екрані."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Щоб використовувати цю функцію, натисніть і утримуйте обидві клавіші гучності."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Щоб почати або припинити збільшення, тричі натисніть будь-де на екрані."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Щоб почати або припинити збільшення, тричі натисніть будь-де на екрані двома пальцями."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Щоб використовувати цю функцію, проведіть двома пальцями вверх від низу екрана.\n\nЩоб переключитися між функціями, проведіть двома пальцями знизу вверх і утримуйте їх на екрані."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Щоб використовувати цю функцію, проведіть трьома пальцями вверх від низу екрана.\n\nЩоб переключитися між функціями, проведіть трьома пальцями знизу вверх і утримуйте їх на екрані."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Щоб використовувати спеціальні можливості, проведіть двома пальцями вверх від низу екрана.\n\nЩоб переключитися між функціями, проведіть двома пальцями знизу вверх і утримуйте їх на екрані."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Утримувати клавіші гучності"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"утримання клавіш гучності"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Утримуйте обидві клавіші гучності"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Потрійний дотик екрана двома пальцями"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"потрійний дотик екрана двома пальцями"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Швидко торкніться екрана {0,number,integer} рази двома пальцями"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Тричі торкнутися екрана"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"потрійний дотик"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Швидко натисніть екран стільки разів: {0,number,integer}. Призначена кнопка чи відповідний жест може сповільнити роботу пристрою."</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Використовувати вібрацію та вібровідгук"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Вібрація сигналу будильника"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Вібрація під час відтворення мультимедіа"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Вібрація клавіатури"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Вібрація під час дзвінків"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Вібрація під час сповіщень"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Реакція на дотик"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Якщо обмежити фонову активність, додаток може працювати неналежним чином"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Оскільки в додатку не передбачено економію заряду акумулятора, його не можна обмежити.\n\nУвімкніть оптимізацію споживання заряду."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Використання заряду"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Без обмежень"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Оптимізовано"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Обмежено"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"розмір тексту, великі букви, великий шрифт, великий текст, поганий зір, зробити текст більшим, збільшити шрифт, збільшення шрифту"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"інформація на заблокованому екрані, always on display"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, мітка, засіб зчитування"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"клавіатура, тактильний відгук, вібрація,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Гучність, вібросигнал і режим \"Не турбувати\""</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Гучність медіа"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Гучність трансляції"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Надати доступ до керування всіма файлами"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Дозволити цьому додатку переглядати, змінювати та видаляти всі файли на цьому пристрої або інших підключених носіях пам\'яті. Після надання дозволу додаток може отримувати доступ до файлів без вашого відома."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Мають доступ до всіх файлів"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Сповіщення на весь екран"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Дозволити сповіщення на весь екран із цього додатка"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Цьому додатку буде дозволено показувати сповіщення на весь екран, коли пристрій заблоковано. Додатки можуть використовувати це налаштування, щоб показувати будильники, сповіщення про вхідні дзвінки або інші термінові сповіщення."</string>
@@ -4644,7 +4705,7 @@
<string name="category_name_display_controls" msgid="7046581691184725216">"Інші елементи керування екраном"</string>
<string name="category_name_general" msgid="7737273712848115886">"Загальні"</string>
<string name="dark_theme_main_switch_title" msgid="4045147031947562280">"Використовувати темну тему"</string>
- <string name="bluetooth_main_switch_title" msgid="8409835540311309632">"Використовувати Bluetooth"</string>
+ <string name="bluetooth_main_switch_title" msgid="8409835540311309632">"Увімкнути Bluetooth"</string>
<string name="prevent_ringing_main_switch_title" msgid="4726252811262086643">"Використовувати функцію \"Не дзвонити\""</string>
<string name="use_wifi_hotsopt_main_switch_title" msgid="3909731167290690539">"Використовувати точку доступу Wi‑Fi"</string>
<string name="app_pinning_main_switch_title" msgid="5465506660064032876">"Використовувати закріплення додатка"</string>
@@ -4882,16 +4943,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Назва пристрою відображається в установлених додатках. Її також можуть бачити інші користувачі, коли ви підключаєтеся до пристроїв із Bluetooth чи мережі Wi-Fi або налаштовуєте точку доступу Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Граматичний рід"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Виберіть граматичний рід"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Сканування на предмет оманливих додатків"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Перевірка дій у додатках на предмет фішингу"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Використовувати сканування"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Використовувати сканування для робочих додатків"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index b9b509c..a6961f1 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"بلوٹوتھ LE آڈیو غیر فعال کریں"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"اگر آلہ LE آڈیو ہارڈویئر کی صلاحیتوں کو سپورٹ کرتا ہے تو یہ بلوٹوتھ LE آڈیو خصوصیت کو غیر فعال کر دے گا۔"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"آلے کی تفصیلات میں LE آڈیو ٹوگل کریں دکھائیں"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"بلوٹوتھ LE آڈیو کی اجازت یافتہ فہرست کو بائی پاس کریں"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"اجازت یافتہ کی فہرست کے معیار کو پورا کرنے کے لیے LE آڈیو پیریفرل کی تصدیق کے نہ ہونے کے باوجود LE آڈیو کو بطور ڈیفالٹ استعمال کریں۔"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"میڈیا آلات"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"کال آلات"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"دیگر آلات"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"محفوظ کردہ آلات"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"اکاؤنٹ کے ساتھ وابستہ"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"پہلے اکاؤنٹ کے ساتھ استعمال کیا جاتا تھا"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"جوڑا بنانے کے لیے بلوٹوتھ آن ہو جائے گا"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"کنکشن کی ترجیحات"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"پہلے سے منسلک کردہ"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"ٹیکسٹ فیلڈز میں لکھیں"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"اسٹائلس کے بٹن کو دبانے کا عمل نظر انداز کریں"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"اسٹائلس"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"آڈیو کا اشتراک"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"آڈیو کا اشتراک کریں"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"کالز اور الارمز"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"LE آڈیو سلسلہ سے منسلک کریں"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"قریبی آڈیو سلسلے"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"آڈیو سلسلے"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"QR کوڈ استعمال کر کے آڈیو سلسلہ سے منسلک کریں"</string>
<string name="date_and_time" msgid="1788358029823431692">"تاریخ اور وقت"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"پراکسی"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"صاف کریں"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"نجی اسپیس"</string>
<string name="private_space_summary" msgid="8237652417163408001">"ایپس کو نجی فولڈر میں چھپائیں"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"اسکرین لاک کا استعمال کرتے ہوئے غیر مقفل کریں"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"نجی اسپیس دکھائیں"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"مقفل ہونے پر چھپائیں"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"مقفل ہونے پر نجی اسپیس چھپائیں"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"دیگر لوگوں کو معلوم نہ ہوں کہ آپ کے آلے پر نجی اسپیس ہے، آپ اسے اپنی ایپس کی فہرست سے چھپا سکتے ہیں"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"پوشیدہ ہونے پر نجی اسپیس تک رسائی حاصل کریں"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"تلاش بار میں \'نجی اسپیس\' تلاش کریں"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"نجی اسپیس ٹائل پر تھپتھپائیں"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"اپنی نجی اسپیس کو غیر مقفل کریں"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"آف ہے"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"آن ہے"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"سسٹم"</string>
<string name="private_space_create_title" msgid="47273568884806726">"نجی اسپیس بنائیں"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"نجی اسپیس حذف کریں"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"نجی اسپیس نہیں بنائی جا سکی"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"نجی اسپیس کامیابی کے ساتھ حذف ہو گئی"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"نجی اسپیس کو حذف نہیں کیا جا سکا"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"اسکرین لاک سیٹ کریں"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"نجی اسپیس استعمال کرنے کیلئے، اس آلہ پر سکرین لاک سیٹ کریں۔"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"اسکرین لاک سیٹ کریں"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"منسوخ کریں"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"منسوخ کریں"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"سیٹ اپ کریں"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"نجی اسپیس سیٹ اپ کریں"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"نجی ایپس کو اس محفوظ اسپیس میں چھپائیں جس تک صرف آپ رسائی حاصل کر سکتے ہیں"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"اس کے کام کرنے کا طریقہ"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"آپ اپنی ایپس کی فہرست کے نچلے حصے سے نجی اسپیس تک رسائی حاصل کر سکتے ہیں"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"نجی اسپیس میں موجود ایپس کو بذریعہ لاک محفوظ کیا جاتا ہے"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"نجی اسپیس میں موجود ایپس کے مقفل ہونے پر ان کی اطلاعات پوشیدہ ہو جاتی ہیں"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"نجی اسپیس کے مقفل ہونے پر، نجی اسپیس ایپس اجازتوں کے مینیجر، پرائیویسی ڈیش بورڈ اور دیگر ترتیبات میں ظاہر نہیں ہوں گی"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"نجی اسپیس سیٹ اپ کی جا رہی ہے…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"نجی اسپیس کو بذریعہ لاک محفوظ کیا جاتا ہے"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"نجی اسپیس ایپس کے استعمال کی معلومات اس وقت پوشیدہ ہوتی ہے جب یہ مقفل ہوتی ہے"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"اپنی ایپس کی فہرست سے نجی اسپیس تک رسائی حاصل کریں"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"نجی اسپیس سیٹ اپ نہیں کی جا سکی"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"ابھی دوبارہ کوشش کریں یا بعد میں واپس آئیں"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"دوبارہ کوشش کریں"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"غیر مقفل کرنے کے لیے اسکرین لاک استعمال کریں؟"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"آپ نجی اسپیس کو اسی طرح غیر مقفل کر سکتے ہیں جس طرح آپ اپنے آلے کو غیر مقفل کرتے ہیں یا ایک مختلف قفل کا انتخاب سکتے ہیں"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"اسکرین لاک استعمال کریں"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"نیا قفل منتخب کریں"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"سب کچھ تیار ہے!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"نجی اسپیس تک رسائی کے لیے، اپنی ہوم اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں، پھر نیچے اسکرول کریں"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"ہو گیا"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"نجی اسپیس تک رسائی حاصل کرنے کے لیے نیچے اسکرول کریں"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"آپ <xliff:g id="COUNT">%d</xliff:g> فنگر پرنٹس شامل کر سکتے ہیں"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"آپ فنگر پرنٹس کی زیادہ سے زیادہ تعداد شامل کر چکے ہیں"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"مزید فنگر پرنٹس شامل نہیں کر سکتے"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"فولڈ پر ایپس کا استعمال جاری رکھیں"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"ہموار ڈسپلے"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"کچھ مواد کے لیے 60 سے <xliff:g id="ID_1">%1$s</xliff:g> Hz تک ریفریش کی شرح خودکار طور پر بڑھ جاتی ہے۔ بیٹری کے استعمال میں کرتی ہیں"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"کچھ مواد کے لیے <xliff:g id="ID_1">%1$d</xliff:g> Hz تک ریفریش ریٹ خودکار طور پر بڑھ جاتی ہے۔ بیٹری کے استعمال میں کرتی اضافہ ہیں"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"زیادہ سے زیادہ ریفریش کی شرح پر مجبور کریں"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"اعلی ترین ریفریش کرنے کی بہتر شرح کے ليے ٹچ کی کارکردگی اور اینیمیشن کوالٹی۔ بیٹری کے استعمال میں اضافہ کرتا ہے۔"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"اسکرین پر توجہ"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"کمیونل ترتیبات"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"رسائی کے مقام میں ترمیم کریں"</string>
+ <string name="apn_add" msgid="9069613192201630934">"رسائی پوائنٹ شامل کریں"</string>
<string name="apn_not_set" msgid="8246646433109750293">"سیٹ نہيں ہے"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"سیٹ نہیں ہے"</string>
<string name="apn_name" msgid="6677695784108157953">"نام"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"کھولنے کے لیے ایکسیسبیلٹی بٹن کا استعمال کریں"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"کھولنے کے لیے والیوم کی کلیدوں کو دبائے رکھیں"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"کھولنے کے لیے اسکرین پر تین بار تھپتھپائیں"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"کھولنے کے لیے دو انگلیوں سے تین بار تھپتھپائیں"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"کھولنے کے لیے اشارہ استعمال کریں"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"ایکسیسبیلٹی اشارے کا استعمال کریں"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"یہ خصوصیت استعمال کرنے کیلئے، اپنی اسکرین کے سب سے نیچے<xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ایکسیسبیلٹی بٹن پر تھپتھپائیں۔\n\nخصوصیات کے درمیان سوئچ کرنے کے لیے ایکسیسبیلٹی بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"اس خصوصیت کا استعمال کرنے کے لیے، اپنی اسکرین پر ایکسیسبیلٹی بٹن پر تھپتھپائیں۔"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"یہ خصوصیت استعمال کرنے کیلئے، والیوم کی دونوں کلیدوں کو دبائے رکھیں۔"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"میگنیفکیشن شروع یا بند کرنے کے لیے، اپنی اسکرین پر کہیں بھی تین بار تھپتھپائیں۔"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"میگنیفکیشن شروع یا اسٹاپ کرنے کے لیے، اپنی اسکرین پر کہیں بھی دو انگلیوں سے تین بار تھپتھپائیں۔"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"یہ خصوصیت استعمال کرنے کیلئے، 2 انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں۔\n\nخصوصیات کے درمیان سوئچ کرنے کے لیے، 2 انگلیوں سے اوپر کی طرف سوائپ کریں اور دبائے رکھیں۔"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"یہ خصوصیت استعمال کرنے کیلئے، 3 انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں۔\n\nخصوصیات کے درمیان سوئچ کرنے کے لیے، 3 انگلیوں سے اوپر کی طرف سوائپ کریں اور دبائے رکھیں۔"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"ایکسیسبیلٹی خصوصیت استعمال کرنے کیلئے، 2 انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں۔\n\nخصوصیات کے درمیان سوئچ کرنے کے لیے، 2 انگلیوں سے اوپر کی طرف سوائپ کریں اور دبائے رکھیں۔"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"والیوم کی کلیدوں کو دبائیں رکھیں"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"والیوم کی کلیدوں کو دبائے رکھیں"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"والیوم کی دونوں کلیدوں کو دبائے رکھیں"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"دو انگلیوں سے اسکرین پر تین بار تھپتھپائیں"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"دو انگلیوں سے اسکرین پر تین بار تھپتھپائیں"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"دو انگلیوں سے اسکرین پر تیزی سے {0,number,integer} بار تھپتھپائیں"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"اسکرین پر تین بار تھپتھپائیں"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"اسکرین پر تین بار تھپتھپائیں"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"اسکرین پر فوری طور پر {0,number,integer} بار تھپتھپائیں۔ اس شارٹ کٹ سے آپ کا آلہ سست ہو سکتا ہے"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"وائبریشن اور ہیپٹکس استعمال کریں"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"الارم وائبریشن"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"میڈیا وائبریشن"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"کی بورڈ وائبریشن"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"رنگ وائبریشن"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"اطلاع وائبریشن"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"ٹچ تاثرات"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"اگر آپ کسی ایپ کی پس منظر کی سرگرمی کو محدود کرتے ہیں تو یہ غلط برتاؤ کر سکتی ہے"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"چونکہ یہ ایپ بیٹری کی کارکردگی کو بہتر بنانے کیلئے نہیں ہے، لہذا آپ اسے محدود نہیں کر سکتے ہیں۔\n\nایپ کو محدود کرنے کیلئے، پہلے بیٹری کی کارکردگی کو بہتر بنانے کو آن کریں۔"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"بیٹری کے استعمال کا نظم کریں"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"پس منظر کے استعمال کی اجازت دیں"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"ریئل ٹائم اپ ڈیٹس کے لیے فعال کریں، بیٹری بچانے کے لیے غیر فعال کریں"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"(پابندی کے بغیر)"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"بہتر کردہ"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"محدود کردہ"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"ٹیکسٹ کا سائز، بڑا پرنٹ، بڑا فونٹ، بڑا ٹیکسٹ، کم وژن، ٹیکسٹ کو بڑا کرنا، فونٹ کو بڑا کرنے والا ٹول، فونٹ بڑا کرنا"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"ہمیشہ آن ایمبیئنٹ ڈسپلے، AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc، ٹیگ، ریڈر"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"کی بورڈ، ہیپٹکس، وائبریٹ،"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"والیوم، ارتعاش، ڈسٹرب نہ کریں"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"میڈیا والیوم"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"والیوم کاسٹ کریں"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"سبھی فائلز کا نظم کرنے کیلئے رسائی کی اجازت دیں"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"اس ایپ کو اس آلہ یا کسی منسلک اسٹوریج والیوم کی تمام فائلز کو پڑھنے، اس میں ترمیم کرنے اور حذف کرنے کی اجازت دیں۔ اگر اجازت دی گئی تو ایپ آپ کو بتائے بغیر فائلز تک رسائی حاصل کر سکتی ہے۔"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"سبھی فائلز تک رسائی حاصل کی جا سکتی ہے"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"پوری اسکرین کی اطلاعات"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"اس ایپ سے پوری اسکرین کی اطلاعات کی اجازت دیں"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"اس ایپ کو وہ اطلاعات دکھانے کی اجازت دیں جو آلے کے مقفل ہونے پر پوری اسکرین پر ظاہر ہوتی ہیں۔ ایپس ان کا استعمال الارمز، اِن کمنگ کالز یا دیگر فوری اطلاعات کو نمایاں کرنے کے لیے کر سکتی ہیں۔"</string>
@@ -4884,6 +4938,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"فریب دہی کے لیے ایپ کی سرگرمی چیک کریں"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"اسکیننگ کا استعمال کریں"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"ورک ایپس کے لیے اسکیننگ کا استعمال کریں"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"اسکیننگ آپ کے آلے پر نجی طور پر چلتی ہے، ایپ کی سرگرمی کو فریب دہی یا دیگر جعلسازی کے برتاؤ کے لیے چیک کیا جا رہا ہے۔ اس کا پتہ چلنے پر خطرے کی تصدیق اور ایپ کے صارفین کو متنبہ کرنے کے لیے ایپ کی کچھ معلومات Google Play Protect کو بھیجی جاتی ہیں۔"</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"یہ سیکیورٹی کی ایک محفوظ خصوصیت ہے۔ Google کے ساتھ کسی بھی آلے یا ذاتی معلومات کا اشتراک نہیں کیا جاتا ہے۔ \n\nفریب دہی سائن ان کی اسناد یا دیگر ذاتی معلومات چرانے کی کوشش ہے۔"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index e86271c..a43a3e5 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Bluetooth LE Audioni faolsizlantirish"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Qurilmada LE audio apparatli taʼminoti boʻlsa, Bluetooth LE audio funksiyasi faolsizlantiriladi."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Qurilma axborotida LE audio tugmasi chiqsin"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bluetooth LE Audio ruxsat roʻyxatini chetlash"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"LE Audio aloqasidan birlamchi holatda foydalanish, hatto qurilmaning ruxsat olishga muvofiqligi tekshirilmagan boʻlsa ham."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Media qurilmalar"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Chaqiruv qurilmalari"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Boshqa qurilmalar"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Saqlangan qurilmalar"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Hisob bilan aloqador"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Hisobda avval ishlatilgan"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Juftlash uchun Bluetooth yoqiladi"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Ulanish parametrlari"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Avval ulangan qurilmalar"</string>
@@ -134,6 +133,18 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Matn maydonlarida yozish"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Stilus bilan bosilgan barcha tugmalarni eʼtiborsiz qoldirish"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Stilus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Audio ulashuvi"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Audioni ulashish"</string>
+ <!-- no translation found for calls_and_alarms_device_title (6993559028175454198) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Sana va vaqt"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proksi-server"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Tozalash"</string>
@@ -537,7 +548,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Maxfiy joy"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Maxfiy jilddagi ilovalarni yashirish"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Ekran qulfi bilan qulfni ochish"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Maxfiy joyni koʻrsatish"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Qulflanganida berkitilsin"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Qulflanganida Maxfiy joyni berkitish"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Qurilmada Xavfsiz joy borligini boshqalar bilmasligi uchun ilovalar roʻyxatidan yashirish mumkin"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Berkitilganida Maxfiy joyga kirish"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Qidiruv satrida \"Maxfiy joy\"ni qidiring"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Maxfiy joy katakchaisni bosing"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Maxfiiy joyni ochish"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Oʻchiq"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Yoniq"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Tizim"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Maxfiy joy yaratish"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Maxfiy joyni oʻchirish"</string>
@@ -546,6 +565,51 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Maxfiy joy yaratilmadi"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Maxfiy joy oʻchirildi"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Maxfiy joy oʻchmadi"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Ekran qulfini sozlash"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Maxfiy joy ishlatish uchun bu qurilma ekran qulfini sozlang"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Ekran qulfini sozlash"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Bekor qilish"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Bekor qilish"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Sozlash"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Maxfiy joyni sozlash"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Shaxsiy ilovalarni faqat siz kira oladigan xavfsiz joyda yashiring"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Bu qanday ishlaydi"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Ilovalar roʻyxatining pastki qismidan Maxfiy joyga kirish mumkin"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Maxfiy joydagi ilovalar qulf bilan himoyalangan"</string>
+ <!-- no translation found for privatespace_hidden_notifications_text (8121285743543004812) -->
+ <skip />
+ <!-- no translation found for privatespace_apps_permission_text (4418511924151828812) -->
+ <skip />
+ <!-- no translation found for privatespace_setting_up_text (8532777749891406509) -->
+ <skip />
+ <!-- no translation found for privatespace_lock_protected_title (7409801274869666860) -->
+ <skip />
+ <!-- no translation found for privatespace_apps_hidden_title (6146605677591599107) -->
+ <skip />
+ <!-- no translation found for privatespace_access_from_apps_title (6787000636686810564) -->
+ <skip />
+ <!-- no translation found for privatespace_error_screen_title (8658511165913662275) -->
+ <skip />
+ <!-- no translation found for privatespace_error_screen_summary (5679626031159521676) -->
+ <skip />
+ <!-- no translation found for privatespace_tryagain_label (4091466165724929876) -->
+ <skip />
+ <!-- no translation found for privatespace_lockscreen_title (7459425150560213662) -->
+ <skip />
+ <!-- no translation found for privatespace_lockscreen_summary (980268845497843861) -->
+ <skip />
+ <!-- no translation found for privatespace_use_screenlock_label (2775404941450049991) -->
+ <skip />
+ <!-- no translation found for privatespace_set_lock_label (6277529807188602545) -->
+ <skip />
+ <!-- no translation found for privatespace_success_title (4854425684898602993) -->
+ <skip />
+ <!-- no translation found for privatespace_access_text (8756118686974614618) -->
+ <skip />
+ <!-- no translation found for privatespace_done_label (5534818213879562387) -->
+ <skip />
+ <!-- no translation found for scrolldown_to_access (5160743933093369151) -->
+ <skip />
<string name="fingerprint_add_max" msgid="8639321019299347447">"Ko’pi bilan <xliff:g id="COUNT">%d</xliff:g> ta barmoq izi qo’shish mumkin"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Barmoq izlari maksimal miqdorda qo‘shildi"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Boshqa barmoq izini qo‘shib bo‘lmaydi"</string>
@@ -1063,7 +1127,8 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Ilovalarni buklanganda davom ettirish"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Smooth Display"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Ayrim kontent uchun ekranning yangilanish chastotasi 60-<xliff:g id="ID_1">%1$s</xliff:g> Gs orasida almashib turadi. Batareya tezroq sarflanadi."</string>
+ <!-- no translation found for peak_refresh_rate_summary (3212309985294885790) -->
+ <skip />
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Eng yuqori majburiy yangilanish chastotasi"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Ekran sensorining javob qaytarishi va animatsiyalar sifati uchun eng yuqori yangilanish chastotasi Batareya tezroq sarflanadi."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Moslashuvchan kutish rejimi"</string>
@@ -1299,6 +1364,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Umumiy sozlamalar"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Ulanish nuqtasini tahrirlash"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Kiritilmagan"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Berilmagan"</string>
<string name="apn_name" msgid="6677695784108157953">"Nomi"</string>
@@ -1933,12 +2000,16 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Qulayliklar tugmasi bilan ochish"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Ochish uchun ikkala tovush tugmasini bosib turing."</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Ochish uchun ekranga uch marta bosing"</string>
+ <!-- no translation found for accessibility_tutorial_dialog_title_two_finger_triple (1090593773487065541) -->
+ <skip />
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Imo-ishoralardan foydalaning"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Qulaylik ishorasidan foydalanish"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Bu funksiyadan foydalanish uchun ekraningiz pastidagi <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> maxsus imkoniyatlar tugmasi ustiga bosing.\n\nFunksiyalarni almashtirish uchun maxsus imkoniyatlar tugmasini bosib turing."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Bu funksiyadan foydalanish uchun ekrandagi Qulayliklar tugmasini bosing."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Bu funksiyadan foydalanish uchun ikkala tovush tugmasini bosib turing."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Kattalashtirishni boshlash yoki toʻxtatish uchun ekranning istalgan joyiga uch marta bosing."</string>
+ <!-- no translation found for accessibility_tutorial_dialog_message_two_finger_triple (6205072282308562361) -->
+ <skip />
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Bu funksiyadan foydalanish uchun 2 ta barmoq bilan ekran pastidan tepaga suring.\n\nFunksiyalarni almashtirish uchun 2 ta barmoq bilan tepaga suring va ushlab turing."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Bu funksiyadan foydalanish uchun 3 ta barmoq bilan ekran pastidan tepaga suring.\n\nFunksiyalarni almashtirish uchun 3 ta barmoq bilan tepaga suring va ushlab turing."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Maxsus imkoniyatlardan foydalanish uchun 2 ta barmoq bilan ekran pastidan tepaga suring.\n\nFunksiyalarni almashtirish uchun 2 ta barmoq bilan tepaga suring va ushlab turing."</string>
@@ -1960,6 +2031,12 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Tovush tugmalarini bosib turish"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"tovush tugmalarini bosib turish"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Ikkala tovush tugmalarini bosib turing."</string>
+ <!-- no translation found for accessibility_shortcut_edit_dialog_title_two_finger_triple_tap (6687765191490040899) -->
+ <skip />
+ <!-- no translation found for accessibility_shortcut_two_finger_triple_tap_keyword (4200744613585702430) -->
+ <skip />
+ <!-- no translation found for accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap (2631127444247448793) -->
+ <skip />
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Ekran ustiga uch marta bosing"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"ekran ustiga uch marta bosish"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Ekranga tez-tez {0,number,integer} marta bosing. Bu qurilmangizni sekinlashtirishi mumkin"</string>
@@ -2047,8 +2124,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Tebranish va teginish effektidan foydalanish"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Bildirishnomalar kelganda tebranish"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Media tebranish"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Klaviatura tebranishi"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Jiringlaganda tebranish"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Bildirishnomada tebranish"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Teginganda tebranish"</string>
@@ -2258,6 +2334,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Bu ilovaning ishlashiga ta’sir ko‘rsatishi mumkin"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Bu ilova batareya sarfini optimallashtirish uchun sozlanmagani sababli uni cheklash imkonsiz.\n\nIlovani cheklash uchun avval batareya sarfini optimallashtirish funksiyasini yoqing."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Batareya sarfini boshqarish"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Cheklanmagan"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Optimallangan"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Cheklangan"</string>
@@ -3059,8 +3139,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"matn oʻlchami, katta bosma, katta yozuv, katta matn, zaif koʻrish, matnni kattalashtirish, yozuvni kattalashtirish, katta yozuv"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"doim yoniq ambient display, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, teg, rider"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"klaviatura, sezish, tebranish,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Tovush balandligi, tebranish, Bezovta qilinmasin rejimi"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Multimedia tovushi"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Translatsiya tovushi balandligi"</string>
@@ -3769,6 +3848,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Barcha fayllarni boshqarishga ruxsat"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Bu ilovaga mazkur qurilmadagi yoki ulangan xotira qurilmalaridagi barcha fayllarni oʻqish, tahrirlash va oʻchirib tashlash uchun ruxsat beriladi. Ruxsat berilgandan keyin ilova fayllardan sizning xabaringizsiz foydalana oladi."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Barcha fayllarga ruxsati bor ilova"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Butun ekranda bildirishnomalar"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Bu ilova bildirishnomalarini butun ekranda chiqishiga ruxsat berish"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Bu ilovaga qurilma qulflanganida butun ekranni egallaydigan bildirishnoma chiqarishga ruxsat berish. Ilovalar uning yordamida signallar, kiruvchi chaqiruv yoki boshqa shoshilinch bildirishnomalarni ajratib koʻrsatishi mumkin."</string>
@@ -4880,16 +4965,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Qurilma nomi siz oʻrnatgan ilovalarga koʻrinadi. Bluetooth qurilmalarga yoki Wi-Fi tarmoqqa ulanganingizda, Wi-Fi hotspot sozlaganingizda boshqalarga ham koʻrinishi mumkin."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Grammatik jins"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Grammatik jinsni tanlang"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Aldovchi ilovalar uchun tekshirish"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Fishing uchun ilovadagi faoliyatni tekshirish"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Tekshirish"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Ishga oid ilovalar uchun tekshiruvdan foydalaning"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 11d8ef8..bb2db11 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Tắt âm thanh năng lượng thấp qua Bluetooth"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Tắt tính năng âm thanh năng lượng thấp qua Bluetooth nếu thiết bị hỗ trợ chức năng phần cứng âm thanh năng lượng thấp."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Hiện nút bật/tắt Âm thanh năng lượng thấp"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Bỏ qua danh sách cho phép đối với tính năng Bluetooth Âm thanh năng lượng thấp"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Sử dụng Âm thanh năng lượng thấp theo mặc định, ngay cả khi chưa xác minh được rằng thiết bị ngoại vi Âm thanh năng lượng thấp đáp ứng tiêu chí của danh sách cho phép."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Thiết bị truyền thông"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Thiết bị gọi điện"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Thiết bị khác"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Thiết bị đã lưu"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Được liên kết với tài khoản"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Đã dùng trước đây với tài khoản"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"Bluetooth sẽ bật để ghép nối"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Lựa chọn ưu tiên về kết nối"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Đã kết nối trước đây"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Viết vào trường văn bản"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Bỏ qua tất cả các lần nhấn nút bằng bút cảm ứng"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"Bút cảm ứng"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Chia sẻ âm thanh"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Chia sẻ âm thanh"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Cuộc gọi và chuông báo"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Ngày và giờ"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Xóa"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Không gian riêng tư"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Ẩn ứng dụng trong thư mục riêng tư"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Mở khoá bằng phương thức khoá màn hình"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Hiện Không gian riêng tư"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Ẩn khi khoá"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Ẩn Không gian riêng tư khi khoá"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Ẩn Không gian riêng tư khỏi các ứng dụng để không ai biết"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Truy cập Không gian riêng tư khi tính năng này đang ẩn"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Tìm kiếm \"Không gian riêng tư\" trong thanh tìm kiếm"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Nhấn vào ô Không gian riêng tư"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Mở khoá Không gian riêng tư"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Tắt"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Bật"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Hệ thống"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Tạo Không gian riêng tư"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Xoá Không gian riêng tư"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Không tạo được Không gian riêng tư"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Đã xoá xong Không gian riêng tư"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Không xoá được Không gian riêng tư"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Đặt phương thức khoá màn hình"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Để dùng Không gian riêng tư, hãy đặt một phương thức khoá màn hình trên thiết bị này."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Đặt phương thức khoá màn hình"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Huỷ"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Huỷ"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Thiết lập"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Thiết lập Không gian riêng tư"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Ẩn các ứng dụng riêng tư trong một không gian an toàn chỉ có bạn mới truy cập được"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Cách thức hoạt động"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Bạn có thể truy cập Không gian riêng tư từ cuối danh sách ứng dụng"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Ứng dụng trong Không gian riêng tư được bảo vệ bởi cơ chế khoá"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Thông báo của các ứng dụng trong Không gian riêng tư sẽ ẩn khi tính năng này đang khoá"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Các ứng dụng trong Không gian riêng tư sẽ không xuất hiện trong Trình quản lý quyền, Bảng tổng quan về quyền riêng tư, cũng như các chế độ cài đặt khác khi Không gian riêng tư đang khoá"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Đang thiết lập Không gian riêng tư…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"Không gian riêng tư được bảo vệ bởi cơ chế khoá"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Thông tin về mức độ sử dụng của các ứng dụng trong Không gian riêng tư sẽ ẩn khi tính năng này đang khoá"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Truy cập Không gian riêng tư từ danh sách ứng dụng"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Không thiết lập được Không gian riêng tư"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Thử lại ngay bây giờ, hoặc để khi khác."</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Thử lại"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Dùng phương thức khoá màn hình để mở khoá?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Bạn có thể mở khoá Không gian riêng tư theo cùng cách mở khoá thiết bị của mình, hoặc chọn một phương thức khoá khác"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Dùng phương thức khoá màn hình"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Chọn phương thức khoá mới"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Đã hoàn tất!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Để truy cập Không gian riêng tư, hãy vuốt lên từ cuối màn hình chính, rồi di chuyển xuống"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Xong"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Di chuyển xuống để truy cập Không gian riêng tư"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Bạn có thể thêm tối đa <xliff:g id="COUNT">%d</xliff:g> vân tay"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Bạn đã thêm số vân tay tối đa"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Không thể thêm dấu vân tay khác"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Tiếp tục dùng ứng dụng sau khi gập điện thoại"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Hình ảnh mượt"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Tự động tăng tốc độ làm mới từ 60 lên <xliff:g id="ID_1">%1$s</xliff:g> Hz đối với một số nội dung. Chế độ cài đặt này sẽ làm tăng mức sử dụng pin."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Tự động tăng tốc độ làm mới từ 60 lên đến <xliff:g id="ID_1">%1$d</xliff:g> Hz đối với một số nội dung. Chế độ cài đặt này sẽ làm tăng mức sử dụng pin."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Buộc chuyển sang tốc độ làm mới cao nhất"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Tốc độ làm mới cao nhất giúp cải thiện khả năng phản hồi khi chạm và chất lượng ảnh động. Tính năng này làm tăng mức sử dụng pin."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Phát hiện ánh mắt"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Các chế độ cài đặt dùng chung"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"Chỉnh sửa điểm truy cập"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"Chưa đặt"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Chưa đặt"</string>
<string name="apn_name" msgid="6677695784108157953">"Tên"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Dùng nút hỗ trợ tiếp cận để mở"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Giữ các phím âm lượng để mở"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Nhấn 3 lần vào màn hình để mở"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Hãy dùng 2 ngón tay nhấn 3 lần vào màn hình để mở"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Dùng cử chỉ để mở"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Sử dụng cử chỉ hỗ trợ tiếp cận"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Để sử dụng tính năng này, hãy nhấn vào nút hỗ trợ tiếp cận <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ở cuối màn hình.\n\nĐể chuyển đổi giữa các tính năng, hãy chạm và giữ nút hỗ trợ tiếp cận."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Để sử dụng tính năng này, hãy nhấn vào nút hỗ trợ tiếp cận trên màn hình."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Để sử dụng tính năng này, hãy nhấn và giữ cả hai phím âm lượng."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Để bắt đầu và dừng phóng to, hãy nhấn 3 lần vào bất cứ đâu trên màn hình."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Để bắt đầu và dừng phóng to, hãy dùng 2 ngón tay nhấn 3 lần vào bất cứ đâu trên màn hình."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Để sử dụng tính năng này, hãy dùng 2 ngón tay vuốt lên từ cuối màn hình.\n\nĐể chuyển đổi giữa các tính năng, hãy dùng 2 ngón tay vuốt lên và giữ."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Để sử dụng tính năng này, hãy dùng 3 ngón tay vuốt lên từ cuối màn hình.\n\nĐể chuyển đổi giữa các tính năng, hãy dùng 3 ngón tay vuốt lên và giữ."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Để sử dụng tính năng hỗ trợ tiếp cận, hãy dùng 2 ngón tay vuốt lên từ cuối màn hình.\n\nĐể chuyển đổi giữa các tính năng, hãy dùng 2 ngón tay vuốt lên và giữ."</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Giữ phím âm lượng"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"giữ các phím âm lượng"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Nhấn và giữ cả 2 phím âm lượng"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Dùng 2 ngón tay nhấn 3 lần vào màn hình"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"dùng 2 ngón tay nhấn 3 lần vào màn hình"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Nhanh tay nhấn vào màn hình {0,number,integer} lần bằng 2 ngón tay"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Nhấn 3 lần vào màn hình"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"nhấn 3 lần vào màn hình"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Nhấn nhanh vào màn hình {0,number,integer} lần. Phím tắt này có thể làm chậm thiết bị"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Sử dụng chế độ rung và phản hồi xúc giác"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Rung khi có chuông báo"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Rung khi có nội dung nghe nhìn"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Chế độ rung của bàn phím"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Rung khi đổ chuông"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Rung khi có thông báo"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Phản hồi khi chạm"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Nếu bạn giới hạn hoạt động nền cho một ứng dụng, ứng dụng đó có thể hoạt động không đúng cách"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Không thể hạn chế ứng dụng này vì bạn chưa đặt để tối ưu hóa pin.\n\nĐể hạn chế ứng dụng, trước tiên hãy bật tối ưu hóa pin."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Quản lý mức sử dụng pin"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Không hạn chế"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Tối ưu hóa"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Bị hạn chế"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"cỡ chữ, bản in lớn, phông chữ lớn, chữ lớn, thị lực kém, tăng cỡ chữ, tăng kích cỡ phông chữ, phóng to phông chữ"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"luôn bật chế độ màn hình chờ theo môi trường xung quanh (AOD)"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, thẻ, trình đọc"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"bàn phím, xúc giác, rung,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Âm lượng, rung, Không làm phiền"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Âm lượng nội dung nghe nhìn"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Âm lượng truyền"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Cho phép truy cập để quản lý tất cả các tệp"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Cho phép ứng dụng này đọc, sửa đổi và xóa tất cả các tệp trên thiết bị này hoặc bất kỳ thiết bị lưu trữ nào đã kết nối. Nếu bạn cho phép, ứng dụng có thể truy cập vào các tệp mà không cần thông báo rõ ràng cho bạn."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Có thể truy cập vào tất cả các tệp"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Thông báo toàn màn hình"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Cho phép ứng dụng này hiển thị thông báo toàn màn hình"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Cho phép ứng dụng hiển thị các thông báo chiếm toàn màn hình khi thiết bị đang khoá. Các ứng dụng có thể dùng những thông báo này để làm nổi bật chuông báo, cuộc gọi đến hoặc thông báo khẩn cấp khác."</string>
@@ -4642,7 +4703,7 @@
<string name="category_name_display_controls" msgid="7046581691184725216">"Các chế độ điều khiển màn hình khác"</string>
<string name="category_name_general" msgid="7737273712848115886">"Chung"</string>
<string name="dark_theme_main_switch_title" msgid="4045147031947562280">"Sử dụng Giao diện tối"</string>
- <string name="bluetooth_main_switch_title" msgid="8409835540311309632">"Sử dụng Bluetooth"</string>
+ <string name="bluetooth_main_switch_title" msgid="8409835540311309632">"Bật Bluetooth"</string>
<string name="prevent_ringing_main_switch_title" msgid="4726252811262086643">"Sử dụng chế độ ngăn đổ chuông"</string>
<string name="use_wifi_hotsopt_main_switch_title" msgid="3909731167290690539">"Sử dụng điểm phát sóng Wi-Fi"</string>
<string name="app_pinning_main_switch_title" msgid="5465506660064032876">"Sử dụng tính năng ghim ứng dụng"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"Các ứng dụng bạn đã cài đặt sẽ biết được tên thiết bị của bạn. Những người khác cũng có thể thấy tên thiết bị này khi bạn kết nối với thiết bị Bluetooth, một mạng Wi-Fi hoặc thiết lập một điểm phát sóng Wi-Fi."</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"Giống trong ngữ pháp"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"Chọn giống trong ngữ pháp"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"Đang quét tìm ứng dụng lừa đảo"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"Kiểm tra hoạt động trong ứng dụng để phát hiện hành vi lừa đảo"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Sử dụng tính năng quét"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Sử dụng tính năng quét cho các ứng dụng công việc"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index f44c62a..a5536f8 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"停用蓝牙 LE 音频"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"如果设备支持 LE 音频硬件功能,则停用蓝牙 LE 音频功能。"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"在“设备详细信息”中显示 LE 音频切换开关"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"绕过蓝牙 LE 音频许可名单"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"默认使用 LE 音频,即使 LE 音频外围设备尚未通过旨在确保满足许可名单条件的验证,也是如此。"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"媒体设备"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"通话设备"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"其他设备"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"保存的设备"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"与账号相关联"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"之前曾与账号配对"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"系统将开启蓝牙以进行配对"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"连接偏好设置"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"之前连接的设备"</string>
@@ -134,6 +133,13 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"在文本字段中书写"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"忽略所有通过触控笔按下按钮的动作"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"触控笔"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"音频分享"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"分享音频"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"来电和闹钟"</string>
+ <string name="audio_sharing_streams_category_title" msgid="862958129650324581">"连接到 LE 音频流"</string>
+ <string name="audio_sharing_streams_pref_title" msgid="4636293245167657721">"附近的音频流"</string>
+ <string name="audio_sharing_streams_title" msgid="8269455097512153101">"音频流"</string>
+ <string name="audio_sharing_streams_qr_code_summary" msgid="4231875597377863735">"使用二维码连接到音频流"</string>
<string name="date_and_time" msgid="1788358029823431692">"日期和时间"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"代理"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"清除"</string>
@@ -537,7 +543,15 @@
<string name="private_space_title" msgid="7078627930195569767">"私密空间"</string>
<string name="private_space_summary" msgid="8237652417163408001">"将应用隐藏到私人文件夹中"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"使用屏幕解锁方式解锁"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"显示私密空间"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"在锁定时隐藏"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"隐藏锁定的私密空间"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"如要防止其他人知道您的设备上有私密空间,您可以从应用列表中隐藏该空间"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"访问隐藏的私密空间"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"在搜索栏中搜索“私密空间”"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"点按私密空间功能块"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"解锁您的私密空间"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"关闭"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"开启"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"系统"</string>
<string name="private_space_create_title" msgid="47273568884806726">"创建私密空间"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"删除私密空间"</string>
@@ -546,6 +560,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"无法创建私密空间"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"已成功删除私密空间"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"无法删除私密空间"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"设置屏锁"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"若要使用“私密空间”功能,请在此设备上设置屏锁。"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"设置屏锁"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"取消"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"取消"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"设置"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"设置私密空间"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"将私密应用隐藏在只有您可以访问的安全空间中"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"运作方式"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"您可以从应用列表底部访问私密空间"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"系统会通过锁定功能来保护私密空间中的应用"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"私密空间锁定后,系统会隐藏私密空间中应用的通知"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"私密空间锁定后,私密空间应用不会出现在权限管理器、隐私信息中心和其他设置中"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"设置私密空间…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"系统会通过锁定功能来保护私密空间"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"私密空间应用锁定后,其使用情况信息处于隐藏状态"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"从应用列表访问私密空间"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"无法设置私密空间"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"立即重试,或稍后重试"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"重试"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"使用屏锁解锁凭据?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"您可以像解锁设备一样解锁私密空间,也可以选择其他锁定方式"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"使用屏锁"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"选择新的锁定方式"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"一切就绪!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"要访问私密空间,请从主屏幕底部向上滑动,然后向下滚动"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"完成"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"向下滚动,访问私密空间"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"您最多可以添加 <xliff:g id="COUNT">%d</xliff:g> 个指纹"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"您添加的指纹数量已达到上限"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"无法添加更多的指纹"</string>
@@ -1063,7 +1105,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"折叠时继续使用应用"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"流畅画面"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"自动将某些内容的刷新率从 60 Hz 调高到 <xliff:g id="ID_1">%1$s</xliff:g> Hz。但会增加耗电量。"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"自动将某些内容的刷新频率调高到 <xliff:g id="ID_1">%1$d</xliff:g> Hz。使用这一设置会增加耗电量。"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"强制使用峰值刷新频率"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"使用最高刷新频率可提升按触操作响应和动画质量,但会增加耗电量。"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"屏幕感知"</string>
@@ -1299,6 +1341,7 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"通用设置"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"修改接入点"</string>
+ <string name="apn_add" msgid="9069613192201630934">"添加接入点"</string>
<string name="apn_not_set" msgid="8246646433109750293">"未设置"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"未设置"</string>
<string name="apn_name" msgid="6677695784108157953">"名称"</string>
@@ -1933,12 +1976,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"使用“无障碍”按钮打开"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"按住两个音量键即可打开"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"点按屏幕 3 次即可打开"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"用两指点按屏幕三次即可打开"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"使用手势打开"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"使用无障碍功能启动手势"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"如需使用此功能,请点按屏幕底部的“无障碍”按钮 <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>。\n\n轻触并按住“无障碍”按钮,即可在多项功能之间切换。"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"如需使用此功能,请点按屏幕上的“无障碍”按钮。"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"如需使用此功能,请同时按住两个音量键。"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"要启动和停止放大功能,请在屏幕上的任意位置点按三次。"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"要启动或停止放大功能,请在屏幕上的任意位置用两指点按三次。"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"如需使用此功能,请用两根手指从屏幕底部向上滑动。\n\n用两根手指向上滑动并按住,即可在多项功能之间切换。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"如需使用此功能,请用三根手指从屏幕底部向上滑动。\n\n用三根手指向上滑动并按住,即可在多项功能之间切换。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"如需使用无障碍功能,请用两根手指从屏幕底部向上滑动。\n\n用两根手指向上滑动并按住,即可在多项功能之间切换。"</string>
@@ -1960,6 +2005,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"按住两个音量键"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"按住两个音量键"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"同时按住两个音量键"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"用两指点按屏幕三次"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"用两指点按屏幕三次"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"用两指快速点按屏幕{0,number,integer}次"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"点按屏幕三次"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"点按屏幕三次"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"在屏幕上快速点按 {0,number,integer} 次。此快捷方式可能会减慢设备的运行速度"</string>
@@ -2047,8 +2095,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"使用振动和触感反馈"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"闹钟振动"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"媒体振动"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"键盘振动"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"响铃振动"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"通知振动"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"按触反馈"</string>
@@ -2258,6 +2305,8 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"如果您限制某个应用的后台活动,可能会导致该应用出现异常"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"由于此应用未设置为优化电池用量,因此您无法对其加以限制。\n\n要限制该应用,请先开启电池优化功能。"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"管理电池用量"</string>
+ <string name="manager_battery_usage_allow_background_usage_title" msgid="6294649996820358852">"允许后台使用"</string>
+ <string name="manager_battery_usage_allow_background_usage_summary" msgid="8021153755201340819">"启用可接收实时更新,停用可节省电池电量"</string>
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"无限制"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"优化"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"受限"</string>
@@ -3059,8 +3108,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"文字大小, 大字版, 大字体, 大文字, 弱视, 放大文字, 字体放大工具, 字体放大, text size, large print, large font, large text, low vision, make text bigger, font enlarger, font enlargement"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"氛围屏保始终保持开启状态, AOD, always on ambient display, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"NFC, 标签, tag, 读取器, reader"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"键盘、触感反馈、振动、"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"音量、振动、勿扰"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"媒体音量"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"投放音量"</string>
@@ -3769,6 +3817,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"授予管理所有文件的权限"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"允许此应用读取、修改和删除此设备或任何已连接存储卷上的所有文件。如果您授予该权限,应用无需明确通知您即可访问文件。"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"可以访问所有文件"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"全屏通知"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"允许此应用显示全屏通知"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"允许此应用在设备锁定时显示占据整个屏幕空间的通知。应用可以利用全屏通知显示闹钟、来电或其他紧急通知。"</string>
@@ -4880,16 +4934,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"您安装的应用可以查看您的设备名称。此外,当您连接到蓝牙设备、连接到 WLAN 网络或设置 WLAN 热点时,其他人可能也会看到您的设备名称。"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"语法性别"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"选择语法性别"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"扫描是否存在欺骗性应用"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"检查应用活动是否存在钓鱼式攻击"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"使用扫描功能"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"针对工作应用使用扫描功能"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index d547db0..5dc4d8a 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"停用藍牙 LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"如果裝置支援 LE Audio 硬件功能,則停用藍牙 LE Audio 功能。"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"在「裝置詳情」中顯示 LE Audio 切換按鈕"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"繞過藍牙 LE Audio 許可名單"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"即使 LE Audio 周邊裝置未通過符合許可清單條件的驗證,系統仍會預設使用 LE Audio。"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"媒體裝置"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"通話裝置"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"其他裝置"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"已儲存的裝置"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"與帳戶建立關聯"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"先前與帳戶配合使用"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"系統將開啟藍牙以配對裝置"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"連接偏好設定"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"之前已連接的裝置"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"在文字欄位書寫"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"忽略所有觸控筆按鈕按壓動作"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"觸控筆"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"音訊分享功能"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"分享音訊"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"通話及鬧鐘"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"日期和時間"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"清除"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"私人空間"</string>
<string name="private_space_summary" msgid="8237652417163408001">"將應用程式隱藏在私人資料夾"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"使用螢幕鎖定功能解鎖"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"顯示「私人空間」"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"在鎖定時隱藏"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"在鎖定時隱藏「私人空間」"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"如要防止其他使用者知道裝置上有「私人空間」,可以從應用程式清單中隱藏該空間"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"存取隱藏的「私人空間」"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"在搜尋列中搜尋「私人空間」"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"輕按「私人空間」圖塊"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"解鎖「私人空間」"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"關閉"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"開啟"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"系統"</string>
<string name="private_space_create_title" msgid="47273568884806726">"建立「私人空間」"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"刪除「私人空間」"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"無法建立「私人空間」"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"已成功刪除「私人空間」"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"無法刪除「私人空間」"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"設定螢幕鎖定功能"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"如要使用「私人空間」,請在此裝置上設定螢幕鎖定功能。"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"設定螢幕鎖定功能"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"取消"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"取消"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"設定"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"設定「私人空間」"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"將私人應用程式隱藏在只有你能存取的安全空間"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"運作方式"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"你可從應用程式清單底部存取「私人空間」"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"「私人空間」中的應用程式受鎖定功能保護"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"「私人空間」處於鎖定狀態時,系統會隱藏「私人空間」應用程式的通知"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"「私人空間」處於鎖定狀態時,當中的應用程式就不會在權限管理工具、私隱資訊主頁和其他設定中顯示"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"正在設定「私人空間」…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"「私人空間」受鎖定功能保護"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"「私人空間」處於鎖定狀態時,系統會隱藏當中的應用程式使用情況資料"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"從應用程式清單存取「私人空間」"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"無法設定「私人空間」"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"請立即重試,或稍後再返回查看"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"再試一次"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"要透過螢幕鎖定功能解鎖嗎?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"你可使用解鎖裝置的方式來解鎖「私人空間」,或選擇其他鎖定設定"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"使用螢幕鎖定方式"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"選擇新的鎖定設定"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"大功告成!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"如要存取「私人空間」,請從主畫面底部向上滑動,然後向下捲動。"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"完成"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"向下捲動即可存取「私人空間」"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"你最多可以加入 <xliff:g id="COUNT">%d</xliff:g> 個指紋"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"你加入指紋的數目已達上限"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"無法加入更多指紋"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"在摺疊模式下繼續使用應用程式"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"流暢顯示"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"自動將部分內容的重新整理頻率提升至 60 到 <xliff:g id="ID_1">%1$s</xliff:g> Hz 之間。電池用量會因而增加。"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"自動將部分內容的更新率調高至 <xliff:g id="ID_1">%1$d</xliff:g> Hz。電池用量會因而增加。"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"強制使用最高重新整理頻率"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"最高的重新整理頻率,帶來更靈敏的觸控反應和更高畫質的動畫。這會增加電池用量。"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"螢幕感知"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"共用設定"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"編輯接入點"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"未設定"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"未設定"</string>
<string name="apn_name" msgid="6677695784108157953">"名稱"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"使用無障礙功能按鈕開啟"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"㩒住兩個音量鍵就可以打開"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"㩒螢幕 3 下就可以開"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"用兩隻手指喺螢幕上面㩒 3 下就可以打開"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"使用手勢即可開啟"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"使用無障礙手勢"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"要使用這項功能,請輕按螢幕底部的無障礙功能按鈕 <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>。\n\n如要切換不同的功能,按住無障礙功能按鈕即可。"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"要使用這項功能,請輕按螢幕上的無障礙功能按鈕。"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"如果要使用呢項功能,請同時㩒住兩個音量鍵。"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"如果要啟用同停用放大功能,請喺螢幕上面嘅任何一個地方㩒三下。"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"如果要啟用同停用放大功能,請用兩隻手指喺螢幕上面嘅任何一個地方㩒 3 下。"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"如果要使用呢項功能,請用 2 隻手指由螢幕底部向上掃。\n\n用 2 隻手指向上掃然後㩒住,就可以切換唔同功能。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"如果要使用呢項功能,請用 3 隻手指由螢幕底部向上掃。\n\n用 3 隻手指向上掃然後㩒住,就可以切換唔同功能。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"如果要使用無障礙功能,請用 2 隻手指由螢幕底部向上掃。\n\n用 2 隻手指向上掃然後㩒住,就可以切換唔同功能。"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"按住音量鍵"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"按住音量鍵"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"同時按住兩個音量鍵"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"兩指輕按螢幕三下"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"兩指輕按螢幕三下"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"用兩隻手指快速喺螢幕上面㩒 {0,number,integer} 下"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"輕按螢幕三下"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"輕按螢幕三下"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"快速㩒螢幕 {0,number,integer} 下。呢個快速鍵可能會減慢裝置運作速度"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"使用震動和觸感反應"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"鬧鐘震動"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"媒體震動"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"鍵盤震動"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"鈴聲震動"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"通知震動"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"輕觸反應"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"如果你限制應用程式的背景活動,應用程式可能無法正常運作"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"由於此應用程式並未設定為優化電池,你無法限制其使用。\n\n如要限制應用程式,請先開啟電池優化功能。"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"管理電池用量"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"無限制"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"優化"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"限制"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"文字大小, 大字, 大字體, 大型文字, 低視力, 放大字體, 字體放大工具, 字體放大"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"一律開啟氛圍畫面, AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, 標籤, 閱讀器"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"鍵盤、觸感反應、震動、"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"音量、震動、請勿騷擾"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"媒體音量"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"投放音量"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"允許存取以管理所有檔案"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"允許此應用程式讀取、修改和刪除此裝置或任何已連接的儲存空間卷宗上的所有檔案。如獲得權限,應用程式可能會在你不知情的情況下存取檔案。"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"可存取所有檔案"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"全螢幕通知"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"允許此應用程式的全螢幕通知"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"允許此應用程式在裝置上鎖時顯示全螢幕通知。應用程式可能會利用這些通知突顯鬧鐘、來電或其他緊急通知。"</string>
@@ -4811,7 +4872,7 @@
<string name="aspect_ratio_main_summary" msgid="4141964559612756940">"如果此應用程式未提供適合「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」的設計,請試用新的長寬比查看應用程式。部分應用程式可能並未針對特定長寬比進行優化。"</string>
<string name="aspect_ratio_summary_text" msgid="4737461467467220325">"如果應用程式未提供適合「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」的設計,請試用新的長寬比查看應用程式"</string>
<string name="aspect_ratio_main_summary_text" msgid="5544816872094235840">"如果應用程式未提供適合「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」的設計,請試用新的長寬比查看應用程式。部分應用程式可能並未針對特定長寬比進行優化。"</string>
- <string name="user_aspect_ratio_suggested_apps_label" msgid="8085934042329632039">"有建議顯示長寬比的應用程式"</string>
+ <string name="user_aspect_ratio_suggested_apps_label" msgid="8085934042329632039">"建議應用程式"</string>
<string name="user_aspect_ratio_changed_apps_label" msgid="2096614916172567672">"已變更的應用程式"</string>
<string name="user_aspect_ratio_app_default" msgid="270065763307617837">"應用程式預設"</string>
<string name="user_aspect_ratio_fullscreen" msgid="1843427242540081996">"全螢幕"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"你安裝的應用程式可以取得你的裝置名稱。當你連接藍牙裝置或 Wi-Fi 網絡,或設定 Wi-Fi 熱點時,其他人亦可能會看到你的裝置名稱。"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"語法性別"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"選取語法性別"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"透過掃瞄找出欺詐應用程式"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"檢查應用程式活動是否有仿冒詐騙行為"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"使用掃瞄功能"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"掃瞄工作應用程式"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index bcc50f5..3367a10 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"停用藍牙 LE Audio"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"如果裝置支援 LE Audio 硬體功能,就停用藍牙 LE Audio 功能。"</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"在「裝置詳細資料」中顯示 LE Audio 切換鈕"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"略過藍牙 LE Audio 許可清單"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"即使 LE Audio 周邊裝置未通過符合許可清單條件的驗證,系統仍會預設使用 LE Audio。"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"媒體裝置"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"通話裝置"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"其他裝置"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"已儲存的裝置"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"與帳戶建立關聯"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"先前與帳戶搭配使用"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"系統將開啟藍牙以配對裝置"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"連線偏好設定"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"先前連線的裝置"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"在文字欄位中書寫"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"忽略所有觸控筆按鈕按壓動作"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"觸控筆"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"音訊分享功能"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"分享音訊"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"通話與鬧鐘"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"日期和時間"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Proxy"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"清除"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"私人空間"</string>
<string name="private_space_summary" msgid="8237652417163408001">"將應用程式隱藏在私人資料夾中"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"使用螢幕鎖定功能解鎖"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"顯示私人空間"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"在鎖定時隱藏"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"隱藏鎖定的私人空間"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"如要防止其他使用者知道裝置上有私人空間,可以從應用程式清單中隱藏該空間"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"存取隱藏的私人空間"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"在搜尋列中搜尋「私人空間」"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"輕觸私人空間設定方塊"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"解鎖私人空間"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"已關閉"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"已開啟"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"系統"</string>
<string name="private_space_create_title" msgid="47273568884806726">"建立私人空間"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"刪除私人空間"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"無法建立私人空間"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"成功刪除私人空間"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"無法刪除私人空間"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"設定螢幕鎖定功能"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"如要使用私人空間,請在這部裝置上設定螢幕鎖定功能。"</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"設定螢幕鎖定功能"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"取消"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"取消"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"設定"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"設定私人空間"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"將私人應用程式隱藏在只有你能存取的安全空間"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"運作方式"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"你可以從應用程式清單底部存取私人空間"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"私人空間中的應用程式會受到鎖定保護"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"私人空間處於鎖定狀態時,如果其中的應用程式發出通知,會遭到系統隱藏"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"私人空間處於鎖定狀態時,其中的應用程式就不會顯示在權限管理工具、隱私資訊主頁和其他設定中"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"正在設定私人空間…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"私人空間會受到鎖定功能保護"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"私人空間處於鎖定狀態時,系統會隱藏其中應用程式的用量資訊"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"透過應用程式清單存取私人空間"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"無法設定私人空間"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"請立即重試,或稍後再返回查看"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"再試一次"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"要透過螢幕鎖定功能解鎖嗎?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"你可以用解鎖裝置的方式來解鎖私人空間,或選擇其他鎖定設定"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"使用螢幕鎖定功能"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"選擇新的鎖定設定"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"大功告成!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"如要存取私人空間,請從主畫面底部向上滑動,然後向下捲動。"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"完成"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"向下捲動即可存取私人空間"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"你最多可以新增 <xliff:g id="COUNT">%d</xliff:g> 個指紋"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"你新增的指紋數量已達上限"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"無法新增其他指紋"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"在摺疊狀態下繼續使用應用程式"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"流暢顯示"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"自動將某些內容的刷新率從 60 Hz 調高到 <xliff:g id="ID_1">%1$s</xliff:g> Hz。請注意,開啟這項設定會增加電池用量。"</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"自動將某些內容的刷新率調高到 <xliff:g id="ID_1">%1$d</xliff:g> Hz。請注意,開啟這項設定會增加電池用量。"</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"強制使用最高重新整理頻率"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"強制使用最高重新整理頻率可提升觸控回應和動畫品質。請注意,開啟這項設定會增加電池用量。"</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"螢幕感知"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"共通設定"</string>
<string name="apn_settings" msgid="4295467389400441299">"APN"</string>
<string name="apn_edit" msgid="2003683641840248741">"編輯存取點"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<string name="apn_not_set" msgid="8246646433109750293">"未設定"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"未設定"</string>
<string name="apn_name" msgid="6677695784108157953">"名稱"</string>
@@ -1933,12 +1981,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"使用無障礙按鈕開啟"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"按住音量調高鍵和調低鍵即可開啟"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"輕觸螢幕三下即可開啟"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"用兩指輕觸螢幕三下即可開啟"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"使用手勢啟用無障礙服務"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"使用無障礙手勢"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"如要使用這項功能,請輕觸螢幕底部的無障礙工具按鈕 <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g>。\n\n如要切換不同的功能,請按住無障礙工具按鈕。"</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"如要使用這項功能,請輕觸畫面上的無障礙工具按鈕。"</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"如要使用這項功能,請同時按住音量調高鍵和調低鍵。"</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"如要啟用及停用放大功能,請在螢幕上的任何地方輕觸三下。"</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"如要啟用及停用放大功能,請在螢幕上的任何地方用兩指輕觸三下。"</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"如要使用這項功能,請用 2 指從螢幕底部向上滑動。\n\n如要切換不同的功能,請用 2 指向上滑動並按住。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"如要使用這項功能,請用 3 指從螢幕底部向上滑動。\n\n如要切換不同的功能,請用 3 指向上滑動並按住。"</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"如要使用無障礙功能,請用 2 指從螢幕底部向上滑動。\n\n如要切換不同的功能,請用 2 指向上滑動並按住。"</string>
@@ -1960,6 +2010,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"按住音量調高鍵和調低鍵"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"按住音量調高鍵和調低鍵"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"同時按住音量調高鍵和調低鍵"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"用兩指輕觸螢幕三下"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"用兩指輕觸螢幕三下"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"用兩指快速輕觸螢幕 {0,number,integer} 下"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"輕觸螢幕三下"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"輕觸螢幕三下"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"快速輕觸螢幕 {0,number,integer} 下。這個手勢可能會影響裝置的運作效能"</string>
@@ -2047,8 +2100,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"使用震動與觸覺回饋"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"鬧鐘震動"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"媒體震動"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"鍵盤震動"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"響鈴震動"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"通知震動"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"觸覺回饋"</string>
@@ -2258,6 +2310,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"如果你限制應用程式的背景活動,應用程式可能無法正常運作"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"由於這個應用程式並未設為最佳化電池用量,因此你無法加以限制。\n\n如要限制應用程式,請先開啟電池效能最佳化功能。"</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"管理電池用量"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"無限制"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"最佳化"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"受限制"</string>
@@ -3059,8 +3115,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"文字大小, 大字, 大字型, 大型文字, 低視能, 放大文字, 放大字型, 使用大字型"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"一律開啟微光螢幕, 螢幕長亮模式"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"nfc, 標記, 感應器"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"鍵盤、觸覺技術、震動、"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"音量、震動、零打擾"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"媒體音量"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"投放音量"</string>
@@ -3769,6 +3824,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"授予管理所有檔案的權限"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"允許這個應用程式讀取、修改及刪除這部裝置或任何已連結儲存空間上的所有檔案。如果應用程式獲得授權,可能會在你不知情的情況下存取檔案。"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"可以存取所有檔案"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"全螢幕通知"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"允許這個應用程式顯示全螢幕通知"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"允許這個應用程式在裝置鎖定時顯示全螢幕通知。應用程式可能會在這類通知中顯示鬧鐘、來電或其他緊急通知。"</string>
@@ -4880,16 +4941,10 @@
<string name="about_phone_device_name_warning" msgid="3243226572404472381">"你安裝的應用程式會取得裝置名稱。當你連上藍牙裝置、Wi-Fi 網路或者設定 Wi-Fi 無線基地台時,其他人也可能會看到這個裝置名稱。"</string>
<string name="grammatical_gender_title" msgid="8584242850477270828">"語法性別"</string>
<string name="grammatical_gender_dialog_title" msgid="8754048592099871587">"選取語法性別"</string>
- <!-- no translation found for content_protection_preference_title (5069260032659193074) -->
- <skip />
- <!-- no translation found for content_protection_preference_summary (2252393849408445391) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_switch_title (60088482227901638) -->
- <skip />
- <!-- no translation found for content_protection_preference_user_consent_work_profile_switch_title (2868495870224174097) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_summary (7707255571476950976) -->
- <skip />
- <!-- no translation found for content_protection_preference_subpage_info (6010628258453929862) -->
- <skip />
+ <string name="content_protection_preference_title" msgid="5069260032659193074">"透過掃描找出欺騙性應用程式"</string>
+ <string name="content_protection_preference_summary" msgid="2252393849408445391">"檢查應用程式活動,找出網路釣魚"</string>
+ <string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"使用掃描功能"</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"掃描工作應用程式"</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 67b176c..70533e8 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -113,15 +113,14 @@
<string name="bluetooth_disable_leaudio" msgid="8619410595945155354">"Khubaza umsindo we-Bluetooth LE"</string>
<string name="bluetooth_disable_leaudio_summary" msgid="4756307633476985470">"Kukhubaza isakhi somsindo we-Bluetooth LE uma idivayisi isekela amakhono wehadiwe yomsindo we-LE."</string>
<string name="bluetooth_show_leaudio_device_details" msgid="3306637862550475370">"Bonisa ukuguqulwa komsindo we-LE Emininingwaneni Yedivayisi"</string>
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist (7392319491894565552) -->
- <skip />
- <!-- no translation found for bluetooth_bypass_leaudio_allowlist_summary (8999245286359656738) -->
- <skip />
+ <string name="bluetooth_bypass_leaudio_allowlist" msgid="7392319491894565552">"Dlula Uhlu Lwabagunyaziwe Lomsindo we-Bluetooth LE"</string>
+ <string name="bluetooth_bypass_leaudio_allowlist_summary" msgid="8999245286359656738">"Sebenzisa umsindo we-LE ngokuzenzakalela ngisho noma umsindo we-LE exhumekayo uqinisekisiwe ukuthi uyahlangabezane nomkhakha Wohlu Lwabagunyaziwe."</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"Amadivayisi emidiya"</string>
<string name="connected_device_call_device_title" msgid="88732390601723608">"Shayela amadivayisi"</string>
<string name="connected_device_other_device_title" msgid="4652120430615729193">"Amanye amadivayisi"</string>
<string name="connected_device_saved_title" msgid="5607274378851905959">"Amadivayisi alondoloziwe"</string>
<string name="connected_device_fast_pair_device_title" msgid="543124539265592392">"Ehlotshaniswe ne-akhawunti yakho"</string>
+ <string name="connected_device_previously_associated_fast_pair_device_title" msgid="8353405823992023457">"Kusetshenziswe ngaphambili nge-akhawunti"</string>
<string name="connected_device_add_device_summary" msgid="8671009879957120802">"I-Bluetooth izovula ukuze ibhanqe"</string>
<string name="connected_device_connections_title" msgid="4164120115341579170">"Izinketho zoxhumo"</string>
<string name="connected_device_previously_connected_screen_title" msgid="8823331744788100605">"Kuxhunywe ngaphambilini"</string>
@@ -134,6 +133,17 @@
<string name="stylus_textfield_handwriting" msgid="2363579035338976327">"Bhala ezinkambini zombhalo"</string>
<string name="stylus_ignore_button" msgid="7734540973145241391">"Ziba konke ukucindezela inkinobho ye-stylus"</string>
<string name="stylus_connected_devices_title" msgid="2823967577941359812">"I-Stylus"</string>
+ <string name="audio_sharing_title" msgid="4144157137502923821">"Ukwabelana ngomsindo"</string>
+ <string name="audio_sharing_switch_title" msgid="7052827328670825701">"Yabelana ngomsindo"</string>
+ <string name="calls_and_alarms_device_title" msgid="6993559028175454198">"Izingcingo nama-alamu"</string>
+ <!-- no translation found for audio_sharing_streams_category_title (862958129650324581) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_pref_title (4636293245167657721) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_title (8269455097512153101) -->
+ <skip />
+ <!-- no translation found for audio_sharing_streams_qr_code_summary (4231875597377863735) -->
+ <skip />
<string name="date_and_time" msgid="1788358029823431692">"Idethi nesikhathi"</string>
<string name="proxy_settings_title" msgid="4201866858226087066">"Ummeleli"</string>
<string name="proxy_clear_text" msgid="6529658759984031149">"Sula"</string>
@@ -537,7 +547,15 @@
<string name="private_space_title" msgid="7078627930195569767">"Isikhala Esiyimfihlo"</string>
<string name="private_space_summary" msgid="8237652417163408001">"Fihla ama-app kufolda eyimfihlo"</string>
<string name="private_space_one_lock_title" msgid="7306547190751832568">"Vula usebenzisa ukukhiya isikrini"</string>
- <string name="private_space_hide_title" msgid="1615744426933304644">"Bonisa Isikhala Esiyimfihlo"</string>
+ <string name="private_space_hide_title" msgid="8687034008994037610">"Fihla uma ikhiyiwe"</string>
+ <string name="privatespace_hide_page_title" msgid="972581369094289386">"Fihla Isikhala Esiyifihlo uma ikhiyile"</string>
+ <string name="privatespace_hide_page_summary" msgid="1052569521186403642">"Ukuvimbela abantu ukuthi bazi Isikhala Esiyimfihlo kwidivayisi yakho ungasifihla ohlwini lwama-app wakho"</string>
+ <string name="privatespace_access_header" msgid="982809349769470185">"Finyelela IsIkhala Esiyimfihlo uma sifihliwe"</string>
+ <string name="privatespace_search_description" msgid="983837656432484282">"Sesha \'Isikhala Esiyimfihlo\' ndaweni yokusesha"</string>
+ <string name="privatespace_tap_tile_description" msgid="4146608898639668340">"Thepha indawo Yesikhala Esiyimfihlo"</string>
+ <string name="privatespace_unlock_description" msgid="4132755357482447360">"Vula Isikhala sakho Esiyimfihlo"</string>
+ <string name="privatespace_hide_off_summary" msgid="7227778747159633671">"Valiwe"</string>
+ <string name="privatespace_hide_on_summary" msgid="6136704537527640183">"Vuliwe"</string>
<string name="private_space_category_system" msgid="1286843321867285700">"Isistimu"</string>
<string name="private_space_create_title" msgid="47273568884806726">"Sungula Isikhala Esiyimfihlo"</string>
<string name="private_space_delete_title" msgid="3075645119800272800">"Sula Isikhala Esiyimfihlo"</string>
@@ -546,6 +564,34 @@
<string name="private_space_create_failed" msgid="4908100791174213808">"Isikhala Esiyimfihlo asikwazanga ukusungulwa"</string>
<string name="private_space_deleted" msgid="7825768516955610897">"Isikhala Esiyimfihlo sidilithwe ngokuphumelelayo"</string>
<string name="private_space_delete_failed" msgid="8500755484258565011">"Isikhala Esiyimfihlo asikwazanga ukudilithwa"</string>
+ <string name="no_device_lock_title" msgid="1078223464721029954">"Setha ukukhiya isikrini"</string>
+ <string name="no_device_lock_summary" msgid="7653477413589207824">"Ukuze usebenzise Isikhala Esigodliwe, setha ukukhiya kwesikrini kule divayisi."</string>
+ <string name="no_device_lock_action_label" msgid="2640487005629001288">"Setha ukukhiya isikrini"</string>
+ <string name="no_device_lock_cancel" msgid="4412602160321228863">"Khansela"</string>
+ <string name="privatespace_cancel_label" msgid="362351004019511784">"Khansela"</string>
+ <string name="privatespace_setup_button_label" msgid="3696372546231047258">"Setha"</string>
+ <string name="privatespace_setup_title" msgid="177623114624330394">"Setha Isikhala Esiyimfihlo"</string>
+ <string name="privatespace_hide_apps_summary" msgid="4016518749055602268">"Fihla ama-app ayimfihlo esikhaleni esivikelekile ukuze afinyelelwe nguwe kuphela"</string>
+ <string name="privatespace_how_title" msgid="8794102046435526065">"Indlela esebenza ngayo"</string>
+ <string name="privatespace_access_bottom_text" msgid="1075244097441349030">"Ungafinyelela Esikhaleni Esiyimfihlo ekugcineni koluhlu lama-app wakho"</string>
+ <string name="privatespace_protected_lock_text" msgid="7320604832432017423">"Ama-app Asesikhaleni Esiyimfihlo avikelwe ngokhiya"</string>
+ <string name="privatespace_hidden_notifications_text" msgid="8121285743543004812">"Izaziso ezisuka kuzinhlelo zokusebenza eziku-Private Space ziyafihlwa uma sikhiyiwe"</string>
+ <string name="privatespace_apps_permission_text" msgid="4418511924151828812">"Ama-app ayimfihlo e-Space ngeke zivele kumphathi wemvume, kudeshibhodi yobumfihlo, nezinye izilungiselelo lapho i-Private Space ikhiyiwe"</string>
+ <string name="privatespace_setting_up_text" msgid="8532777749891406509">"Isetha Isikhala Esiyimfihlo…"</string>
+ <string name="privatespace_lock_protected_title" msgid="7409801274869666860">"I-Private Space ivikelwe ingidi"</string>
+ <string name="privatespace_apps_hidden_title" msgid="6146605677591599107">"Ulwazi lokusetshenziswa lwama-app e-Private Space luyafihlwa uma lukhiyiwe"</string>
+ <string name="privatespace_access_from_apps_title" msgid="6787000636686810564">"Finyelela ku-Private Space ohlwini lwakho lwama-app"</string>
+ <string name="privatespace_error_screen_title" msgid="8658511165913662275">"Ayikwazanga ukumisa i-Private Space"</string>
+ <string name="privatespace_error_screen_summary" msgid="5679626031159521676">"Zama futhi manje, noma ubuye kamuva"</string>
+ <string name="privatespace_tryagain_label" msgid="4091466165724929876">"Zama Futhi"</string>
+ <string name="privatespace_lockscreen_title" msgid="7459425150560213662">"Sebenzisa ukukhiya isikrini ukuze uvule?"</string>
+ <string name="privatespace_lockscreen_summary" msgid="980268845497843861">"Ungakwazi ukuvula i-Private Space ngendlela efanayo ovula ngayo idivayisi yakho, noma ukhethe ukhiye ohlukile"</string>
+ <string name="privatespace_use_screenlock_label" msgid="2775404941450049991">"Sebenzisa ukukhiya isikrini"</string>
+ <string name="privatespace_set_lock_label" msgid="6277529807188602545">"Khetha isikhiya esisha"</string>
+ <string name="privatespace_success_title" msgid="4854425684898602993">"Usulungile!"</string>
+ <string name="privatespace_access_text" msgid="8756118686974614618">"Ukuze ufinyelele Isikhala Esiyimfihlo, swayiphela phezulu kusukela phansi kwesikrini sakho sasekhaya, bese uskrolela phansi"</string>
+ <string name="privatespace_done_label" msgid="5534818213879562387">"Kwenziwe"</string>
+ <string name="scrolldown_to_access" msgid="5160743933093369151">"Skrolela phansi ukuze ufinyelele Indawo Eyimfihlo"</string>
<string name="fingerprint_add_max" msgid="8639321019299347447">"Ungangeza izigxivizo zeminwe ezingafika kwezingu-<xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="fingerprint_intro_error_max" msgid="4431784409732135610">"Ungeze inombolo ephezulu yezigxivizo zeminwe"</string>
<string name="fingerprint_intro_error_unknown" msgid="877005321503793963">"Ayikwazi ukwengeza izingxovizo zeminwe eziningi"</string>
@@ -1063,7 +1109,7 @@
<string name="display_white_balance_summary" msgid="7625456704950209050"></string>
<string name="fold_lock_behavior_title" msgid="786228803694268449">"Qhubeka usebenzisa kuma-app agoqiwe"</string>
<string name="peak_refresh_rate_title" msgid="1878771412897140903">"Isibonisi esibushelelezi"</string>
- <string name="peak_refresh_rate_summary" msgid="3627278682437562787">"Iphakamisa ngokuzenzakalela isilinganiso sokuvuselela kusukela kokungu-60 ukuya kokungu-<xliff:g id="ID_1">%1$s</xliff:g> Hz kokunye okuqukethwe. Ikhuphula ukusetshenziswa kwebhethri."</string>
+ <string name="peak_refresh_rate_summary" msgid="3212309985294885790">"Ikhuphula ngokuzenzakalelayo izinga lokuvuselela lifike ku-<xliff:g id="ID_1">%1$d</xliff:g> Hz kokunye okuqukethwe. Ikhuphula ukusetshenziswa kwebhethri."</string>
<string name="force_high_refresh_rate_toggle" msgid="3325789621928312050">"Phoqelela isilinganiso sokuvuselela esiphakeme"</string>
<string name="force_high_refresh_rate_desc" msgid="7794566420873814875">"Inani lokuvuselela eliphezulu kakhulu lokuphendula kokuthinta okuthuthukisiwe nekhwalithi yokugqwayiza. Ikhuphula ukusetshenziswa kwebhethri."</string>
<string name="adaptive_sleep_title" msgid="2987961991423539233">"Ukunaka isikrini"</string>
@@ -1299,6 +1345,8 @@
<string name="communal_settings_summary" msgid="4923914136953940317">"Amasethingi omphakathi"</string>
<string name="apn_settings" msgid="4295467389400441299">"APNs"</string>
<string name="apn_edit" msgid="2003683641840248741">"Hlela indawo yokungena"</string>
+ <!-- no translation found for apn_add (9069613192201630934) -->
+ <skip />
<!-- unknown quoting pattern: original -1, translation 1 -->
<string name="apn_not_set" msgid="8246646433109750293">"&lt;Ayisethiwe&gt;"</string>
<string name="apn_not_set_for_mvno" msgid="1141490067313964640">"Ayisethiwe"</string>
@@ -1934,12 +1982,14 @@
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Sebenzisa inkinobho yokufinyelela ukuze uvule"</string>
<string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Bamba okhiye bevolumu ukuze uvule"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Thepha kathathu isikrini ukuvula"</string>
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple" msgid="1090593773487065541">"Isikrini sokuthepha esiphindwe kathathu seminwe emibili ukuze uvule"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Sebenzisa ukuthinta ukuze uvule"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="6800684770875867559">"Sebenzisa ukufinyeleleka kokuthinta"</string>
<string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Ukuze usebenzise lesi sici, thepha inkinobho yokufinyeleleka <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> ngezansi kwesikrini.\n\nUkushintsha phakathi kwezici, thinta futhi ubambe inkinobho yokufinyeleleka."</string>
<string name="accessibility_tutorial_dialog_message_floating_button" msgid="2551777208185138391">"Ukuze usebenzise lesi sici, thepha inkinobho yokufinyeleleka kusikrini sakho."</string>
<string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Ukuze usebenzise lesi sici, cindezela futhi ubambe bobabili okhiye bevolumu."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Ukuqala nokumisa ukukhuliswa, thepha kathathu noma kuphi kusikrini."</string>
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple" msgid="6205072282308562361">"Ukuze uqale futhi umise ukukhuliswa, thepha kathathu noma yikuphi esikrinini sakho ngeminwe emibili."</string>
<string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Ukuze usebenzise lesi sici, swayiphela phezulu kusuka ezansi esikrinini ngeminwe emi-2.\n\nUkuze ushintshe phakathi kwezici, swayiphela phezulu ngeminwe emi-2 bese ubambe."</string>
<string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Ukuze usebenzise lesi sici, swayiphela phezulu kusuka ezansi esikrinini ngeminwe emi-3.\n\nUkuze ushintshe phakathi kwezici, swayiphela phezulu ngeminwe emi-3 bese ubambe."</string>
<string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Ukuze usebenzise isici sokufinyelela, swayiphela phezulu kusuka ezansi esikrinini ngeminwe emi-2.\n\nUkuze ushintshe phakathi kwezici, swayiphela phezulu ngeminwe emi-2 bese ubambe."</string>
@@ -1961,6 +2011,9 @@
<string name="accessibility_shortcut_edit_dialog_title_hardware" msgid="2356853121810443026">"Bamba okhiye bevolomu"</string>
<string name="accessibility_shortcut_hardware_keyword" msgid="3921915304537166064">"bamba okhiye bevolomu"</string>
<string name="accessibility_shortcut_edit_dialog_summary_hardware" msgid="2503134386397991634">"Cindezela futhi ubambe bobabili okhiye bevolumu"</string>
+ <string name="accessibility_shortcut_edit_dialog_title_two_finger_triple_tap" msgid="6687765191490040899">"Isikrini sokuthepha kathathu ngeminwe emibili"</string>
+ <string name="accessibility_shortcut_two_finger_triple_tap_keyword" msgid="4200744613585702430">"isikrini sokuthepha kathathu ngeminwe emibili"</string>
+ <string name="accessibility_shortcut_edit_dialog_summary_two_finger_triple_tap" msgid="2631127444247448793">"Thepha ngokushesha isikrini izikhathi ezingu-{0,number,integer} ngeminwe emibili"</string>
<string name="accessibility_shortcut_edit_dialog_title_triple_tap" msgid="6672798007229795841">"Isikrini sokuthepha kathathu"</string>
<string name="accessibility_shortcut_triple_tap_keyword" msgid="6863958573135995927">"isikrini sokuthepha kathathu"</string>
<string name="accessibility_shortcut_edit_dialog_summary_triple_tap" msgid="2102327956423320536">"Thepha ngokushesha isikrini izikhathi ezingu-{0,number,integer}. Lesi sinqamuleli singase sehlise isivinini sedivayisi yakho"</string>
@@ -2048,8 +2101,7 @@
<string name="accessibility_vibration_primary_switch_title" msgid="6162579254864450592">"Sebenzisa ukudlidliza nama-haptic"</string>
<string name="accessibility_alarm_vibration_title" msgid="4661294337828522745">"Ukudlidliza kwe-alamu"</string>
<string name="accessibility_media_vibration_title" msgid="1372073715403945428">"Ukudlidliza kwemidiya"</string>
- <!-- no translation found for accessibility_keyboard_vibration_title (7559967730626765441) -->
- <skip />
+ <string name="accessibility_keyboard_vibration_title" msgid="7559967730626765441">"Ukudlidliza kwekhibhodi"</string>
<string name="accessibility_ring_vibration_title" msgid="4689811297654320885">"Ukudlidliza kokukhala"</string>
<string name="accessibility_notification_vibration_title" msgid="6205679908785776478">"Ukudlidliza kwesaziso"</string>
<string name="accessibility_touch_vibration_title" msgid="533931451319110741">"Impendulo yokuthinta"</string>
@@ -2259,6 +2311,10 @@
<string name="background_activity_warning_dialog_text" msgid="8202776985767701095">"Uma ukhawulela umsebenzi wangasemuva wohlelo lokusebenza, lungahle lungasebenzi kahle"</string>
<string name="background_activity_disabled_dialog_text" msgid="4053170297325882494">"Njengoba lolu hlelo lokusebenza lungasethiwe ukuze kulungiselelwe ibhethri, awukwazi ukulikhawulela.\n\nUkuze ukhawulele uhlelo lokusebenza, qala uvule ukulungiselelwa kwebhethri."</string>
<string name="manager_battery_usage_category_title" msgid="1493303237531629961">"Phatha ukusetshenziswa kwebhethri"</string>
+ <!-- no translation found for manager_battery_usage_allow_background_usage_title (6294649996820358852) -->
+ <skip />
+ <!-- no translation found for manager_battery_usage_allow_background_usage_summary (8021153755201340819) -->
+ <skip />
<string name="manager_battery_usage_unrestricted_title" msgid="2426486290463258032">"Akunamkhawulo"</string>
<string name="manager_battery_usage_optimized_title" msgid="8080765739761921817">"Kulungisiwe"</string>
<string name="manager_battery_usage_restricted_title" msgid="7702863764130323118">"Kuvinjelwe"</string>
@@ -3060,8 +3116,7 @@
<string name="keywords_font_size" msgid="1643198841815006447">"usayizi wombhalo, ukuphrinta okukhulu, ifonti enkulu, umbhalo omkhulu, umbono ophansi, yenza umbhalo ube mkhulu, ukukhulisa ifonti, ukukhulisa ifonti"</string>
<string name="keywords_always_show_time_info" msgid="1066752498285497595">"isibonisi esihlala sikhanya se-ambient, i-AOD"</string>
<string name="keywords_change_nfc_tag_apps_state" msgid="9032287964590554366">"i-nfc, umaka, isifundi"</string>
- <!-- no translation found for keywords_keyboard_vibration (6485149510591654697) -->
- <skip />
+ <string name="keywords_keyboard_vibration" msgid="6485149510591654697">"ikhibhodi, ama-haptic, Ukudlidliza,"</string>
<string name="sound_dashboard_summary" msgid="6574444810552643312">"Ivolomu, ukudlidliza, ungaphazamisi"</string>
<string name="media_volume_option_title" msgid="5966569685119475630">"Ivolumu yabezindaba"</string>
<string name="remote_media_volume_option_title" msgid="8760846743943305764">"Ivolumu yokusakaza"</string>
@@ -3770,6 +3825,12 @@
<string name="permit_manage_external_storage" msgid="6928847280689401761">"Vumela ukufinyelela ukuze kuphathwe wonke amafayela"</string>
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Vumela lolu hlelo lokusebenza ukuthi lufunde, lulungise luphinde lususe wonke amafayela kule divayisi noma kwamanye amavolumu axhunyiwe esitoreji. Uma linikeziwe, uhlelo lokusebenza lungafinyelela kumafayela ngaphandle kokwazi kwakho okusobala."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Ingafinyelela kuwo wonke amafayela"</string>
+ <!-- no translation found for voice_activation_apps_title (7130045161611529825) -->
+ <skip />
+ <!-- no translation found for permit_voice_activation_apps (9152780172988949319) -->
+ <skip />
+ <!-- no translation found for allow_voice_activation_apps_description (6369745626995060656) -->
+ <skip />
<string name="full_screen_intent_title" msgid="747270185715224130">"Izaziso zesikrini esigcwele"</string>
<string name="permit_full_screen_intent" msgid="9035367640019960861">"Vumela izaziso zesikrini esigcwele ukusuka kule app"</string>
<string name="footer_description_full_screen_intent" msgid="7716518411349225528">"Vumela i-app ukuthi ibonise izaziso ezithatha isikrini esigcwele lapho idivayisi ikhiyiwe. Ama-app angasebenzisa lokhu ukuze agqamise ama-alamu, amakholi angenayo, noma ezinye izaziso eziphuthumayo."</string>
@@ -4885,6 +4946,6 @@
<string name="content_protection_preference_summary" msgid="2252393849408445391">"Hlola umsebenzi we-app wobugebengu bokweba imininingwane ebucayi"</string>
<string name="content_protection_preference_user_consent_switch_title" msgid="60088482227901638">"Sebenzisa ukuskena"</string>
<string name="content_protection_preference_user_consent_work_profile_switch_title" msgid="2868495870224174097">"Sebenzisa ukuskena kuma-app omsebenzi"</string>
- <string name="content_protection_preference_subpage_summary" msgid="7707255571476950976">"Ukuskena kusebenza ngokuyimfihlo khona kanye kudivayisi yakho, kubheka umsebenzi we-app ukuthola ubugebengu bokweba imininingwane ebucayi noma okunye ukuziphatha okukhohlisayo. Uma kutholwa, olunye ulwazi lwe-app luthunyelwa ku-Google Play Protect ukuze kuqinisekiswe usongo nokuxwayisa abasebenzisi be-app."</string>
- <string name="content_protection_preference_subpage_info" msgid="6010628258453929862">"Lesi isakhi esiqondene nezokuvikela esivikelwe. Ayikho idivayisi noma ulwazi lomuntu siqu olwabiwe ne-Google. \n\nUbugebengu bokweba imininingwane ebucayi kuwumzamo wokweba izimfanelo zokungena ngemvume noma olunye ulwazi lomuntu siqu."</string>
+ <string name="content_protection_preference_subpage_summary" msgid="3595621220981703364"></string>
+ <string name="content_protection_preference_subpage_info" msgid="6890886357653365489"></string>
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 99052ca..f50e918 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -753,6 +753,9 @@
<!-- Whether to display Cloned Apps page in Settings (Settings > Apps > Cloned Apps).-->
<bool name="config_cloned_apps_page_enabled">false</bool>
+ <!-- Whether to initiate Account login during Private Space setup.-->
+ <bool name="config_privatespace_account_login_enabled">false</bool>
+
<!-- Certificates of apps which are allowed to use activity embedding with Settings.-->
<string-array name="config_known_host_certs" translatable="false">
<item></item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ba56c53..808ddc4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1212,7 +1212,7 @@
<string name="private_space_hide_title">Hide when locked</string>
<!-- Title for the hide Private Space setting. [CHAR LIMIT=60] -->
<string name="privatespace_hide_page_title">Hide Private Space when locked</string>
- <!-- Description for hide Private Space settings page. [CHAR LIMIT=60] -->
+ <!-- Description for hide Private Space settings page. [CHAR LIMIT=NONE] -->
<string name="privatespace_hide_page_summary">To stop other people knowing Private Space is on your device, you can hide it from your apps list</string>
<!-- Header in hide Private Space settings page to access Private Space when hidden. [CHAR LIMIT=60] -->
<string name="privatespace_access_header">Access Private Space when hidden</string>
@@ -1298,6 +1298,10 @@
<string name="privatespace_done_label">Done</string>
<!-- Toast to show on private space setup completion informing user to scroll down All apps to access private space. [CHAR LIMIT=60] -->
<string name="scrolldown_to_access">Scroll down to access Private Space</string>
+ <!-- Title for Private Space account login error screen. [CHAR LIMIT=60] -->
+ <string name="privatespace_retry_signin_title">Sign in to set up Private Space</string>
+ <!-- Summary for the Private Space account login error screen. [CHAR LIMIT=NONE] -->
+ <string name="privatespace_retry_summary">You need to sign in to a Account to set up Private Space</string>
<!-- Text shown when "Add fingerprint" button is disabled -->
<string name="fingerprint_add_max">You can add up to <xliff:g id="count" example="5">%d</xliff:g> fingerprints</string>
@@ -1853,6 +1857,11 @@
<!-- Debugging developer settings: show refresh rate summary [CHAR LIMIT=58] -->
<string name="show_refresh_rate_summary">Show the current display refresh rate</string>
+ <!-- Debugging developer settings: show HDR/SDR ratio? [CHAR LIMIT=36] -->
+ <string name="show_hdr_sdr_ratio">Show HDR/SDR ratio</string>
+ <!-- Debugging developer settings: show HDR/SDR ratio summary [CHAR LIMIT=58] -->
+ <string name="show_hdr_sdr_ratio_summary">Show the current HDR/SDR ratio</string>
+
<!-- NFC settings -->
<!-- Used in the 1st-level settings screen to turn on NFC -->
<string name="nfc_quick_toggle_title">NFC</string>
@@ -3169,6 +3178,8 @@
<string name="apn_settings">APNs</string>
<!-- Screen title after user selects APNs setting option -->
<string name="apn_edit">Edit access point</string>
+ <!-- Screen title after user selects add APNs setting -->
+ <string name="apn_add">Add access point</string>
<!-- Edit access point label summary text when no value has been set -->
<string name="apn_not_set">Not set</string>
<!-- Edit access point label summary text when no value has been set for mvno value. [CHAR LIMIT=NONE]-->
@@ -4644,6 +4655,8 @@
<string name="accessibility_tutorial_dialog_title_volume">Hold volume keys to open</string>
<!-- Title for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
<string name="accessibility_tutorial_dialog_title_triple">Triple tap screen to open</string>
+ <!-- Title for the accessibility tutorial dialog in accessibility service with two finger triple tap. [CHAR LIMIT=100] -->
+ <string name="accessibility_tutorial_dialog_title_two_finger_triple">Two finger triple tap screen to open</string>
<!-- Title for the accessibility tutorial dialog in accessibility service with gesture. [CHAR LIMIT=50] -->
<string name="accessibility_tutorial_dialog_title_gesture">Use gesture to open</string>
<!-- Title for the accessibility tutorial dialog in gesture navigation settings. [CHAR LIMIT=50] -->
@@ -4656,6 +4669,8 @@
<string name="accessibility_tutorial_dialog_message_volume">To use this feature, press & hold both volume keys.</string>
<!-- Instruction for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
<string name="accessibility_tutorial_dialog_message_triple">To start and stop magnification, triple-tap anywhere on your screen.</string>
+ <!-- Instruction for the accessibility tutorial dialog in accessibility service with two finger triple tap. [CHAR LIMIT=100] -->
+ <string name="accessibility_tutorial_dialog_message_two_finger_triple">To start and stop magnification, triple-tap anywhere on your screen with two fingers.</string>
<!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is not enabled. [CHAR LIMIT=NONE] -->
<string name="accessibility_tutorial_dialog_message_gesture">To use this feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
<!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is enabled. [CHAR LIMIT=NONE] -->
@@ -5430,6 +5445,10 @@
<!-- Category title for battery background settings in power usage detail page [CHAR LIMIT=NONE] -->
<string name="manager_battery_usage_category_title">Manage battery usage</string>
+ <!-- Title for allow background usage [CHAR LIMIT=NONE] -->
+ <string name="manager_battery_usage_allow_background_usage_title">Allow background usage</string>
+ <!-- Summary for allow background usage [CHAR LIMIT=NONE] -->
+ <string name="manager_battery_usage_allow_background_usage_summary">Enable for real-time updates, disable to save battery</string>
<!-- Title for the battery unrestricted settings [CHAR_LIMIT=40] -->
<string name="manager_battery_usage_unrestricted_title">Unrestricted</string>
<!-- Title for the battery optimized settings [CHAR_LIMIT=40] -->
@@ -9510,6 +9529,13 @@
<!-- Label for showing apps that can manage external storage[CHAR LIMIT=45] -->
<string name="filter_manage_external_storage">Can access all files</string>
+ <!-- Voice Activation apps settings title [CHAR LIMIT=40] -->
+ <string name="voice_activation_apps_title">Voice activation apps</string>
+ <!-- Label for a setting which controls whether an app can be voice activated [CHAR LIMIT=NONE] -->
+ <string name="permit_voice_activation_apps">Allow voice activation</string>
+ <!-- Description for a setting which controls whether an app can be voice activated [CHAR LIMIT=NONE] -->
+ <string name ="allow_voice_activation_apps_description">Voice activation turns-on approved apps, hands-free, using voice command. Built-in adaptive sensing ensures data stays private only to you.\n\n<a href="">More about protected adaptive sensing</a></string>
+
<!-- Manage full screen intent permission title [CHAR LIMIT=40] -->
<string name="full_screen_intent_title">Full screen notifications</string>
@@ -12604,9 +12630,9 @@
<!-- Summary of the preference to manage content protection settings -->
<string name="content_protection_preference_summary">Check app activity for phishing</string>
<!-- Title of the switch bar on the subpage of content protection settings -->
- <string name="content_protection_preference_user_consent_switch_title">Use scanning</string>
+ <string name="content_protection_preference_user_consent_switch_title">Use scanning for deceptive apps</string>
<!-- Title of the toggle switch of work apps on the subpage of content protection settings -->
- <string name="content_protection_preference_user_consent_work_profile_switch_title">Use scanning for work apps</string>
+ <string name="content_protection_preference_user_consent_work_profile_switch_title">Use scanning for deceptive apps for work</string>
<!-- Default summary of the subpage of content protection settings. Will be overlaid by OEM. -->
<string name="content_protection_preference_subpage_summary"></string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 3a2f9ad..8736689 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -433,6 +433,15 @@
<item name="android:textSize">14sp</item>
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:paddingBottom">24dp</item>
+ <item name="android:textIsSelectable">true</item>
+ </style>
+
+ <style name="DeviceAudioSharingText">
+ <item name="android:textAlignment">viewStart</item>
+ <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
+ <item name="android:textSize">14sp</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:paddingBottom">24dp</item>
</style>
<style name="ContextualCardStyle">
diff --git a/res/xml/bluetooth_audio_sharing.xml b/res/xml/bluetooth_audio_sharing.xml
index 86bb062..ca7137a 100644
--- a/res/xml/bluetooth_audio_sharing.xml
+++ b/res/xml/bluetooth_audio_sharing.xml
@@ -26,6 +26,12 @@
settings:controller="com.android.settings.connecteddevice.audiosharing.CallsAndAlarmsPreferenceController"
android:summary=""/>
+ <com.android.settings.connecteddevice.audiosharing.AudioSharingNamePreference
+ android:key="audio_sharing_stream_name"
+ android:title="Stream name"
+ android:summary="********"
+ settings:controller="com.android.settings.connecteddevice.audiosharing.AudioSharingNamePreferenceController"/>
+
<PreferenceCategory
android:key="audio_streams_settings_category"
android:title="@string/audio_sharing_streams_category_title"
@@ -38,5 +44,4 @@
android:icon="@drawable/ic_chevron_right_24dp" />
</PreferenceCategory>
-
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index b053424..f890984 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -274,6 +274,11 @@
android:summary="@string/show_refresh_rate_summary" />
<SwitchPreferenceCompat
+ android:key="show_hdr_sdr_ratio"
+ android:title="@string/show_hdr_sdr_ratio"
+ android:summary="@string/show_hdr_sdr_ratio_summary" />
+
+ <SwitchPreferenceCompat
android:key="overlay_settings"
android:title="@string/overlay_settings_title"
android:summary="@string/overlay_settings_summary" />
diff --git a/res/xml/power_background_usage_detail.xml b/res/xml/power_background_usage_detail.xml
new file mode 100644
index 0000000..fb089fd
--- /dev/null
+++ b/res/xml/power_background_usage_detail.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2023 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:title="@string/manager_battery_usage_allow_background_usage_title">
+
+ <com.android.settingslib.widget.LayoutPreference
+ android:key="header_view"
+ android:layout="@layout/settings_entity_header"
+ android:selectable="false"/>
+
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="allow_background_usage"
+ android:title="@string/manager_battery_usage_allow_background_usage_title"
+ settings:controller="com.android.settings.fuelgauge.AllowBackgroundPreferenceController"/>
+
+ <com.android.settingslib.widget.SelectorWithWidgetPreference
+ android:key="optimized_preference"
+ android:title="@string/manager_battery_usage_optimized_title"
+ android:summary="@string/manager_battery_usage_optimized_summary"
+ settings:controller="com.android.settings.fuelgauge.OptimizedPreferenceController"/>
+
+ <com.android.settingslib.widget.SelectorWithWidgetPreference
+ android:key="unrestricted_preference"
+ android:title="@string/manager_battery_usage_unrestricted_title"
+ android:summary="@string/manager_battery_usage_unrestricted_summary"
+ settings:controller="com.android.settings.fuelgauge.UnrestrictedPreferenceController"/>
+
+ <com.android.settingslib.widget.FooterPreference
+ android:key="app_usage_footer_preference"
+ android:title="@string/manager_battery_usage_footer"
+ android:selectable="false"
+ settings:searchable="false"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index 7b92f99..f3b30b6 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -50,30 +50,11 @@
android:title="@string/manager_battery_usage_category_title"
android:key="manage_battery_usage_category">
- <com.android.settingslib.widget.SelectorWithWidgetPreference
- android:key="unrestricted_pref"
- android:summary="@string/manager_battery_usage_unrestricted_summary"
- android:title="@string/manager_battery_usage_unrestricted_title"
- settings:controller="com.android.settings.fuelgauge.UnrestrictedPreferenceController"/>
-
- <com.android.settingslib.widget.SelectorWithWidgetPreference
- android:key="optimized_pref"
- android:summary="@string/manager_battery_usage_optimized_summary"
- android:title="@string/manager_battery_usage_optimized_title"
- settings:controller="com.android.settings.fuelgauge.OptimizedPreferenceController"/>
-
- <com.android.settingslib.widget.SelectorWithWidgetPreference
- android:key="restricted_pref"
- android:summary="@string/manager_battery_usage_restricted_summary"
- android:title="@string/manager_battery_usage_restricted_title"
- settings:controller="com.android.settings.fuelgauge.RestrictedPreferenceController"/>
+ <com.android.settingslib.PrimarySwitchPreference
+ android:key="allow_background_usage"
+ android:title="@string/manager_battery_usage_allow_background_usage_title"
+ settings:controller="com.android.settings.fuelgauge.AllowBackgroundPreferenceController"/>
</PreferenceCategory>
- <com.android.settingslib.widget.FooterPreference
- android:key="app_usage_footer_preference"
- android:title="@string/manager_battery_usage_footer"
- android:selectable="false"
- settings:searchable="false"/>
-
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/special_access.xml b/res/xml/special_access.xml
index b3f3f7d..3f3d75d 100644
--- a/res/xml/special_access.xml
+++ b/res/xml/special_access.xml
@@ -100,6 +100,11 @@
settings:controller="com.android.settings.spa.app.specialaccess.UseFullScreenIntentPreferenceController" />
<Preference
+ android:key="voice_activation_apps"
+ android:title="@string/voice_activation_apps_title"
+ settings:controller="com.android.settings.spa.app.specialaccess.VoiceActivationAppsPreferenceController" />
+
+ <Preference
android:key="picture_in_picture"
android:title="@string/picture_in_picture_title"
android:order="-1100"
diff --git a/src/com/android/settings/SettingsActivityUtil.kt b/src/com/android/settings/SettingsActivityUtil.kt
index 65d26de..c23bc18 100644
--- a/src/com/android/settings/SettingsActivityUtil.kt
+++ b/src/com/android/settings/SettingsActivityUtil.kt
@@ -37,6 +37,7 @@
import com.android.settings.spa.app.specialaccess.ModifySystemSettingsAppListProvider
import com.android.settings.spa.app.specialaccess.NfcTagAppsSettingsProvider
import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider
+import com.android.settings.spa.app.specialaccess.VoiceActivationAppsListProvider
import com.android.settings.spa.app.specialaccess.WifiControlAppListProvider
import com.android.settings.wifi.ChangeWifiStateDetails
@@ -65,6 +66,8 @@
WifiControlAppListProvider.getAppInfoRoutePrefix(),
NfcTagAppsSettingsProvider::class.qualifiedName to
NfcTagAppsSettingsProvider.getAppInfoRoutePrefix(),
+ VoiceActivationAppsListProvider::class.qualifiedName to
+ VoiceActivationAppsListProvider.getAppInfoRoutePrefix(),
)
@JvmStatic
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index ee2dc05..e90ed87 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -54,6 +54,7 @@
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
+import com.android.server.accessibility.Flags;
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.widget.LottieColorUtils;
@@ -411,6 +412,23 @@
return new TutorialPage(type, title, image, indicatorIcon, instruction);
}
+ private static TutorialPage createTwoFingerTripleTapTutorialPage(@NonNull Context context) {
+ // TODO(b/308088945): Update tutorial string and image when UX provides them
+ final int type = UserShortcutType.TWOFINGERTRIPLETAP;
+ final CharSequence title =
+ context.getText(R.string.accessibility_tutorial_dialog_title_two_finger_triple);
+ final View image =
+ createIllustrationViewWithImageRawResource(context,
+ R.raw.a11y_shortcut_type_triple_tap);
+ final CharSequence instruction =
+ context.getText(R.string.accessibility_tutorial_dialog_message_two_finger_triple);
+ final ImageView indicatorIcon =
+ createImageView(context, R.drawable.ic_accessibility_page_indicator);
+ indicatorIcon.setEnabled(false);
+
+ return new TutorialPage(type, title, image, indicatorIcon, instruction);
+ }
+
@VisibleForTesting
static List<TutorialPage> createShortcutTutorialPages(@NonNull Context context,
int shortcutTypes) {
@@ -427,6 +445,13 @@
tutorialPages.add(createTripleTapTutorialPage(context));
}
+ if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
+ if ((shortcutTypes & UserShortcutType.TWOFINGERTRIPLETAP)
+ == UserShortcutType.TWOFINGERTRIPLETAP) {
+ tutorialPages.add(createTwoFingerTripleTapTutorialPage(context));
+ }
+ }
+
return tutorialPages;
}
diff --git a/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java b/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
index 076d37c..02d5c27 100644
--- a/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
+++ b/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
@@ -28,6 +28,7 @@
import android.app.ActivityManager;
import android.app.IActivityManager;
+import android.app.settings.SettingsEnums;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
@@ -44,8 +45,10 @@
import com.android.settings.R;
import com.android.settings.Utils;
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.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.ActionButtonsPreference;
import java.util.ArrayList;
@@ -104,6 +107,7 @@
Log.e(TAG, "Unable to set user min aspect ratio");
return;
}
+ logActionMetrics(selectedKey, mSelectedKey);
// Only update to selected aspect ratio if nothing goes wrong
mSelectedKey = selectedKey;
updateAllPreferences(mSelectedKey);
@@ -118,8 +122,7 @@
@Override
public int getMetricsCategory() {
- // TODO(b/292566895): add metrics for logging
- return 0;
+ return SettingsEnums.USER_ASPECT_RATIO_APP_INFO_SETTINGS;
}
@Override
@@ -244,6 +247,68 @@
}
}
+ private void logActionMetrics(@NonNull String selectedKey, @NonNull String unselectedKey) {
+ final MetricsFeatureProvider metricsFeatureProvider =
+ FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+ final int attribution = metricsFeatureProvider.getAttribution(getActivity());
+ metricsFeatureProvider.action(
+ attribution,
+ getUnselectedAspectRatioAction(unselectedKey),
+ getMetricsCategory(),
+ mPackageName,
+ mUserId
+ );
+ metricsFeatureProvider.action(
+ attribution,
+ getSelectedAspectRatioAction(selectedKey),
+ getMetricsCategory(),
+ mPackageName,
+ mUserId
+ );
+ }
+
+ private static int getSelectedAspectRatioAction(@NonNull String selectedKey) {
+ switch (selectedKey) {
+ case KEY_PREF_DEFAULT:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_APP_DEFAULT_SELECTED;
+ case KEY_PREF_FULLSCREEN:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_FULL_SCREEN_SELECTED;
+ case KEY_PREF_HALF_SCREEN:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_HALF_SCREEN_SELECTED;
+ case KEY_PREF_4_3:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_4_3_SELECTED;
+ case KEY_PREF_16_9:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_16_9_SELECTED;
+ case KEY_PREF_3_2:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_3_2_SELECTED;
+ case KEY_PREF_DISPLAY_SIZE:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_DISPLAY_SIZE_SELECTED;
+ default:
+ return SettingsEnums.ACTION_UNKNOWN;
+ }
+ }
+
+ private static int getUnselectedAspectRatioAction(@NonNull String unselectedKey) {
+ switch (unselectedKey) {
+ case KEY_PREF_DEFAULT:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_APP_DEFAULT_UNSELECTED;
+ case KEY_PREF_FULLSCREEN:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_FULL_SCREEN_UNSELECTED;
+ case KEY_PREF_HALF_SCREEN:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_HALF_SCREEN_UNSELECTED;
+ case KEY_PREF_4_3:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_4_3_UNSELECTED;
+ case KEY_PREF_16_9:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_16_9_UNSELECTED;
+ case KEY_PREF_3_2:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_3_2_UNSELECTED;
+ case KEY_PREF_DISPLAY_SIZE:
+ return SettingsEnums.ACTION_USER_ASPECT_RATIO_DISPLAY_SIZE_UNSELECTED;
+ default:
+ return SettingsEnums.ACTION_UNKNOWN;
+ }
+ }
+
@VisibleForTesting
UserAspectRatioManager getAspectRatioManager() {
return mUserAspectRatioManager;
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index c94edc6..1d96688 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -46,14 +46,14 @@
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.spaprivileged.template.app.AppListItemKt;
+import com.android.settingslib.spaprivileged.template.app.AppListItemModelKt;
import com.android.settingslib.spaprivileged.template.app.AppListPageKt;
import com.android.settingslib.widget.LottieColorUtils;
import com.airbnb.lottie.LottieAnimationView;
/**
- * @deprecated Will be removed, use {@link AppListItemKt} {@link AppListPageKt} instead.
+ * @deprecated Will be removed, use {@link AppListItemModelKt} {@link AppListPageKt} instead.
*/
@Deprecated(forRemoval = true)
public class ApplicationViewHolder extends RecyclerView.ViewHolder {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplicationsUtil.kt b/src/com/android/settings/applications/manageapplications/ManageApplicationsUtil.kt
index 216ce47..82e987e 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplicationsUtil.kt
+++ b/src/com/android/settings/applications/manageapplications/ManageApplicationsUtil.kt
@@ -64,9 +64,11 @@
import com.android.settings.spa.app.specialaccess.AllFilesAccessAppListProvider
import com.android.settings.spa.app.specialaccess.DisplayOverOtherAppsAppListProvider
import com.android.settings.spa.app.specialaccess.InstallUnknownAppsListProvider
+import com.android.settings.spa.app.specialaccess.LongBackgroundTasksAppListProvider
import com.android.settings.spa.app.specialaccess.MediaManagementAppsAppListProvider
import com.android.settings.spa.app.specialaccess.ModifySystemSettingsAppListProvider
import com.android.settings.spa.app.specialaccess.NfcTagAppsSettingsProvider
+import com.android.settings.spa.app.specialaccess.TurnScreenOnAppsAppListProvider
import com.android.settings.spa.app.specialaccess.WifiControlAppListProvider
import com.android.settings.spa.app.storage.StorageAppListPageProvider
import com.android.settings.spa.notification.AppListNotificationsPageProvider
@@ -120,6 +122,8 @@
LIST_TYPE_MAIN -> AllAppListPageProvider.name
LIST_TYPE_NFC_TAG_APPS -> NfcTagAppsSettingsProvider.getAppListRoute()
LIST_TYPE_USER_ASPECT_RATIO_APPS -> UserAspectRatioAppsPageProvider.name
+ LIST_TYPE_LONG_BACKGROUND_TASKS -> LongBackgroundTasksAppListProvider.getAppListRoute()
+ LIST_TYPE_TURN_SCREEN_ON -> TurnScreenOnAppsAppListProvider.getAppListRoute()
// TODO(b/292165031) enable once sorting is supported
//LIST_TYPE_STORAGE -> StorageAppListPageProvider.Apps.name
//LIST_TYPE_GAMES -> StorageAppListPageProvider.Games.name
diff --git a/src/com/android/settings/applications/specialaccess/PaymentSettingsEnabler.java b/src/com/android/settings/applications/specialaccess/PaymentSettingsEnabler.java
index 597705c..e378eb3 100644
--- a/src/com/android/settings/applications/specialaccess/PaymentSettingsEnabler.java
+++ b/src/com/android/settings/applications/specialaccess/PaymentSettingsEnabler.java
@@ -17,8 +17,10 @@
package com.android.settings.applications.specialaccess;
import android.content.Context;
+import android.nfc.Flags;
import android.nfc.NfcAdapter;
import android.nfc.cardemulation.CardEmulation;
+import android.os.UserHandle;
import androidx.preference.Preference;
@@ -64,12 +66,21 @@
}
}
+ private boolean hasAnyServices() {
+ if (Flags.enableNfcMainline()) {
+ return mCardEmuManager.getServices(
+ CardEmulation.CATEGORY_PAYMENT, UserHandle.myUserId()).isEmpty();
+ } else {
+ return mCardEmuManager.getServices(CardEmulation.CATEGORY_PAYMENT).isEmpty();
+ }
+ }
+
@Override
public void resume() {
if (!isNfcAvailable()) {
return;
}
- if (mCardEmuManager.getServices(CardEmulation.CATEGORY_PAYMENT).isEmpty()) {
+ if (hasAnyServices()) {
mIsPaymentAvailable = false;
} else {
mIsPaymentAvailable = true;
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 2185ed5..594cf7a 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -77,6 +77,7 @@
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -84,6 +85,7 @@
import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.activityembedding.ActivityEmbeddingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.transition.SettingsTransitionHelper;
import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.TwoTargetPreference;
@@ -146,12 +148,47 @@
return manager != null && isHardwareDetected;
}
+
/**
*
*/
+ @SearchIndexable
public static class FingerprintSettingsFragment extends DashboardFragment
implements OnPreferenceChangeListener, FingerprintPreference.OnDeleteClickListener {
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.security_settings_fingerprint) {
+ @Override
+ public List<AbstractPreferenceController>
+ createPreferenceControllers(Context context) {
+ return createThePreferenceControllers(context);
+ }
+ };
+
+ private static List<AbstractPreferenceController> createThePreferenceControllers(Context
+ context) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ FingerprintManager manager = Utils.getFingerprintManagerOrNull(context);
+ if (manager == null || !manager.isHardwareDetected()) {
+ return null;
+ }
+ if (manager.isPowerbuttonFps()) {
+ controllers.add(
+ new FingerprintUnlockCategoryController(
+ context,
+ KEY_FINGERPRINT_UNLOCK_CATEGORY
+ ));
+ controllers.add(
+ new FingerprintSettingsRequireScreenOnToAuthPreferenceController(
+ context,
+ KEY_REQUIRE_SCREEN_ON_TO_AUTH
+ ));
+ }
+ controllers.add(new FingerprintsEnrolledCategoryPreferenceController(context,
+ KEY_FINGERPRINTS_ENROLLED_CATEGORY));
+ return controllers;
+ }
+
private static class FooterColumn {
CharSequence mTitle = null;
CharSequence mLearnMoreOverrideText = null;
@@ -741,7 +778,7 @@
// If it's in split mode, show the error dialog and don't need to show adding
// fingerprint intent.
final boolean isActivityEmbedded = ActivityEmbeddingUtils.isActivityEmbedded(
- getActivity());
+ getActivity());
if (getActivity().isInMultiWindowMode() && !isActivityEmbedded) {
BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT).show(
getActivity().getSupportFragmentManager(),
@@ -847,20 +884,20 @@
}
private List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
- final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ final List<AbstractPreferenceController> controllers =
+ createThePreferenceControllers(context);
if (isSfps()) {
- mFingerprintUnlockCategoryPreferenceController =
- new FingerprintUnlockCategoryController(
- context,
- KEY_FINGERPRINT_UNLOCK_CATEGORY
- );
- mRequireScreenOnToAuthPreferenceController =
- new FingerprintSettingsRequireScreenOnToAuthPreferenceController(
- context,
- KEY_REQUIRE_SCREEN_ON_TO_AUTH
- );
- controllers.add(mFingerprintUnlockCategoryPreferenceController);
- controllers.add(mRequireScreenOnToAuthPreferenceController);
+ for (AbstractPreferenceController controller : controllers) {
+ if (controller.getPreferenceKey() == KEY_FINGERPRINT_UNLOCK_CATEGORY) {
+ mFingerprintUnlockCategoryPreferenceController =
+ (FingerprintUnlockCategoryController) controller;
+ } else if (controller.getPreferenceKey() == KEY_REQUIRE_SCREEN_ON_TO_AUTH) {
+ mRequireScreenOnToAuthPreferenceController =
+ (FingerprintSettingsRequireScreenOnToAuthPreferenceController)
+ controller;
+ }
+
+ }
}
return controllers;
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java
index 006f73b..61ec54b 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java
@@ -24,7 +24,6 @@
import androidx.preference.Preference;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
@@ -108,6 +107,10 @@
return UserHandle.of(getUserId()).getIdentifier();
}
+ /**
+ * This feature is not directly searchable.
+ */
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.security_settings_fingerprint) {};
+ new BaseSearchIndexProvider() {};
+
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
index 98b7ed0..58ef509 100644
--- a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
@@ -16,14 +16,61 @@
package com.android.settings.biometrics.fingerprint2.conversion
+import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_CANCELED
+import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS
import android.hardware.fingerprint.FingerprintManager
+import com.android.settings.R
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-class Util
-
-fun EnrollReason.toOriginalReason(): Int {
- return when (this) {
- EnrollReason.EnrollEnrolling -> FingerprintManager.ENROLL_ENROLL
- EnrollReason.FindSensor -> FingerprintManager.ENROLL_FIND_SENSOR
+object Util {
+ fun EnrollReason.toOriginalReason(): Int {
+ return when (this) {
+ EnrollReason.EnrollEnrolling -> FingerprintManager.ENROLL_ENROLL
+ EnrollReason.FindSensor -> FingerprintManager.ENROLL_FIND_SENSOR
+ }
}
+
+ fun Int.toEnrollError(isSetupWizard: Boolean): FingerEnrollState.EnrollError {
+ val errTitle =
+ when (this) {
+ FingerprintManager.FINGERPRINT_ERROR_TIMEOUT ->
+ R.string.security_settings_fingerprint_enroll_error_dialog_title
+ FingerprintManager.FINGERPRINT_ERROR_BAD_CALIBRATION ->
+ R.string.security_settings_fingerprint_bad_calibration_title
+ else -> R.string.security_settings_fingerprint_enroll_error_unable_to_process_dialog_title
+ }
+ val errString =
+ if (isSetupWizard) {
+ when (this) {
+ FingerprintManager.FINGERPRINT_ERROR_TIMEOUT ->
+ R.string.security_settings_fingerprint_enroll_error_dialog_title
+ FingerprintManager.FINGERPRINT_ERROR_BAD_CALIBRATION ->
+ R.string.security_settings_fingerprint_bad_calibration_title
+ else -> R.string.security_settings_fingerprint_enroll_error_unable_to_process_dialog_title
+ }
+ } else {
+ when (this) {
+ // This message happens when the underlying crypto layer
+ // decides to revoke the enrollment auth token
+ FingerprintManager.FINGERPRINT_ERROR_TIMEOUT ->
+ R.string.security_settings_fingerprint_enroll_error_timeout_dialog_message
+ FingerprintManager.FINGERPRINT_ERROR_BAD_CALIBRATION ->
+ R.string.security_settings_fingerprint_bad_calibration
+ FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS ->
+ R.string.security_settings_fingerprint_enroll_error_unable_to_process_message
+ // There's nothing specific to tell the user about. Ask them to try again.
+ else -> R.string.security_settings_fingerprint_enroll_error_generic_dialog_message
+ }
+ }
+
+ return FingerEnrollState.EnrollError(
+ errTitle,
+ errString,
+ this == FINGERPRINT_ERROR_UNABLE_TO_PROCESS,
+ this == FINGERPRINT_ERROR_CANCELED,
+ )
+ }
+
}
+
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
index 5c9232f..984d04c 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
@@ -24,12 +24,16 @@
import android.os.CancellationSignal
import android.util.Log
import com.android.settings.biometrics.GatekeeperPasswordProvider
-import com.android.settings.biometrics.fingerprint2.conversion.toOriginalReason
+import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError
+import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason
+import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintFlow
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
import com.android.settings.password.ChooseLockSettingsHelper
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlin.coroutines.resume
@@ -38,9 +42,12 @@
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.onFailure
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.update
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
@@ -51,7 +58,8 @@
private val backgroundDispatcher: CoroutineDispatcher,
private val fingerprintManager: FingerprintManager,
private val gatekeeperPasswordProvider: GatekeeperPasswordProvider,
- private val pressToAuthProvider: () -> Boolean,
+ private val pressToAuthProvider: PressToAuthProvider,
+ private val fingerprintFlow: FingerprintFlow,
) : FingerprintManagerInteractor {
private val maxFingerprints =
@@ -60,6 +68,8 @@
)
private val applicationContext = applicationContext.applicationContext
+ private val enrollRequestOutstanding = MutableStateFlow(false)
+
override suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray> =
suspendCoroutine {
val callback = GenerateChallengeCallback { _, userId, challenge ->
@@ -75,11 +85,11 @@
fingerprintManager.generateChallenge(applicationContext.userId, callback)
}
- override val enrolledFingerprints: Flow<List<FingerprintViewModel>> = flow {
+ override val enrolledFingerprints: Flow<List<FingerprintData>> = flow {
emit(
fingerprintManager
.getEnrolledFingerprints(applicationContext.userId)
- .map { (FingerprintViewModel(it.name.toString(), it.biometricId, it.deviceId)) }
+ .map { (FingerprintData(it.name.toString(), it.biometricId, it.deviceId)) }
.toList()
)
}
@@ -103,28 +113,51 @@
override suspend fun enroll(
hardwareAuthToken: ByteArray?,
enrollReason: EnrollReason,
- ): Flow<FingerEnrollStateViewModel> = callbackFlow {
+ ): Flow<FingerEnrollState> = callbackFlow {
+ // TODO (b/308456120) Improve this logic
+ if (enrollRequestOutstanding.value) {
+ Log.d(TAG, "Outstanding enroll request, waiting 150ms")
+ delay(150)
+ if (enrollRequestOutstanding.value) {
+ Log.e(TAG, "Request still present, continuing")
+ }
+ }
+
+ enrollRequestOutstanding.update { true }
+
var streamEnded = false
+ var totalSteps: Int? = null
val enrollmentCallback =
object : FingerprintManager.EnrollmentCallback() {
override fun onEnrollmentProgress(remaining: Int) {
- trySend(FingerEnrollStateViewModel.EnrollProgress(remaining)).onFailure { error ->
+ // This is sort of an implementation detail, but unfortunately the API isn't
+ // very expressive. If anything we should look at changing the FingerprintManager API.
+ if (totalSteps == null) {
+ totalSteps = remaining + 1
+ }
+
+ trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure {
+ error ->
Log.d(TAG, "onEnrollmentProgress($remaining) failed to send, due to $error")
}
+
if (remaining == 0) {
streamEnded = true
+ enrollRequestOutstanding.update { false }
}
}
override fun onEnrollmentHelp(helpMsgId: Int, helpString: CharSequence?) {
- trySend(FingerEnrollStateViewModel.EnrollHelp(helpMsgId, helpString.toString()))
+ trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString()))
.onFailure { error -> Log.d(TAG, "onEnrollmentHelp failed to send, due to $error") }
}
override fun onEnrollmentError(errMsgId: Int, errString: CharSequence?) {
- trySend(FingerEnrollStateViewModel.EnrollError(errMsgId, errString.toString()))
+ trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard))
.onFailure { error -> Log.d(TAG, "onEnrollmentError failed to send, due to $error") }
+ Log.d(TAG, "onEnrollmentError($errMsgId)")
streamEnded = true
+ enrollRequestOutstanding.update { false }
}
}
@@ -140,12 +173,13 @@
// If the stream has not been ended, and the user has stopped collecting the flow
// before it was over, send cancel.
if (!streamEnded) {
+ Log.e(TAG, "Cancel is sent from settings for enroll()")
cancellationSignal.cancel()
}
}
}
- override suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean = suspendCoroutine {
+ override suspend fun removeFingerprint(fp: FingerprintData): Boolean = suspendCoroutine {
val callback =
object : RemovalCallback() {
override fun onRemovalError(
@@ -170,7 +204,7 @@
)
}
- override suspend fun renameFingerprint(fp: FingerprintViewModel, newName: String) {
+ override suspend fun renameFingerprint(fp: FingerprintData, newName: String) {
withContext(backgroundDispatcher) {
fingerprintManager.rename(fp.fingerId, applicationContext.userId, newName)
}
@@ -181,11 +215,11 @@
}
override suspend fun pressToAuthEnabled(): Boolean = suspendCancellableCoroutine {
- it.resume(pressToAuthProvider())
+ it.resume(pressToAuthProvider.isEnabled)
}
- override suspend fun authenticate(): FingerprintAuthAttemptViewModel =
- suspendCancellableCoroutine { c: CancellableContinuation<FingerprintAuthAttemptViewModel> ->
+ override suspend fun authenticate(): FingerprintAuthAttemptModel =
+ suspendCancellableCoroutine { c: CancellableContinuation<FingerprintAuthAttemptModel> ->
val authenticationCallback =
object : FingerprintManager.AuthenticationCallback() {
@@ -195,7 +229,7 @@
Log.d(TAG, "framework sent down onAuthError after finish")
return
}
- c.resume(FingerprintAuthAttemptViewModel.Error(errorCode, errString.toString()))
+ c.resume(FingerprintAuthAttemptModel.Error(errorCode, errString.toString()))
}
override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
@@ -204,7 +238,7 @@
Log.d(TAG, "framework sent down onAuthError after finish")
return
}
- c.resume(FingerprintAuthAttemptViewModel.Success(result.fingerprint?.biometricId ?: -1))
+ c.resume(FingerprintAuthAttemptModel.Success(result.fingerprint?.biometricId ?: -1))
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt b/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt
new file mode 100644
index 0000000..38c5335
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.repository
+
+import android.content.Context
+import android.provider.Settings
+import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
+
+class PressToAuthProviderImpl(val context: Context) : PressToAuthProvider {
+ override val isEnabled: Boolean
+ get() {
+ var toReturn: Int =
+ Settings.Secure.getIntForUser(
+ context.contentResolver,
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ -1,
+ context.userId,
+ )
+ if (toReturn == -1) {
+ toReturn =
+ if (
+ context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
+ ) {
+ 1
+ } else {
+ 0
+ }
+ Settings.Secure.putIntForUser(
+ context.contentResolver,
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ toReturn,
+ context.userId
+ )
+ }
+ return (toReturn == 1)
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
similarity index 60%
copy from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
copy to src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
index db28e79..e776b9a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
@@ -14,21 +14,14 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.shared.data.repository
-data class FingerprintViewModel(
- val name: String,
- val fingerId: Int,
- val deviceId: Long,
-)
-
-sealed class FingerprintAuthAttemptViewModel {
- data class Success(
- val fingerId: Int,
- ) : FingerprintAuthAttemptViewModel()
-
- data class Error(
- val error: Int,
- val message: String,
- ) : FingerprintAuthAttemptViewModel()
-}
+/**
+ * Interface that indicates if press to auth is on or off.
+ */
+interface PressToAuthProvider {
+ /**
+ * Indicates true if the PressToAuth feature is enabled, false otherwise.
+ */
+ val isEnabled: Boolean
+}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
index 7286715..94afa49 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
@@ -17,9 +17,9 @@
package com.android.settings.biometrics.fingerprint2.shared.domain.interactor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import kotlinx.coroutines.flow.Flow
@@ -31,7 +31,7 @@
*/
interface FingerprintManagerInteractor {
/** Returns the list of current fingerprints. */
- val enrolledFingerprints: Flow<List<FingerprintViewModel>>
+ val enrolledFingerprints: Flow<List<FingerprintData>>
/** Returns the max enrollable fingerprints, note during SUW this might be 1 */
val maxEnrollableFingerprints: Flow<Int>
@@ -43,7 +43,7 @@
val sensorPropertiesInternal: Flow<FingerprintSensor?>
/** Runs the authenticate flow */
- suspend fun authenticate(): FingerprintAuthAttemptViewModel
+ suspend fun authenticate(): FingerprintAuthAttemptModel
/**
* Generates a challenge with the provided [gateKeeperPasswordHandle] and on success returns a
@@ -56,22 +56,22 @@
/**
* Runs [FingerprintManager.enroll] with the [hardwareAuthToken] and [EnrollReason] for this
- * enrollment. Returning the [FingerEnrollStateViewModel] that represents this fingerprint
+ * enrollment. Returning the [FingerEnrollState] that represents this fingerprint
* enrollment state.
*/
suspend fun enroll(
- hardwareAuthToken: ByteArray?,
- enrollReason: EnrollReason,
- ): Flow<FingerEnrollStateViewModel>
+ hardwareAuthToken: ByteArray?,
+ enrollReason: EnrollReason,
+ ): Flow<FingerEnrollState>
/**
* Removes the given fingerprint, returning true if it was successfully removed and false
* otherwise
*/
- suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean
+ suspend fun removeFingerprint(fp: FingerprintData): Boolean
/** Renames the given fingerprint if one exists */
- suspend fun renameFingerprint(fp: FingerprintViewModel, newName: String)
+ suspend fun renameFingerprint(fp: FingerprintData, newName: String)
/** Indicates if the device has side fingerprint */
suspend fun hasSideFps(): Boolean
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReasonViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt
similarity index 100%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReasonViewModel.kt
rename to src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
similarity index 73%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollStateViewModel.kt
rename to src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
index 179ac60..4766d59 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollStateViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
@@ -22,19 +22,28 @@
* Represents a fingerprint enrollment state. See [FingerprintManager.EnrollmentCallback] for more
* information
*/
-sealed class FingerEnrollStateViewModel {
- /** Represents enrollment step progress. */
+sealed class FingerEnrollState {
+ /**
+ * Represents an enrollment step progress.
+ *
+ * Progress is obtained by (totalStepsRequired - remainingSteps) / totalStepsRequired
+ */
data class EnrollProgress(
val remainingSteps: Int,
- ) : FingerEnrollStateViewModel()
+ val totalStepsRequired: Int,
+ ) : FingerEnrollState()
+
/** Represents that recoverable error has been encountered during enrollment. */
data class EnrollHelp(
@StringRes val helpMsgId: Int,
val helpString: String,
- ) : FingerEnrollStateViewModel()
+ ) : FingerEnrollState()
+
/** Represents that an unrecoverable error has been encountered and the operation is complete. */
data class EnrollError(
- @StringRes val errMsgId: Int,
- val errString: String,
- ) : FingerEnrollStateViewModel()
+ @StringRes val errTitle: Int,
+ @StringRes val errString: Int,
+ val shouldRetryEnrollment: Boolean,
+ val isCancelled: Boolean,
+ ) : FingerEnrollState()
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
similarity index 84%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
rename to src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
index db28e79..b2aa25c 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
@@ -16,19 +16,19 @@
package com.android.settings.biometrics.fingerprint2.shared.model
-data class FingerprintViewModel(
+data class FingerprintData(
val name: String,
val fingerId: Int,
val deviceId: Long,
)
-sealed class FingerprintAuthAttemptViewModel {
+sealed class FingerprintAuthAttemptModel {
data class Success(
val fingerId: Int,
- ) : FingerprintAuthAttemptViewModel()
+ ) : FingerprintAuthAttemptModel()
data class Error(
val error: Int,
val message: String,
- ) : FingerprintAuthAttemptViewModel()
+ ) : FingerprintAuthAttemptModel()
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt
new file mode 100644
index 0000000..93c7577
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.shared.model
+
+/**
+ * The [FingerprintFlow] for fingerprint enrollment indicates information on how the flow should behave.
+ */
+sealed class FingerprintFlow
+
+/** The default enrollment experience, typically called from Settings */
+data object Default : FingerprintFlow()
+
+/** SetupWizard/Out of box experience (OOBE) enrollment type. */
+data object SetupWizard : FingerprintFlow()
+
+/** Unicorn enrollment type */
+data object Unicorn : FingerprintFlow()
+
+/** Flow to specify settings type */
+data object Settings : FingerprintFlow()
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index 58fcea6..de2a1ee 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -16,12 +16,9 @@
package com.android.settings.biometrics.fingerprint2.ui.enrollment.activity
-import android.annotation.ColorInt
import android.app.Activity
import android.content.Intent
-import android.content.res.ColorStateList
import android.content.res.Configuration
-import android.graphics.Color
import android.hardware.fingerprint.FingerprintManager
import android.os.Bundle
import android.provider.Settings
@@ -35,22 +32,27 @@
import com.android.internal.widget.LockPatternUtils
import com.android.settings.R
import com.android.settings.SetupWizardUtils
-import com.android.settings.Utils
import com.android.settings.Utils.SETTINGS_PACKAGE_NAME
import com.android.settings.biometrics.BiometricEnrollBase
import com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST
import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.repository.PressToAuthProviderImpl
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollEnrollingV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment.RFPSEnrollFragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
@@ -65,8 +67,11 @@
import com.android.settings.password.ChooseLockGeneric
import com.android.settings.password.ChooseLockSettingsHelper
import com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.google.android.setupcompat.util.WizardManagerHelper
import com.google.android.setupdesign.util.ThemeHelper
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
@@ -77,6 +82,7 @@
* children fragments.
*/
class FingerprintEnrollmentV2Activity : FragmentActivity() {
+ private lateinit var fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
@@ -84,6 +90,7 @@
private lateinit var foldStateViewModel: FoldStateViewModel
private lateinit var orientationStateViewModel: OrientationStateViewModel
private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
+ private lateinit var backgroundViewModel: BackgroundViewModel
private val coroutineDispatcher = Dispatchers.Default
/** Result listener for ChooseLock activity flow. */
@@ -101,23 +108,22 @@
}
}
- override fun onAttachedToWindow() {
- window.statusBarColor = getBackgroundColor()
- super.onAttachedToWindow()
+ override fun onStop() {
+ super.onStop()
+ if (!isChangingConfigurations) {
+ backgroundViewModel.wentToBackground()
+ }
}
+ override fun onResume() {
+ super.onResume()
+ backgroundViewModel.inForeground()
+ }
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
foldStateViewModel.onConfigurationChange(newConfig)
}
- @ColorInt
- private fun getBackgroundColor(): Int {
- val stateList: ColorStateList? =
- Utils.getColorAttr(applicationContext, android.R.attr.windowBackground)
- return stateList?.defaultColor ?: Color.TRANSPARENT
- }
-
private fun onConfirmDevice(resultCode: Int, data: Intent?) {
val wasSuccessful = resultCode == RESULT_FINISHED || resultCode == Activity.RESULT_OK
val gateKeeperPasswordHandle = data?.getExtra(EXTRA_KEY_GK_PW_HANDLE) as Long?
@@ -137,39 +143,28 @@
val context = applicationContext
val fingerprintManager = context.getSystemService(FINGERPRINT_SERVICE) as FingerprintManager
+ val isAnySuw = WizardManagerHelper.isAnySetupWizard(intent)
+ val enrollType =
+ if (isAnySuw) {
+ SetupWizard
+ } else {
+ Default
+ }
+
+ backgroundViewModel =
+ ViewModelProvider(this, BackgroundViewModel.BackgroundViewModelFactory())[
+ BackgroundViewModel::class.java]
+
val interactor =
FingerprintManagerInteractorImpl(
context,
backgroundDispatcher,
fingerprintManager,
- GatekeeperPasswordProvider(LockPatternUtils(context))
- ) {
- var toReturn: Int =
- Settings.Secure.getIntForUser(
- context.contentResolver,
- Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
- -1,
- context.userId,
- )
- if (toReturn == -1) {
- toReturn =
- if (
- context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
- ) {
- 1
- } else {
- 0
- }
- Settings.Secure.putIntForUser(
- context.contentResolver,
- Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
- toReturn,
- context.userId
- )
- }
- toReturn == 1
- }
+ GatekeeperPasswordProvider(LockPatternUtils(context)),
+ PressToAuthProviderImpl(context),
+ enrollType,
+ )
var challenge: Long? = intent.getExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE) as Long?
val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
@@ -191,7 +186,8 @@
backgroundDispatcher,
interactor,
gatekeeperViewModel,
- gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo, /* canSkipConfirm */
+ gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo,
+ enrollType,
)
)[FingerprintEnrollNavigationViewModel::class.java]
@@ -207,7 +203,8 @@
this,
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
interactor,
- backgroundDispatcher
+ gatekeeperViewModel,
+ navigationViewModel,
)
)[FingerprintEnrollViewModel::class.java]
@@ -230,6 +227,16 @@
ViewModelProvider(this, OrientationStateViewModel.OrientationViewModelFactory(context))[
OrientationStateViewModel::class.java]
+ // Initialize FingerprintEnrollEnrollingViewModel
+ fingerprintEnrollEnrollingViewModel =
+ ViewModelProvider(
+ this,
+ FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingViewModelFactory(
+ fingerprintEnrollViewModel,
+ backgroundViewModel
+ )
+ )[FingerprintEnrollEnrollingViewModel::class.java]
+
// Initialize FingerprintEnrollFindSensorViewModel
ViewModelProvider(
this,
@@ -237,48 +244,65 @@
navigationViewModel,
fingerprintEnrollViewModel,
gatekeeperViewModel,
+ backgroundViewModel,
accessibilityViewModel,
foldStateViewModel,
orientationStateViewModel
)
)[FingerprintEnrollFindSensorViewModel::class.java]
+ // Initialize RFPS View Model
+ ViewModelProvider(
+ this,
+ RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel)
+ )[RFPSViewModel::class.java]
+
lifecycleScope.launch {
- navigationViewModel.navigationViewModel.filterNotNull().collect {
- Log.d(TAG, "navigationStep $it")
- val isForward = it.forward
- val currStep = it.currStep
- val theClass: Class<Fragment>? =
- when (currStep) {
- Confirmation -> FingerprintEnrollConfirmationV2Fragment::class.java as Class<Fragment>
- Education -> FingerprintEnrollFindSensorV2Fragment::class.java as Class<Fragment>
- Enrollment -> FingerprintEnrollEnrollingV2Fragment::class.java as Class<Fragment>
- Intro -> FingerprintEnrollIntroV2Fragment::class.java as Class<Fragment>
- else -> null
- }
-
- if (theClass != null) {
- supportFragmentManager.fragments.onEach { fragment ->
- supportFragmentManager.beginTransaction().remove(fragment).commit()
- }
- supportFragmentManager
- .beginTransaction()
- .setReorderingAllowed(true)
- .add(R.id.fragment_container_view, theClass, null)
- .commit()
- } else {
-
- if (currStep is Finish) {
- if (currStep.resultCode != null) {
- finishActivity(currStep.resultCode)
- } else {
- finish()
+ navigationViewModel.navigationViewModel
+ .filterNotNull()
+ .combine(fingerprintEnrollViewModel.sensorType) { nav, sensorType -> Pair(nav, sensorType) }
+ .collect { (nav, sensorType) ->
+ Log.d(TAG, "navigationStep $nav")
+ fingerprintEnrollViewModel.sensorTypeCached = sensorType
+ val isForward = nav.forward
+ val currStep = nav.currStep
+ val theClass: Class<Fragment>? =
+ when (currStep) {
+ Confirmation -> FingerprintEnrollConfirmationV2Fragment::class.java as Class<Fragment>
+ Education -> FingerprintEnrollFindSensorV2Fragment::class.java as Class<Fragment>
+ is Enrollment -> {
+ when (sensorType) {
+ FingerprintSensorType.REAR -> RFPSEnrollFragment::class.java as Class<Fragment>
+ else -> FingerprintEnrollEnrollingV2Fragment::class.java as Class<Fragment>
+ }
+ }
+ Intro -> FingerprintEnrollIntroV2Fragment::class.java as Class<Fragment>
+ else -> null
}
- } else if (currStep == LaunchConfirmDeviceCredential) {
- launchConfirmOrChooseLock(userId)
+
+ if (theClass != null) {
+ supportFragmentManager.fragments.onEach { fragment ->
+ supportFragmentManager.beginTransaction().remove(fragment).commit()
+ }
+
+ supportFragmentManager
+ .beginTransaction()
+ .setReorderingAllowed(true)
+ .add(R.id.fragment_container_view, theClass, null)
+ .commit()
+ } else {
+
+ if (currStep is Finish) {
+ if (currStep.resultCode != null) {
+ finishActivity(currStep.resultCode)
+ } else {
+ finish()
+ }
+ } else if (currStep == LaunchConfirmDeviceCredential) {
+ launchConfirmOrChooseLock(userId)
+ }
}
}
- }
}
val fromSettingsSummary =
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
index 0afa613..bfd4264 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
@@ -30,6 +30,7 @@
import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog
import com.android.settings.biometrics.fingerprint.FingerprintFindSensorAnimation
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
@@ -54,23 +55,8 @@
private var animation: FingerprintFindSensorAnimation? = null
private var contentLayoutId: Int = -1
- private lateinit var viewModel: FingerprintEnrollFindSensorViewModel
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- viewModel =
- ViewModelProvider(requireActivity())[FingerprintEnrollFindSensorViewModel::class.java]
- lifecycleScope.launch {
- viewModel.sensorType.collect {
- contentLayoutId =
- when (it) {
- FingerprintSensorType.UDFPS_OPTICAL,
- FingerprintSensorType.UDFPS_ULTRASONIC -> R.layout.udfps_enroll_find_sensor_layout
- FingerprintSensorType.POWER_BUTTON -> R.layout.sfps_enroll_find_sensor_layout
- else -> R.layout.fingerprint_v2_enroll_find_sensor
- }
- }
- }
+ private val viewModel: FingerprintEnrollFindSensorViewModel by lazy {
+ ViewModelProvider(requireActivity())[FingerprintEnrollFindSensorViewModel::class.java]
}
override fun onCreateView(
@@ -78,6 +64,18 @@
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
+
+ val sensorType =
+ ViewModelProvider(requireActivity())[FingerprintEnrollViewModel::class.java].sensorTypeCached
+
+ contentLayoutId =
+ when (sensorType) {
+ FingerprintSensorType.UDFPS_OPTICAL,
+ FingerprintSensorType.UDFPS_ULTRASONIC -> R.layout.udfps_enroll_find_sensor_layout
+ FingerprintSensorType.POWER_BUTTON -> R.layout.sfps_enroll_find_sensor_layout
+ else -> R.layout.fingerprint_v2_enroll_find_sensor
+ }
+
return inflater.inflate(contentLayoutId, container, false).also { it ->
val view = it!! as GlifLayout
@@ -106,7 +104,8 @@
}
lifecycleScope.launch {
viewModel.showRfpsAnimation.collect {
- animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
+ animation =
+ view.findViewById(R.id.fingerprint_sensor_location_animation)
animation!!.startAnimation()
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
index 898b158..b1ab301 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
@@ -36,11 +36,11 @@
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.shared.model.Unicorn
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Unicorn
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
@@ -120,7 +120,7 @@
viewLifecycleOwner.lifecycleScope.launch {
combine(
- navigationViewModel.enrollType,
+ navigationViewModel.fingerprintFlow,
fingerprintViewModel.sensorType,
) { enrollType, sensorType ->
Pair(enrollType, sensorType)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/README.md b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/README.md
new file mode 100644
index 0000000..dfb9598
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/README.md
@@ -0,0 +1,26 @@
+# Module enrollment
+
+### Fingerprint Settings Enrollment Modules
+
+This directory is responsible for containing the enrollment modules, each enrollment module is
+responsible for the actual enrolling portion of FingerprintEnrollment.
+The modules should be split out into udfps, rfps, and sfps.
+
+[comment]: <> This file structure print out has been generated with the tree command.
+
+```
+├── enrolling
+│ └── rfps
+│ ├── data
+│ ├── domain
+│ │ └── RFPSInteractor.kt
+│ ├── README.md
+│ └── ui
+│ ├── fragment
+│ │ └── RFPSEnrollFragment.kt
+│ ├── viewmodel
+│ │ └── RFPSViewModel.kt
+│ └── widget
+│ └── RFPSProgressIndicator.kt
+└── README.md
+```
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
new file mode 100644
index 0000000..d8c2f5a
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment
+
+import android.graphics.Color
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewGroup
+import android.view.animation.AnimationUtils
+import android.view.animation.Interpolator
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.FingerprintErrorDialog
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.IconTouchDialog
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.RFPSProgressBar
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment
+import com.google.android.setupcompat.template.FooterBarMixin
+import com.google.android.setupcompat.template.FooterButton
+import com.google.android.setupdesign.GlifLayout
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.launch
+
+private const val TAG = "RFPSEnrollFragment"
+
+/** This fragment is responsible for taking care of rear fingerprint enrollment. */
+class RFPSEnrollFragment : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
+
+ private lateinit var linearOutSlowInInterpolator: Interpolator
+ private lateinit var fastOutLinearInInterpolator: Interpolator
+ private lateinit var textView: TextView
+ private lateinit var progressBar: RFPSProgressBar
+
+ private val iconTouchViewModel: RFPSIconTouchViewModel by lazy {
+ ViewModelProvider(requireActivity())[RFPSIconTouchViewModel::class.java]
+ }
+
+ private val orientationViewModel: OrientationStateViewModel by lazy {
+ ViewModelProvider(requireActivity())[OrientationStateViewModel::class.java]
+ }
+
+ private val rfpsViewModel: RFPSViewModel by lazy {
+ ViewModelProvider(requireActivity())[RFPSViewModel::class.java]
+ }
+
+ private val backgroundViewModel: BackgroundViewModel by lazy {
+ ViewModelProvider(requireActivity())[BackgroundViewModel::class.java]
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = super.onCreateView(inflater, container, savedInstanceState)!!
+ val fragment = this
+ val context = requireContext()
+ val glifLayout = view.requireViewById(R.id.setup_wizard_layout) as GlifLayout
+ glifLayout.setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message)
+ glifLayout.setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title)
+
+ fastOutLinearInInterpolator =
+ AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_linear_in)
+ linearOutSlowInInterpolator =
+ AnimationUtils.loadInterpolator(context, android.R.interpolator.linear_out_slow_in)
+
+ textView = view.requireViewById(R.id.text) as TextView
+ progressBar = view.requireViewById(R.id.fingerprint_progress_bar) as RFPSProgressBar
+
+ val footerBarMixin = glifLayout.getMixin(FooterBarMixin::class.java)
+ footerBarMixin.secondaryButton =
+ FooterButton.Builder(context)
+ .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
+ .setListener { Log.e(TAG, "skip enrollment!") }
+ .setButtonType(FooterButton.ButtonType.SKIP)
+ .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
+ .build()
+ footerBarMixin.buttonContainer.setBackgroundColor(Color.TRANSPARENT)
+
+ progressBar.setOnTouchListener { _, motionEvent ->
+ if (motionEvent.actionMasked == MotionEvent.ACTION_DOWN) {
+ iconTouchViewModel.userTouchedFingerprintIcon()
+ }
+ true
+ }
+
+ // On any orientation event, dismiss dialogs.
+ viewLifecycleOwner.lifecycleScope.launch {
+ orientationViewModel.orientation.collect { dismissDialogs() }
+ }
+
+ // Signal we are ready for enrollment.
+ rfpsViewModel.readyForEnrollment()
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ repeatOnLifecycle(Lifecycle.State.RESUMED) {
+ // Icon animation update
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.shouldAnimateIcon.collect { animate ->
+ progressBar.updateIconAnimation(animate)
+ }
+ }
+
+ // Flow to show a dialog.
+ viewLifecycleOwner.lifecycleScope.launch {
+ iconTouchViewModel.shouldShowDialog.collectLatest { showDialog ->
+ if (showDialog) {
+ try {
+ IconTouchDialog.showInstance(fragment)
+ } catch (exception: Exception) {
+ Log.d(TAG, "Dialog dismissed due to $exception")
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // If we go to the background, then finish enrollment. This should be permanent finish,
+ // and shouldn't be reset until we explicitly tell the view model we want to retry
+ // enrollment.
+ viewLifecycleOwner.lifecycleScope.launch {
+ backgroundViewModel.background
+ .filter { inBackground -> inBackground }
+ .collect { rfpsViewModel.stopEnrollment() }
+ }
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.progress.filterNotNull().collect { progress -> handleEnrollProgress(progress) }
+ }
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.helpMessage.filterNotNull().collect { help ->
+ textView.text = help.helpString
+ textView.visibility = View.VISIBLE
+ textView.translationY =
+ resources.getDimensionPixelSize(R.dimen.fingerprint_error_text_appear_distance).toFloat()
+ textView.alpha = 0f
+ textView
+ .animate()
+ .alpha(1f)
+ .translationY(0f)
+ .setDuration(200)
+ .setInterpolator(linearOutSlowInInterpolator)
+ .start()
+
+ }
+ }
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.errorMessage.filterNotNull().collect { error -> handleEnrollError(error) }
+ }
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.textViewIsVisible.collect {
+ textView.visibility = if (it) View.VISIBLE else View.INVISIBLE
+ }
+ }
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.clearHelpMessage.collect {
+ textView
+ .animate()
+ .alpha(0f)
+ .translationY(
+ resources
+ .getDimensionPixelSize(R.dimen.fingerprint_error_text_disappear_distance)
+ .toFloat()
+ )
+ .setDuration(100)
+ .setInterpolator(fastOutLinearInInterpolator)
+ .withEndAction { rfpsViewModel.setVisibility(false) }
+ .start()
+ }
+ }
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ repeatOnLifecycle(Lifecycle.State.DESTROYED) {
+ rfpsViewModel.stopEnrollment()
+ dismissDialogs()
+ }
+ }
+ return view
+ }
+
+ private fun handleEnrollError(error: FingerEnrollState.EnrollError) {
+ val fragment = this
+ viewLifecycleOwner.lifecycleScope.launch {
+ try {
+ val shouldRestartEnrollment = FingerprintErrorDialog.showInstance(error, fragment)
+ } catch (exception: Exception) {
+ Log.e(TAG, "Exception occurred $exception")
+ }
+ onEnrollmentFailed()
+ }
+ }
+
+ private fun onEnrollmentFailed() {
+ rfpsViewModel.stopEnrollment()
+ }
+
+ private fun handleEnrollProgress(progress: FingerEnrollState.EnrollProgress) {
+ progressBar.updateProgress(
+ progress.remainingSteps.toFloat() / progress.totalStepsRequired.toFloat()
+ )
+
+ if (progress.remainingSteps == 0) {
+ performNextStepSuccess()
+ }
+ }
+
+ private fun performNextStepSuccess() {}
+
+ private fun dismissDialogs() {
+ val transaction = parentFragmentManager.beginTransaction()
+ for (frag in parentFragmentManager.fragments) {
+ if (frag is InstrumentedDialogFragment) {
+ Log.d(TAG, "removing dialog settings fragment $frag")
+ frag.dismiss()
+ transaction.remove(frag)
+ }
+ }
+ transaction.commitAllowingStateLoss()
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
new file mode 100644
index 0000000..c16e65c
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.shareIn
+import kotlinx.coroutines.flow.transform
+import kotlinx.coroutines.flow.update
+
+private const val touchesToShowDialog = 3
+/**
+ * This class is responsible for counting the number of touches on the fingerprint icon, and if this
+ * number reaches a threshold it will produce an action via [shouldShowDialog] to indicate the ui
+ * should show a dialog.
+ */
+class RFPSIconTouchViewModel : ViewModel() {
+
+ /** Keeps the number of times a user has touches the fingerprint icon. */
+ private val _touches: MutableStateFlow<Int> = MutableStateFlow(0)
+
+ /**
+ * Whether or not the UI should be showing the dialog. By making this SharingStarted.Eagerly
+ * the first event 0 % 3 == 0 will fire as soon as this view model is created, so it should
+ * be ignored and work as intended.
+ */
+ val shouldShowDialog: Flow<Boolean> =
+ _touches
+ .transform { numTouches -> emit((numTouches % touchesToShowDialog) == 0) }
+ .shareIn(viewModelScope, SharingStarted.Eagerly, 0)
+
+ /** Indicates a user has tapped on the fingerprint icon. */
+ fun userTouchedFingerprintIcon() {
+ _touches.update { _touches.value + 1 }
+ }
+
+ class RFPSIconTouchViewModelFactory : ViewModelProvider.Factory {
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return RFPSIconTouchViewModel() as T
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
new file mode 100644
index 0000000..58d604e
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.shareIn
+import kotlinx.coroutines.flow.transform
+import kotlinx.coroutines.flow.update
+
+/** View Model used by the rear fingerprint enrollment fragment. */
+class RFPSViewModel(
+ private val fingerprintEnrollViewModel: FingerprintEnrollEnrollingViewModel,
+) : ViewModel() {
+
+ /** Value to indicate if the text view is visible or not **/
+ private val _textViewIsVisible = MutableStateFlow<Boolean>(false)
+ val textViewIsVisible: Flow<Boolean> = _textViewIsVisible.asStateFlow()
+
+ /** Indicates if the icon should be animating or not */
+ val shouldAnimateIcon = fingerprintEnrollViewModel.enrollFlowShouldBeRunning
+
+ private val enrollFlow: Flow<FingerEnrollState?> = fingerprintEnrollViewModel.enrollFLow
+
+ /**
+ * Enroll progress message with a replay of size 1 allowing for new subscribers to get the most
+ * recent state (this is useful for things like screen rotation)
+ */
+ val progress: Flow<FingerEnrollState.EnrollProgress?> =
+ enrollFlow
+ .filterIsInstance<FingerEnrollState.EnrollProgress>()
+ .shareIn(viewModelScope, SharingStarted.Eagerly, 1)
+
+ /** Clear help message on enroll progress */
+ val clearHelpMessage: Flow<Boolean> = progress.map { it != null }
+
+ /** Enroll help message that is only displayed once */
+ val helpMessage: Flow<FingerEnrollState.EnrollHelp?> =
+ enrollFlow
+ .filterIsInstance<FingerEnrollState.EnrollHelp>()
+ .shareIn(viewModelScope, SharingStarted.Eagerly, 0).transform {
+ _textViewIsVisible.update { true }
+ }
+
+ /**
+ * The error message should only be shown once, for scenarios like screen rotations, we don't want
+ * to re-show the error message.
+ */
+ val errorMessage: Flow<FingerEnrollState.EnrollError?> =
+ enrollFlow
+ .filterIsInstance<FingerEnrollState.EnrollError>()
+ .shareIn(viewModelScope, SharingStarted.Eagerly, 0)
+
+ /** Indicates if the consumer is ready for enrollment */
+ fun readyForEnrollment() {
+ fingerprintEnrollViewModel.canEnroll()
+ }
+
+ /** Indicates if enrollment should stop */
+ fun stopEnrollment() {
+ fingerprintEnrollViewModel.stopEnroll()
+ }
+
+ fun setVisibility(isVisible: Boolean) {
+ _textViewIsVisible.update { isVisible }
+ }
+
+ class RFPSViewModelFactory(
+ private val fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel,
+ ) : ViewModelProvider.Factory {
+
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(
+ modelClass: Class<T>,
+ ): T {
+ return RFPSViewModel(fingerprintEnrollEnrollingViewModel) as T
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
new file mode 100644
index 0000000..b9c628e
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.app.settings.SettingsEnums
+import android.content.DialogInterface
+import android.os.Bundle
+import android.util.Log
+import androidx.fragment.app.Fragment
+import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment
+import kotlin.coroutines.resume
+import kotlinx.coroutines.suspendCancellableCoroutine
+
+private const val TAG = "FingerprintErrorDialog"
+
+/** A Dialog used for fingerprint enrollment when an error occurs. */
+class FingerprintErrorDialog : InstrumentedDialogFragment() {
+ private lateinit var onContinue: DialogInterface.OnClickListener
+ private lateinit var onTryAgain: DialogInterface.OnClickListener
+ private lateinit var onCancelListener: DialogInterface.OnCancelListener
+
+ override fun onCancel(dialog: DialogInterface) {
+ Log.d(TAG, "onCancel $dialog")
+ onCancelListener.onCancel(dialog)
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ Log.d(TAG, "onCreateDialog $this")
+ val errorString = requireArguments().getInt(KEY_MESSAGE)
+ val errorTitle = requireArguments().getInt(KEY_TITLE)
+ val builder = AlertDialog.Builder(requireContext())
+ val shouldShowTryAgain = requireArguments().getBoolean(KEY_SHOULD_TRY_AGAIN)
+ builder.setTitle(errorTitle).setMessage(errorString).setCancelable(false)
+
+ if (shouldShowTryAgain) {
+ builder
+ .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_try_again) {
+ dialog,
+ which ->
+ dialog.dismiss()
+ onTryAgain.onClick(dialog, which)
+ }
+ .setNegativeButton(R.string.security_settings_fingerprint_enroll_dialog_ok) { dialog, which
+ ->
+ dialog.dismiss()
+ onContinue.onClick(dialog, which)
+ }
+ } else {
+ builder.setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok) {
+ dialog,
+ which ->
+ dialog.dismiss()
+ onContinue.onClick(dialog, which)
+ }
+ }
+
+ val dialog = builder.create()
+ dialog.setCanceledOnTouchOutside(false)
+ return dialog
+ }
+
+ override fun getMetricsCategory(): Int {
+ return SettingsEnums.DIALOG_FINGERPINT_ERROR
+ }
+
+ companion object {
+ private const val KEY_MESSAGE = "fingerprint_message"
+ private const val KEY_TITLE = "fingerprint_title"
+ private const val KEY_SHOULD_TRY_AGAIN = "should_try_again"
+
+ suspend fun showInstance(
+ error: FingerEnrollState.EnrollError,
+ fragment: Fragment,
+ ) = suspendCancellableCoroutine { continuation ->
+ val dialog = FingerprintErrorDialog()
+ dialog.onTryAgain = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
+
+ dialog.onContinue = DialogInterface.OnClickListener { _, _ -> continuation.resume(false) }
+
+ dialog.onCancelListener =
+ DialogInterface.OnCancelListener {
+ Log.d(TAG, "onCancelListener clicked $dialog")
+ continuation.resume(null)
+ }
+
+ continuation.invokeOnCancellation { Log.d(TAG, "invokeOnCancellation $dialog") }
+
+ val bundle = Bundle()
+ bundle.putInt(
+ KEY_TITLE,
+ error.errTitle,
+ )
+ bundle.putInt(
+ KEY_MESSAGE,
+ error.errString,
+ )
+ bundle.putBoolean(
+ KEY_SHOULD_TRY_AGAIN,
+ error.shouldRetryEnrollment,
+ )
+ dialog.arguments = bundle
+ Log.d(TAG, "showing dialog $dialog")
+ dialog.show(fragment.parentFragmentManager, FingerprintErrorDialog::class.java.toString())
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/IconTouchDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/IconTouchDialog.kt
new file mode 100644
index 0000000..c086343
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/IconTouchDialog.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.app.settings.SettingsEnums
+import android.content.DialogInterface
+import android.os.Bundle
+import android.util.Log
+import androidx.fragment.app.Fragment
+import com.android.settings.R
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment
+import kotlin.coroutines.resume
+import kotlinx.coroutines.suspendCancellableCoroutine
+
+private const val TAG = "IconTouchDialog"
+
+/** Dialog shown when the user taps the Progress bar a certain amount of times. */
+class IconTouchDialog : InstrumentedDialogFragment() {
+ lateinit var onDismissListener: DialogInterface.OnClickListener
+ lateinit var onCancelListener: DialogInterface.OnCancelListener
+
+ override fun onCancel(dialog: DialogInterface) {
+ Log.d(TAG, "onCancel $dialog")
+ onCancelListener.onCancel(dialog)
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val builder: AlertDialog.Builder = AlertDialog.Builder(activity, R.style.Theme_AlertDialog)
+ builder
+ .setTitle(R.string.security_settings_fingerprint_enroll_touch_dialog_title)
+ .setMessage(R.string.security_settings_fingerprint_enroll_touch_dialog_message)
+ .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok) { dialog, which ->
+ dialog.dismiss()
+ onDismissListener.onClick(dialog, which)
+ }
+ .setOnCancelListener { onCancelListener.onCancel(it) }
+ return builder.create()
+ }
+
+ override fun getMetricsCategory(): Int {
+ return SettingsEnums.DIALOG_FINGERPRINT_ICON_TOUCH
+ }
+
+ companion object {
+ suspend fun showInstance(fragment: Fragment) = suspendCancellableCoroutine { continuation ->
+ val dialog = IconTouchDialog()
+ dialog.onDismissListener =
+ DialogInterface.OnClickListener { _, _ -> continuation.resume("Done") }
+ dialog.onCancelListener =
+ DialogInterface.OnCancelListener { _ -> continuation.resume("OnCancel") }
+
+ continuation.invokeOnCancellation { Log.d(TAG, "invokeOnCancellation $dialog") }
+
+ dialog.show(fragment.parentFragmentManager, IconTouchDialog::class.java.toString())
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
new file mode 100644
index 0000000..fe62681
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget
+
+import android.animation.ObjectAnimator
+import android.content.Context
+import android.graphics.PorterDuff
+import android.graphics.drawable.Animatable2
+import android.graphics.drawable.AnimatedVectorDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.LayerDrawable
+import android.util.AttributeSet
+import android.view.animation.AnimationUtils
+import android.view.animation.Interpolator
+import com.android.settings.R
+import com.android.settings.widget.RingProgressBar
+
+/** Progress bar for rear fingerprint enrollment. */
+class RFPSProgressBar(context: Context, attributeSet: AttributeSet) :
+ RingProgressBar(context, attributeSet) {
+
+ private val fastOutSlowInInterpolator: Interpolator
+
+ private val iconAnimationDrawable: AnimatedVectorDrawable
+ private val iconBackgroundBlinksDrawable: AnimatedVectorDrawable
+
+ private val maxProgress: Int
+
+ private var progressAnimation: ObjectAnimator? = null
+
+ private var shouldAnimateInternal: Boolean = true
+
+ init {
+ val fingerprintDrawable = background as LayerDrawable
+ iconAnimationDrawable =
+ fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_animation)
+ as AnimatedVectorDrawable
+ iconBackgroundBlinksDrawable =
+ fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_background)
+ as AnimatedVectorDrawable
+
+ fastOutSlowInInterpolator =
+ AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in)
+
+ iconAnimationDrawable.registerAnimationCallback(
+ object : Animatable2.AnimationCallback() {
+ override fun onAnimationEnd(drawable: Drawable?) {
+ super.onAnimationEnd(drawable)
+ if (shouldAnimateInternal) {
+ animateIconAnimationInternal()
+ }
+ }
+ }
+ )
+ animateIconAnimationInternal()
+
+ progressBackgroundTintMode = PorterDuff.Mode.SRC
+
+ val attributes =
+ context.obtainStyledAttributes(R.style.RingProgressBarStyle, intArrayOf(android.R.attr.max))
+
+ maxProgress = attributes.getInt(0, -1)
+
+ attributes.recycle()
+ }
+
+ /** Indicates if the progress animation should be running */
+ fun updateIconAnimation(shouldAnimate: Boolean) {
+ if (shouldAnimate && !shouldAnimateInternal) {
+ animateIconAnimationInternal()
+ }
+
+ shouldAnimateInternal = shouldAnimate
+ }
+
+ /** This function should only be called when actual progress has been made. */
+ fun updateProgress(percentComplete: Float) {
+ val progress = maxProgress - (percentComplete.coerceIn(0.0f, 100.0f) * maxProgress).toInt()
+ iconBackgroundBlinksDrawable.start()
+
+ progressAnimation?.isRunning?.let { progressAnimation!!.cancel() }
+
+ progressAnimation = ObjectAnimator.ofInt(this, "progress", getProgress(), progress)
+
+ progressAnimation?.interpolator = fastOutSlowInInterpolator
+ progressAnimation?.setDuration(250)
+ progressAnimation?.start()
+ }
+
+ private fun animateIconAnimationInternal() {
+ iconAnimationDrawable.start()
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/BackgroundViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/BackgroundViewModel.kt
new file mode 100644
index 0000000..2b53a53
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/BackgroundViewModel.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+
+/** A class for determining if the application is in the background or not. */
+class BackgroundViewModel : ViewModel() {
+
+ private val _background = MutableStateFlow(false)
+ /** When true, the application is in background, else false */
+ val background = _background.asStateFlow()
+
+ /** Indicates that the application has been put in the background. */
+ fun wentToBackground() {
+ _background.update { true }
+ }
+
+ /** Indicates that the application has been brought to the foreground. */
+ fun inForeground() {
+ _background.update { false }
+ }
+
+ class BackgroundViewModelFactory : ViewModelProvider.Factory {
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return BackgroundViewModel() as T
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
new file mode 100644
index 0000000..7ab315e
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.transformLatest
+import kotlinx.coroutines.flow.update
+
+/**
+ * This class is a wrapper around the [FingerprintEnrollViewModel] and decides when
+ * the user should or should not be enrolling.
+ */
+class FingerprintEnrollEnrollingViewModel(
+ private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
+ backgroundViewModel: BackgroundViewModel,
+) : ViewModel() {
+
+ private val _didTryEnrollment = MutableStateFlow(false)
+ private val _userDidEnroll = MutableStateFlow(false)
+ /** Indicates if the enrollment flow should be running. */
+ val enrollFlowShouldBeRunning: Flow<Boolean> =
+ _userDidEnroll.combine(backgroundViewModel.background) { shouldEnroll, isInBackground ->
+ if (isInBackground) {
+ false
+ } else {
+ shouldEnroll
+ }
+ }
+
+ /**
+ * Used to indicate the consumer of the view model is ready for an enrollment. Note that this does
+ * not necessarily try an enrollment.
+ */
+ fun canEnroll() {
+ // Update _consumerShouldEnroll after updating the other values.
+ if (!_didTryEnrollment.value) {
+ _didTryEnrollment.update { true }
+ _userDidEnroll.update { true }
+ }
+ }
+
+ /** Used to indicate to stop the enrollment. */
+ fun stopEnroll() {
+ _userDidEnroll.update { false }
+ }
+
+ /** Collects the enrollment flow based on [enrollFlowShouldBeRunning] */
+ val enrollFLow =
+ enrollFlowShouldBeRunning.transformLatest {
+ if (it) {
+ fingerprintEnrollViewModel.enrollFlow.collect { event -> emit(event) }
+ }
+ }
+
+ class FingerprintEnrollEnrollingViewModelFactory(
+ private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
+ private val backgroundViewModel: BackgroundViewModel
+ ) : ViewModelProvider.Factory {
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(
+ modelClass: Class<T>,
+ ): T {
+ return FingerprintEnrollEnrollingViewModel(fingerprintEnrollViewModel, backgroundViewModel)
+ as T
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
index 90aefc8..7722a46 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
@@ -16,12 +16,11 @@
package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
-import android.hardware.fingerprint.FingerprintManager
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -40,6 +39,7 @@
private val navigationViewModel: FingerprintEnrollNavigationViewModel,
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
+ backgroundViewModel: BackgroundViewModel,
accessibilityViewModel: AccessibilityViewModel,
foldStateViewModel: FoldStateViewModel,
orientationStateViewModel: OrientationStateViewModel
@@ -88,6 +88,14 @@
/** Represents the stream of showing error dialog. */
val showErrorDialog = _showErrorDialog.filterNotNull()
+ private var _didTryEducation = false
+ private var _education: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ /** Indicates if the education flow should be running. */
+ private val educationFlowShouldBeRunning: Flow<Boolean> =
+ _education.combine(backgroundViewModel.background) { shouldRunEducation, isInBackground ->
+ !isInBackground && shouldRunEducation
+ }
+
init {
// Start or end enroll flow
viewModelScope.launch {
@@ -107,40 +115,58 @@
}
.collect { token ->
if (token != null) {
- fingerprintEnrollViewModel.startEnroll(token, EnrollReason.FindSensor)
+ canStartEducation()
} else {
- fingerprintEnrollViewModel.stopEnroll()
+ stopEducation()
}
}
}
// Enroll progress flow
viewModelScope.launch {
- combine(
- navigationViewModel.enrollType,
- fingerprintEnrollViewModel.enrollFlow.filterNotNull()
- ) { enrollType, enrollFlow ->
- Pair(enrollType, enrollFlow)
- }
- .collect { (enrollType, enrollFlow) ->
- when (enrollFlow) {
- // TODO: Cancel the enroll() when EnrollProgress is received instead of proceeding to
- // Enrolling page. Otherwise Enrolling page will receive the EnrollError.
- is FingerEnrollStateViewModel.EnrollProgress -> proceedToEnrolling()
- is FingerEnrollStateViewModel.EnrollError -> {
- val errMsgId = enrollFlow.errMsgId
- if (errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
- proceedToEnrolling()
- } else {
- _showErrorDialog.update { Pair(errMsgId, enrollType == SetupWizard) }
+ educationFlowShouldBeRunning.collect {
+ // Only collect the flow when we should be running.
+ if (it) {
+ combine(
+ navigationViewModel.fingerprintFlow,
+ fingerprintEnrollViewModel.educationEnrollFlow.filterNotNull(),
+ ) { enrollType, educationFlow ->
+ Pair(enrollType, educationFlow)
+ }
+ .collect { (enrollType, educationFlow) ->
+ when (educationFlow) {
+ // TODO: Cancel the enroll() when EnrollProgress is received instead of proceeding
+ // to
+ // Enrolling page. Otherwise Enrolling page will receive the EnrollError.
+ is FingerEnrollState.EnrollProgress -> proceedToEnrolling()
+ is FingerEnrollState.EnrollError -> {
+ if (educationFlow.isCancelled) {
+ proceedToEnrolling()
+ } else {
+ _showErrorDialog.update { Pair(educationFlow.errString, enrollType == SetupWizard) }
+ }
+ }
+ is FingerEnrollState.EnrollHelp -> {}
}
}
- is FingerEnrollStateViewModel.EnrollHelp -> {}
- }
}
+ }
}
}
+ /** Indicates if education can begin */
+ private fun canStartEducation() {
+ if (!_didTryEducation) {
+ _didTryEducation = true
+ _education.update { true }
+ }
+ }
+
+ /** Indicates that education has finished */
+ private fun stopEducation() {
+ _education.update { false }
+ }
+
/** Proceed to EnrollEnrolling page. */
fun proceedToEnrolling() {
navigationViewModel.nextStep()
@@ -150,6 +176,7 @@
private val navigationViewModel: FingerprintEnrollNavigationViewModel,
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
+ private val backgroundViewModel: BackgroundViewModel,
private val accessibilityViewModel: AccessibilityViewModel,
private val foldStateViewModel: FoldStateViewModel,
private val orientationStateViewModel: OrientationStateViewModel
@@ -160,6 +187,7 @@
navigationViewModel,
fingerprintEnrollViewModel,
gatekeeperViewModel,
+ backgroundViewModel,
accessibilityViewModel,
foldStateViewModel,
orientationStateViewModel
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
index 392d205..c7a1071 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -17,32 +17,41 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
-import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.transformLatest
-import kotlinx.coroutines.flow.update
-
-private const val TAG = "FingerprintEnrollViewModel"
/** Represents all of the fingerprint information needed for a fingerprint enrollment process. */
class FingerprintEnrollViewModel(
private val fingerprintManagerInteractor: FingerprintManagerInteractor,
- backgroundDispatcher: CoroutineDispatcher,
+ gatekeeperViewModel: FingerprintGatekeeperViewModel,
+ navigationViewModel: FingerprintEnrollNavigationViewModel,
) : ViewModel() {
- private var _enrollReason: MutableStateFlow<EnrollReason> =
- MutableStateFlow(EnrollReason.FindSensor)
- private var _hardwareAuthToken: MutableStateFlow<ByteArray?> = MutableStateFlow(null)
- private var _consumerShouldEnroll: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ /**
+ * Cached value of [FingerprintSensorType]
+ *
+ * This is typically used by fragments that change their layout/behavior based on this
+ * information. This value should be set before any fragment is created.
+ */
+ var sensorTypeCached: FingerprintSensorType? = null
+ private var _enrollReason: Flow<EnrollReason?> =
+ navigationViewModel.navigationViewModel.map {
+ when (it.currStep) {
+ is Enrollment -> EnrollReason.EnrollEnrolling
+ is Education -> EnrollReason.FindSensor
+ else -> null
+ }
+ }
/** Represents the stream of [FingerprintSensorType] */
val sensorType: Flow<FingerprintSensorType> =
@@ -51,47 +60,68 @@
/**
* A flow that contains a [FingerprintEnrollViewModel] which contains the relevant information for
* an enrollment process
+ *
+ * This flow should be the only flow which calls enroll().
*/
- val enrollFlow: Flow<FingerEnrollStateViewModel> =
- combine(_consumerShouldEnroll, _hardwareAuthToken, _enrollReason) {
- consumerShouldEnroll,
- hardwareAuthToken,
- enrollReason ->
- Triple(consumerShouldEnroll, hardwareAuthToken, enrollReason)
+ val _enrollFlow: Flow<FingerEnrollState> =
+ combine(gatekeeperViewModel.gatekeeperInfo, _enrollReason) { hardwareAuthToken, enrollReason,
+ ->
+ Pair(hardwareAuthToken, enrollReason)
}
.transformLatest {
- // transformLatest() instead of transform() is used here for cancelling previous enroll()
- // whenever |consumerShouldEnroll| is changed. Otherwise the latest value will be suspended
- // since enroll() is an infinite callback flow.
- (consumerShouldEnroll, hardwareAuthToken, enrollReason) ->
- if (consumerShouldEnroll && hardwareAuthToken != null) {
- fingerprintManagerInteractor.enroll(hardwareAuthToken, enrollReason).collect { emit(it) }
+ /** [transformLatest] is used as we want to make sure to cancel previous API call. */
+ (hardwareAuthToken, enrollReason) ->
+ if (hardwareAuthToken is GatekeeperInfo.GatekeeperPasswordInfo && enrollReason != null) {
+ fingerprintManagerInteractor.enroll(hardwareAuthToken.token, enrollReason).collect {
+ emit(it)
+ }
}
}
- .flowOn(backgroundDispatcher)
+ .shareIn(viewModelScope, SharingStarted.WhileSubscribed(), 0)
- /** Used to indicate the consumer of the view model is ready for an enrollment. */
- fun startEnroll(hardwareAuthToken: ByteArray?, enrollReason: EnrollReason) {
- _enrollReason.update { enrollReason }
- _hardwareAuthToken.update { hardwareAuthToken }
- // Update _consumerShouldEnroll after updating the other values.
- _consumerShouldEnroll.update { true }
- }
+ /**
+ * This flow will kick off education when
+ * 1) There is an active subscriber to this flow
+ * 2) shouldEnroll is true and we are on the FindSensor step
+ */
+ val educationEnrollFlow: Flow<FingerEnrollState?> =
+ _enrollReason.filterNotNull().transformLatest { enrollReason ->
+ if (enrollReason == EnrollReason.FindSensor) {
+ _enrollFlow.collect { event -> emit(event) }
+ } else {
+ emit(null)
+ }
+ }
- /** Used to indicate to stop the enrollment. */
- fun stopEnroll() {
- _consumerShouldEnroll.update { false }
- }
+ /**
+ * This flow will kick off enrollment when
+ * 1) There is an active subscriber to this flow
+ * 2) shouldEnroll is true and we are on the EnrollEnrolling step
+ */
+ val enrollFlow: Flow<FingerEnrollState?> =
+ _enrollReason.filterNotNull().transformLatest { enrollReason ->
+ if (enrollReason == EnrollReason.EnrollEnrolling) {
+ _enrollFlow.collect { event -> emit(event) }
+ } else {
+ emit(null)
+ }
+ }
class FingerprintEnrollViewModelFactory(
val interactor: FingerprintManagerInteractor,
- val backgroundDispatcher: CoroutineDispatcher
+ val gatekeeperViewModel: FingerprintGatekeeperViewModel,
+ val navigationViewModel: FingerprintEnrollNavigationViewModel,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(
modelClass: Class<T>,
): T {
- return FingerprintEnrollViewModel(interactor, backgroundDispatcher) as T
+ return FingerprintEnrollViewModel(
+ interactor,
+ gatekeeperViewModel,
+ navigationViewModel,
+ )
+ as T
}
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
index 97c8271..2e5dce0 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
@@ -21,31 +21,20 @@
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintFlow
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
private const val TAG = "FingerprintEnrollNavigationViewModel"
/**
- * The [EnrollType] for fingerprint enrollment indicates information on how the flow should behave.
- */
-sealed class EnrollType
-
-/** The default enrollment experience, typically called from Settings */
-object Default : EnrollType()
-
-/** SetupWizard/Out of box experience (OOBE) enrollment type. */
-object SetupWizard : EnrollType()
-
-/** Unicorn enrollment type */
-object Unicorn : EnrollType()
-
-/**
* This class is responsible for sending a [NavigationStep] which indicates where the user is in the
* Fingerprint Enrollment flow
*/
@@ -53,31 +42,26 @@
private val dispatcher: CoroutineDispatcher,
private val fingerprintManagerInteractor: FingerprintManagerInteractor,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
- private val canSkipConfirm: Boolean
+ private val firstStep: NextStepViewModel,
+ private val navState: NavState,
+ private val theFingerprintFlow: FingerprintFlow,
) : ViewModel() {
private class InternalNavigationStep(
lastStep: NextStepViewModel,
nextStep: NextStepViewModel,
forward: Boolean,
- var canNavigate: Boolean
+ var canNavigate: Boolean,
) : NavigationStep(lastStep, nextStep, forward)
- private var _enrollType = MutableStateFlow<EnrollType?>(Default)
+ private var _fingerprintFlow = MutableStateFlow<FingerprintFlow?>(theFingerprintFlow)
- /** A flow that indicates the [EnrollType] */
- val enrollType: Flow<EnrollType?> = _enrollType.asStateFlow()
-
- private var navState = NavState(canSkipConfirm)
+ /** A flow that indicates the [FingerprintFlow] */
+ val fingerprintFlow: Flow<FingerprintFlow?> = _fingerprintFlow.asStateFlow()
private val _navigationStep =
MutableStateFlow(
- InternalNavigationStep(
- PlaceHolderState,
- Start.next(navState),
- forward = false,
- canNavigate = true
- )
+ InternalNavigationStep(PlaceHolderState, firstStep, forward = false, canNavigate = true)
)
init {
@@ -96,6 +80,10 @@
*/
val navigationViewModel: Flow<NavigationStep> = _navigationStep.asStateFlow()
+ /** This action indicates that the UI should actually update the navigation to the given step. */
+ val navigationAction: Flow<NavigationStep?> =
+ _navigationStep.shareIn(viewModelScope, SharingStarted.Lazily, 0)
+
/** Used to start the next step of Fingerprint Enrollment. */
fun nextStep() {
viewModelScope.launch {
@@ -130,6 +118,7 @@
private val fingerprintManagerInteractor: FingerprintManagerInteractor,
private val fingerprintGatekeeperViewModel: FingerprintGatekeeperViewModel,
private val canSkipConfirm: Boolean,
+ private val fingerprintFlow: FingerprintFlow,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
@@ -137,11 +126,14 @@
modelClass: Class<T>,
): T {
+ val navState = NavState(canSkipConfirm)
return FingerprintEnrollNavigationViewModel(
backgroundDispatcher,
fingerprintManagerInteractor,
fingerprintGatekeeperViewModel,
- canSkipConfirm,
+ Start.next(navState),
+ navState,
+ fingerprintFlow,
)
as T
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
index e99b8f9..b68f6d6 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
@@ -57,7 +57,7 @@
* This state is the initial state for the current step, and will be used to determine if the user
* needs to [LaunchConfirmDeviceCredential] if not, it will go to [Intro]
*/
-object Start : NextStepViewModel() {
+data object Start : NextStepViewModel() {
override fun next(state: NavState): NextStepViewModel =
if (state.confirmedDevice) Intro else LaunchConfirmDeviceCredential
@@ -71,19 +71,19 @@
}
/** State for the FingerprintEnrollment introduction */
-object Intro : NextStepViewModel() {
+data object Intro : NextStepViewModel() {
override fun next(state: NavState): NextStepViewModel = Education
override fun prev(state: NavState): NextStepViewModel = Finish(null)
}
/** State for the FingerprintEnrollment education */
-object Education : NextStepViewModel() {
+data object Education : NextStepViewModel() {
override fun next(state: NavState): NextStepViewModel = Enrollment
override fun prev(state: NavState): NextStepViewModel = Intro
}
/** State for the FingerprintEnrollment enrollment */
-object Enrollment : NextStepViewModel() {
+data object Enrollment : NextStepViewModel() {
override fun next(state: NavState): NextStepViewModel = Confirmation
override fun prev(state: NavState): NextStepViewModel = Education
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
index e66b4cd..debdfb8 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
@@ -19,8 +19,8 @@
import android.hardware.fingerprint.FingerprintManager
import android.util.Log
import androidx.lifecycle.LifecycleCoroutineScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder.FingerprintView
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollAdditionalFingerprint
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
@@ -66,21 +66,21 @@
/** Indicates what result should be set for the returning callee */
fun setResultExternal(resultCode: Int)
/** Indicates the settings UI should be shown */
- fun showSettings(enrolledFingerprints: List<FingerprintViewModel>)
+ fun showSettings(enrolledFingerprints: List<FingerprintData>)
/** Updates the add fingerprints preference */
fun updateAddFingerprintsPreference(canEnroll: Boolean, maxFingerprints: Int)
/** Updates the sfps fingerprints preference */
fun updateSfpsPreference(isSfpsPrefVisible: Boolean)
/** Indicates that a user has been locked out */
- fun userLockout(authAttemptViewModel: FingerprintAuthAttemptViewModel.Error)
+ fun userLockout(authAttemptViewModel: FingerprintAuthAttemptModel.Error)
/** Indicates a fingerprint preference should be highlighted */
suspend fun highlightPref(fingerId: Int)
/** Indicates a user should be prompted to delete a fingerprint */
- suspend fun askUserToDeleteDialog(fingerprintViewModel: FingerprintViewModel): Boolean
+ suspend fun askUserToDeleteDialog(fingerprintViewModel: FingerprintData): Boolean
/** Indicates a user should be asked to renae ma dialog */
suspend fun askUserToRenameDialog(
- fingerprintViewModel: FingerprintViewModel
- ): Pair<FingerprintViewModel, String>?
+ fingerprintViewModel: FingerprintData
+ ): Pair<FingerprintData, String>?
}
fun bind(
@@ -131,10 +131,10 @@
lifecycleScope.launch {
viewModel.authFlow.filterNotNull().collect {
when (it) {
- is FingerprintAuthAttemptViewModel.Success -> {
+ is FingerprintAuthAttemptModel.Success -> {
view.highlightPref(it.fingerId)
}
- is FingerprintAuthAttemptViewModel.Error -> {
+ is FingerprintAuthAttemptModel.Error -> {
if (it.error == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
view.userLockout(it)
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
index 32b50c5..71a22eb 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
@@ -26,7 +26,7 @@
import android.os.UserManager
import androidx.appcompat.app.AlertDialog
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -34,7 +34,7 @@
private const val KEY_IS_LAST_FINGERPRINT = "IS_LAST_FINGERPRINT"
class FingerprintDeletionDialog : InstrumentedDialogFragment() {
- private lateinit var fingerprintViewModel: FingerprintViewModel
+ private lateinit var fingerprintViewModel: FingerprintData
private var isLastFingerprint: Boolean = false
private lateinit var alertDialog: AlertDialog
lateinit var onClickListener: DialogInterface.OnClickListener
@@ -51,7 +51,7 @@
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val fp = requireArguments().get(KEY_FINGERPRINT) as android.hardware.fingerprint.Fingerprint
- fingerprintViewModel = FingerprintViewModel(fp.name.toString(), fp.biometricId, fp.deviceId)
+ fingerprintViewModel = FingerprintData(fp.name.toString(), fp.biometricId, fp.deviceId)
isLastFingerprint = requireArguments().getBoolean(KEY_IS_LAST_FINGERPRINT)
val title = getString(R.string.fingerprint_delete_title, fingerprintViewModel.name)
var message = getString(R.string.fingerprint_v2_delete_message, fingerprintViewModel.name)
@@ -95,9 +95,9 @@
companion object {
private const val KEY_FINGERPRINT = "fingerprint"
suspend fun showInstance(
- fp: FingerprintViewModel,
- lastFingerprint: Boolean,
- target: FingerprintSettingsV2Fragment,
+ fp: FingerprintData,
+ lastFingerprint: Boolean,
+ target: FingerprintSettingsV2Fragment,
) = suspendCancellableCoroutine { continuation ->
val dialog = FingerprintDeletionDialog()
dialog.onClickListener = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
index b1e5097..ea26946 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
@@ -22,7 +22,7 @@
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceViewHolder
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settingslib.widget.TwoTargetPreference
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -30,10 +30,10 @@
private const val TAG = "FingerprintSettingsPreference"
class FingerprintSettingsPreference(
- context: Context,
- val fingerprintViewModel: FingerprintViewModel,
- val fragment: FingerprintSettingsV2Fragment,
- val isLastFingerprint: Boolean
+ context: Context,
+ val fingerprintViewModel: FingerprintData,
+ val fragment: FingerprintSettingsV2Fragment,
+ val isLastFingerprint: Boolean
) : TwoTargetPreference(context) {
private lateinit var myView: View
@@ -79,7 +79,7 @@
return FingerprintDeletionDialog.showInstance(fingerprintViewModel, isLastFingerprint, fragment)
}
- suspend fun askUserToRenameDialog(): Pair<FingerprintViewModel, String>? {
+ suspend fun askUserToRenameDialog(): Pair<FingerprintData, String>? {
return FingerprintSettingsRenameDialog.showInstance(fingerprintViewModel, fragment)
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
index 9bde0b0..ff469f1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
@@ -27,7 +27,7 @@
import android.widget.ImeAwareEditText
import androidx.appcompat.app.AlertDialog
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -46,7 +46,7 @@
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
Log.d(TAG, "onCreateDialog $this")
val fp = requireArguments().get(KEY_FINGERPRINT) as android.hardware.fingerprint.Fingerprint
- val fingerprintViewModel = FingerprintViewModel(fp.name.toString(), fp.biometricId, fp.deviceId)
+ val fingerprintViewModel = FingerprintData(fp.name.toString(), fp.biometricId, fp.deviceId)
val context = requireContext()
val alertDialog =
@@ -101,7 +101,7 @@
companion object {
private const val KEY_FINGERPRINT = "fingerprint"
- suspend fun showInstance(fp: FingerprintViewModel, target: FingerprintSettingsV2Fragment) =
+ suspend fun showInstance(fp: FingerprintData, target: FingerprintSettingsV2Fragment) =
suspendCancellableCoroutine { continuation ->
val dialog = FingerprintSettingsRenameDialog()
val onClick =
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index c818566..c22a5a7 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -46,8 +46,10 @@
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.repository.PressToAuthProviderImpl
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.shared.model.Settings
import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
@@ -142,7 +144,7 @@
}
}
- override fun userLockout(authAttemptViewModel: FingerprintAuthAttemptViewModel.Error) {
+ override fun userLockout(authAttemptViewModel: FingerprintAuthAttemptModel.Error) {
Toast.makeText(activity, authAttemptViewModel.message, Toast.LENGTH_SHORT).show()
}
@@ -186,40 +188,46 @@
val backgroundDispatcher = Dispatchers.IO
val activity = requireActivity()
val userHandle = activity.user.identifier
+ // Note that SUW should not be launching FingerprintSettings
+ val isAnySuw = Settings
+
+ val pressToAuthProvider = {
+ var toReturn: Int =
+ Secure.getIntForUser(
+ context.contentResolver,
+ Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ -1,
+ userHandle,
+ )
+ if (toReturn == -1) {
+ toReturn =
+ if (
+ context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
+ ) {
+ 1
+ } else {
+ 0
+ }
+ Secure.putIntForUser(
+ context.contentResolver,
+ Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ toReturn,
+ userHandle
+ )
+ }
+
+ toReturn == 1
+ }
val interactor =
FingerprintManagerInteractorImpl(
context.applicationContext,
backgroundDispatcher,
fingerprintManager,
- GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext))
- ) {
- var toReturn: Int =
- Secure.getIntForUser(
- context.contentResolver,
- Secure.SFPS_PERFORMANT_AUTH_ENABLED,
- -1,
- userHandle,
- )
- if (toReturn == -1) {
- toReturn =
- if (
- context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
- ) {
- 1
- } else {
- 0
- }
- Secure.putIntForUser(
- context.contentResolver,
- Secure.SFPS_PERFORMANT_AUTH_ENABLED,
- toReturn,
- userHandle
- )
- }
-
- toReturn == 1
- }
+ GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext)),
+ PressToAuthProviderImpl(context),
+ isAnySuw
+ )
val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
val challenge = intent.getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, -1L)
@@ -292,18 +300,18 @@
}
/** Used to indicate that preference has been clicked */
- fun onPrefClicked(fingerprintViewModel: FingerprintViewModel) {
+ fun onPrefClicked(fingerprintViewModel: FingerprintData) {
Log.d(TAG, "onPrefClicked(${fingerprintViewModel})")
settingsViewModel.onPrefClicked(fingerprintViewModel)
}
/** Used to indicate that a delete pref has been clicked */
- fun onDeletePrefClicked(fingerprintViewModel: FingerprintViewModel) {
+ fun onDeletePrefClicked(fingerprintViewModel: FingerprintData) {
Log.d(TAG, "onDeletePrefClicked(${fingerprintViewModel})")
settingsViewModel.onDeleteClicked(fingerprintViewModel)
}
- override fun showSettings(enrolledFingerprints: List<FingerprintViewModel>) {
+ override fun showSettings(enrolledFingerprints: List<FingerprintData>) {
val category =
this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINTS_ENROLLED_CATEGORY)
as PreferenceCategory?
@@ -422,7 +430,7 @@
}
}
- override suspend fun askUserToDeleteDialog(fingerprintViewModel: FingerprintViewModel): Boolean {
+ override suspend fun askUserToDeleteDialog(fingerprintViewModel: FingerprintData): Boolean {
Log.d(TAG, "showing delete dialog for (${fingerprintViewModel})")
try {
@@ -446,8 +454,8 @@
}
override suspend fun askUserToRenameDialog(
- fingerprintViewModel: FingerprintViewModel
- ): Pair<FingerprintViewModel, String>? {
+ fingerprintViewModel: FingerprintData
+ ): Pair<FingerprintData, String>? {
Log.d(TAG, "showing rename dialog for (${fingerprintViewModel})")
try {
val toReturn =
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
index fa1e5e1..164f79f 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
@@ -22,8 +22,8 @@
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
@@ -53,11 +53,11 @@
private val backgroundDispatcher: CoroutineDispatcher,
private val navigationViewModel: FingerprintSettingsNavigationViewModel,
) : ViewModel() {
- private val _enrolledFingerprints: MutableStateFlow<List<FingerprintViewModel>?> =
+ private val _enrolledFingerprints: MutableStateFlow<List<FingerprintData>?> =
MutableStateFlow(null)
/** Represents the stream of enrolled fingerprints. */
- val enrolledFingerprints: Flow<List<FingerprintViewModel>> =
+ val enrolledFingerprints: Flow<List<FingerprintData>> =
_enrolledFingerprints.asStateFlow().filterNotNull().filterOnlyWhenSettingsIsShown()
/** Represents the stream of the information of "Add Fingerprint" preference. */
@@ -95,10 +95,10 @@
private val _sensorNullOrEmpty: Flow<Boolean> =
fingerprintManagerInteractor.sensorPropertiesInternal.map { it == null }
- private val _isLockedOut: MutableStateFlow<FingerprintAuthAttemptViewModel.Error?> =
+ private val _isLockedOut: MutableStateFlow<FingerprintAuthAttemptModel.Error?> =
MutableStateFlow(null)
- private val _authSucceeded: MutableSharedFlow<FingerprintAuthAttemptViewModel.Success?> =
+ private val _authSucceeded: MutableSharedFlow<FingerprintAuthAttemptModel.Success?> =
MutableSharedFlow()
private val _attemptsSoFar: MutableStateFlow<Int> = MutableStateFlow(0)
@@ -164,7 +164,7 @@
.distinctUntilChanged()
/** Represents a consistent stream of authentication attempts. */
- val authFlow: Flow<FingerprintAuthAttemptViewModel> =
+ val authFlow: Flow<FingerprintAuthAttemptModel> =
canAuthenticate
.transformLatest {
try {
@@ -173,11 +173,11 @@
Log.d(TAG, "canAuthenticate authing")
attemptingAuth()
when (val authAttempt = fingerprintManagerInteractor.authenticate()) {
- is FingerprintAuthAttemptViewModel.Success -> {
+ is FingerprintAuthAttemptModel.Success -> {
onAuthSuccess(authAttempt)
emit(authAttempt)
}
- is FingerprintAuthAttemptViewModel.Error -> {
+ is FingerprintAuthAttemptModel.Error -> {
if (authAttempt.error == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
lockout(authAttempt)
emit(authAttempt)
@@ -219,7 +219,7 @@
}
/** The fingerprint delete button has been clicked. */
- fun onDeleteClicked(fingerprintViewModel: FingerprintViewModel) {
+ fun onDeleteClicked(fingerprintViewModel: FingerprintData) {
viewModelScope.launch {
if (_isShowingDialog.value == null || navigationViewModel.nextStep.value != ShowSettings) {
_isShowingDialog.tryEmit(PreferenceViewModel.DeleteDialog(fingerprintViewModel))
@@ -230,7 +230,7 @@
}
/** The rename fingerprint dialog has been clicked. */
- fun onPrefClicked(fingerprintViewModel: FingerprintViewModel) {
+ fun onPrefClicked(fingerprintViewModel: FingerprintData) {
viewModelScope.launch {
if (_isShowingDialog.value == null || navigationViewModel.nextStep.value != ShowSettings) {
_isShowingDialog.tryEmit(PreferenceViewModel.RenameDialog(fingerprintViewModel))
@@ -241,7 +241,7 @@
}
/** A request to delete a fingerprint */
- fun deleteFingerprint(fp: FingerprintViewModel) {
+ fun deleteFingerprint(fp: FingerprintData) {
viewModelScope.launch(backgroundDispatcher) {
if (fingerprintManagerInteractor.removeFingerprint(fp)) {
updateEnrolledFingerprints()
@@ -250,7 +250,7 @@
}
/** A request to rename a fingerprint */
- fun renameFingerprint(fp: FingerprintViewModel, newName: String) {
+ fun renameFingerprint(fp: FingerprintData, newName: String) {
viewModelScope.launch {
fingerprintManagerInteractor.renameFingerprint(fp, newName)
updateEnrolledFingerprints()
@@ -261,12 +261,12 @@
_attemptsSoFar.update { it + 1 }
}
- private suspend fun onAuthSuccess(success: FingerprintAuthAttemptViewModel.Success) {
+ private suspend fun onAuthSuccess(success: FingerprintAuthAttemptModel.Success) {
_authSucceeded.emit(success)
_attemptsSoFar.update { 0 }
}
- private fun lockout(attemptViewModel: FingerprintAuthAttemptViewModel.Error) {
+ private fun lockout(attemptViewModel: FingerprintAuthAttemptModel.Error) {
_isLockedOut.update { attemptViewModel }
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
index 4c33f7f..181da4e 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
@@ -16,15 +16,15 @@
package com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
/** Classed use to represent a Dialogs state. */
sealed class PreferenceViewModel {
data class RenameDialog(
- val fingerprintViewModel: FingerprintViewModel,
+ val fingerprintViewModel: FingerprintData,
) : PreferenceViewModel()
data class DeleteDialog(
- val fingerprintViewModel: FingerprintViewModel,
+ val fingerprintViewModel: FingerprintData,
) : PreferenceViewModel()
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java
index b9ef8f4..b3b7a2c 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDashboardFragment.java
@@ -75,6 +75,8 @@
mMainSwitchBar = activity.getSwitchBar();
mMainSwitchBar.setTitle(getText(R.string.audio_sharing_switch_title));
mSwitchBarController = new AudioSharingSwitchBarController(activity, mMainSwitchBar);
+ mSwitchBarController.init(this);
+ getSettingsLifecycle().addObserver(mSwitchBarController);
mMainSwitchBar.show();
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceAdapter.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceAdapter.java
new file mode 100644
index 0000000..bc8ff21
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceAdapter.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2023 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.connecteddevice.audiosharing;
+
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+
+import com.android.internal.widget.RecyclerView;
+import com.android.settings.R;
+
+import java.util.ArrayList;
+
+public class AudioSharingDeviceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final String TAG = "AudioSharingDeviceAdapter";
+ private final ArrayList<AudioSharingDeviceItem> mDevices;
+ private final OnClickListener mOnClickListener;
+
+ public AudioSharingDeviceAdapter(
+ ArrayList<AudioSharingDeviceItem> devices, OnClickListener listener) {
+ mDevices = devices;
+ mOnClickListener = listener;
+ }
+
+ private class AudioSharingDeviceViewHolder extends RecyclerView.ViewHolder {
+ private final Button mButtonView;
+
+ AudioSharingDeviceViewHolder(View view) {
+ super(view);
+ mButtonView = view.findViewById(R.id.device_button);
+ }
+
+ public void bindView(int position) {
+ if (mButtonView != null) {
+ mButtonView.setText(mDevices.get(position).getName());
+ mButtonView.setOnClickListener(
+ v -> mOnClickListener.onClick(mDevices.get(position)));
+ } else {
+ Log.w(TAG, "bind view skipped due to button view is null");
+ }
+ }
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view =
+ LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.audio_sharing_device_item, parent, false);
+ return new AudioSharingDeviceViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ ((AudioSharingDeviceViewHolder) holder).bindView(position);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mDevices.size();
+ }
+
+ public interface OnClickListener {
+ /** Called when an item has been clicked. */
+ void onClick(AudioSharingDeviceItem item);
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java
new file mode 100644
index 0000000..a68117a
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDeviceItem.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2023 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.connecteddevice.audiosharing;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public final class AudioSharingDeviceItem implements Parcelable {
+ private final String mName;
+ private final int mGroupId;
+
+ public AudioSharingDeviceItem(String name, int groupId) {
+ mName = name;
+ mGroupId = groupId;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public int getGroupId() {
+ return mGroupId;
+ }
+
+ public AudioSharingDeviceItem(Parcel in) {
+ mName = in.readString();
+ mGroupId = in.readInt();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mName);
+ dest.writeInt(mGroupId);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<AudioSharingDeviceItem> CREATOR =
+ new Creator<AudioSharingDeviceItem>() {
+ @Override
+ public AudioSharingDeviceItem createFromParcel(Parcel in) {
+ return new AudioSharingDeviceItem(in);
+ }
+
+ @Override
+ public AudioSharingDeviceItem[] newArray(int size) {
+ return new AudioSharingDeviceItem[size];
+ }
+ };
+}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java
new file mode 100644
index 0000000..bcf0c12
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogFragment.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2023 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.connecteddevice.audiosharing;
+
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.internal.widget.LinearLayoutManager;
+import com.android.internal.widget.RecyclerView;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.flags.Flags;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
+ private static final String TAG = "AudioSharingDialog";
+
+ private static final String BUNDLE_KEY_DEVICE_ITEMS = "bundle_key_device_names";
+
+ // The host creates an instance of this dialog fragment must implement this interface to receive
+ // event callbacks.
+ public interface DialogEventListener {
+ /**
+ * Called when users click the device item for sharing in the dialog.
+ *
+ * @param item The device item clicked.
+ */
+ void onItemClick(AudioSharingDeviceItem item);
+
+ /** Called when users click the cancel button in the dialog. */
+ void onCancelClick();
+ }
+
+ private static DialogEventListener sListener;
+
+ private View mRootView;
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.DIALOG_START_AUDIO_SHARING;
+ }
+
+ /**
+ * Display the {@link AudioSharingDialogFragment} dialog.
+ *
+ * @param host The Fragment this dialog will be hosted.
+ */
+ public static void show(
+ Fragment host,
+ ArrayList<AudioSharingDeviceItem> deviceItems,
+ DialogEventListener listener) {
+ if (!Flags.enableLeAudioSharing()) return;
+ final FragmentManager manager = host.getChildFragmentManager();
+ sListener = listener;
+ if (manager.findFragmentByTag(TAG) == null) {
+ final Bundle bundle = new Bundle();
+ bundle.putParcelableArrayList(BUNDLE_KEY_DEVICE_ITEMS, deviceItems);
+ AudioSharingDialogFragment dialog = new AudioSharingDialogFragment();
+ dialog.setArguments(bundle);
+ dialog.show(manager, TAG);
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Bundle arguments = requireArguments();
+ ArrayList<AudioSharingDeviceItem> deviceItems =
+ arguments.getParcelableArrayList(BUNDLE_KEY_DEVICE_ITEMS);
+ final AlertDialog.Builder builder =
+ new AlertDialog.Builder(getActivity()).setTitle("Share audio").setCancelable(false);
+ mRootView =
+ LayoutInflater.from(builder.getContext())
+ .inflate(R.layout.dialog_audio_sharing, /* parent= */ null);
+ TextView subTitle1 = mRootView.findViewById(R.id.share_audio_subtitle1);
+ TextView subTitle2 = mRootView.findViewById(R.id.share_audio_subtitle2);
+ if (deviceItems.isEmpty()) {
+ subTitle1.setVisibility(View.INVISIBLE);
+ subTitle2.setText(
+ "To start sharing audio, connect additional headphones that support LE audio");
+ builder.setNegativeButton(
+ "Close",
+ (dialog, which) -> {
+ sListener.onCancelClick();
+ });
+ } else {
+ subTitle1.setText(
+ String.format(
+ Locale.US,
+ "%d additional device%s connected",
+ deviceItems.size(),
+ deviceItems.size() > 1 ? "" : "s"));
+ subTitle2.setText(
+ "The headphones you share audio with will hear videos and music playing on this"
+ + " phone");
+ }
+ RecyclerView recyclerView = mRootView.findViewById(R.id.btn_list);
+ recyclerView.setAdapter(
+ new AudioSharingDeviceAdapter(
+ deviceItems,
+ (AudioSharingDeviceItem item) -> {
+ sListener.onItemClick(item);
+ dismiss();
+ }));
+ recyclerView.setLayoutManager(
+ new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
+ AlertDialog dialog = builder.setView(mRootView).create();
+ dialog.setCanceledOnTouchOutside(false);
+ return dialog;
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java
new file mode 100644
index 0000000..387ab7e
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreference.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2023 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.connecteddevice.audiosharing;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageButton;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settings.R;
+import com.android.settings.widget.ValidatedEditTextPreference;
+
+public class AudioSharingNamePreference extends ValidatedEditTextPreference {
+ private static final String TAG = "AudioSharingNamePreference";
+
+ public AudioSharingNamePreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ initialize();
+ }
+
+ public AudioSharingNamePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ initialize();
+ }
+
+ public AudioSharingNamePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initialize();
+ }
+
+ public AudioSharingNamePreference(Context context) {
+ super(context);
+ initialize();
+ }
+
+ private void initialize() {
+ setLayoutResource(
+ com.android.settingslib.widget.preference.twotarget.R.layout.preference_two_target);
+ setWidgetLayoutResource(R.layout.preference_widget_qrcode);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ final ImageButton shareButton = (ImageButton) holder.findViewById(R.id.button_icon);
+ shareButton.setImageDrawable(getContext().getDrawable(R.drawable.ic_qrcode_24dp));
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java
new file mode 100644
index 0000000..18c9bfd
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNamePreferenceController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 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.connecteddevice.audiosharing;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.flags.Flags;
+import com.android.settings.widget.ValidatedEditTextPreference;
+
+public class AudioSharingNamePreferenceController extends BasePreferenceController
+ implements ValidatedEditTextPreference.Validator,
+ Preference.OnPreferenceChangeListener,
+ DefaultLifecycleObserver {
+
+ private static final String TAG = "AudioSharingNamePreferenceController";
+
+ private static final String PREF_KEY = "audio_sharing_stream_name";
+
+ protected Preference mPreference;
+
+ private AudioSharingNameTextValidator mAudioSharingNameTextValidator;
+
+ public AudioSharingNamePreferenceController(Context context) {
+ super(context, PREF_KEY);
+ mAudioSharingNameTextValidator = new AudioSharingNameTextValidator();
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return Flags.enableLeAudioSharing() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return PREF_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ // TODO: update broadcast when name is changed.
+ return true;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public boolean isTextValid(String value) {
+ return mAudioSharingNameTextValidator.isTextValid(value);
+ }
+
+ @Override
+ public void onStart(@NonNull LifecycleOwner owner) {
+ // TODO
+ }
+
+ @Override
+ public void onStop(@NonNull LifecycleOwner owner) {
+ // TODO
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNameTextValidator.java
similarity index 60%
copy from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
copy to src/com/android/settings/connecteddevice/audiosharing/AudioSharingNameTextValidator.java
index db28e79..9492961 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingNameTextValidator.java
@@ -14,21 +14,14 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.connecteddevice.audiosharing;
-data class FingerprintViewModel(
- val name: String,
- val fingerId: Int,
- val deviceId: Long,
-)
+import com.android.settings.widget.ValidatedEditTextPreference;
-sealed class FingerprintAuthAttemptViewModel {
- data class Success(
- val fingerId: Int,
- ) : FingerprintAuthAttemptViewModel()
-
- data class Error(
- val error: Int,
- val message: String,
- ) : FingerprintAuthAttemptViewModel()
+public class AudioSharingNameTextValidator implements ValidatedEditTextPreference.Validator {
+ @Override
+ public boolean isTextValid(String value) {
+ // TODO: Add validate rule if applicable.
+ return true;
+ }
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
index 1400720..ff383a7 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
@@ -16,49 +16,369 @@
package com.android.settings.connecteddevice.audiosharing;
+import android.bluetooth.BluetoothCsipSetCoordinator;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothLeBroadcast;
+import android.bluetooth.BluetoothLeBroadcastAssistant;
+import android.bluetooth.BluetoothLeBroadcastMetadata;
+import android.bluetooth.BluetoothLeBroadcastReceiveState;
+import android.bluetooth.BluetoothProfile;
import android.content.Context;
+import android.util.Log;
import android.widget.Switch;
import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
+import com.android.settings.bluetooth.Utils;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.flags.Flags;
import com.android.settings.widget.SettingsMainSwitchBar;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
+import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.widget.OnMainSwitchChangeListener;
-public class AudioSharingSwitchBarController
+import com.google.common.collect.ImmutableList;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+public class AudioSharingSwitchBarController extends BasePreferenceController
implements DefaultLifecycleObserver, OnMainSwitchChangeListener {
-
private static final String TAG = "AudioSharingSwitchBarCtl";
-
- private final Context mContext;
+ private static final String PREF_KEY = "audio_sharing_main_switch";
private final SettingsMainSwitchBar mSwitchBar;
+ private final LocalBluetoothManager mBtManager;
+ private final LocalBluetoothLeBroadcast mBroadcast;
+ private final LocalBluetoothLeBroadcastAssistant mAssistant;
+ private final Executor mExecutor;
+ private DashboardFragment mFragment;
+ private List<BluetoothDevice> mTargetSinks = new ArrayList<>();
+
+ private final BluetoothLeBroadcast.Callback mBroadcastCallback =
+ new BluetoothLeBroadcast.Callback() {
+ @Override
+ public void onBroadcastStarted(int reason, int broadcastId) {
+ Log.d(
+ TAG,
+ "onBroadcastStarted(), reason = "
+ + reason
+ + ", broadcastId = "
+ + broadcastId);
+ updateSwitch();
+ }
+
+ @Override
+ public void onBroadcastStartFailed(int reason) {
+ Log.d(TAG, "onBroadcastStartFailed(), reason = " + reason);
+ // TODO: handle broadcast start fail
+ updateSwitch();
+ }
+
+ @Override
+ public void onBroadcastMetadataChanged(
+ int broadcastId, @NonNull BluetoothLeBroadcastMetadata metadata) {
+ Log.d(
+ TAG,
+ "onBroadcastMetadataChanged(), broadcastId = "
+ + broadcastId
+ + ", metadata = "
+ + metadata);
+ addSourceToTargetDevices(mTargetSinks);
+ }
+
+ @Override
+ public void onBroadcastStopped(int reason, int broadcastId) {
+ Log.d(
+ TAG,
+ "onBroadcastStopped(), reason = "
+ + reason
+ + ", broadcastId = "
+ + broadcastId);
+ updateSwitch();
+ }
+
+ @Override
+ public void onBroadcastStopFailed(int reason) {
+ Log.d(TAG, "onBroadcastStopFailed(), reason = " + reason);
+ // TODO: handle broadcast stop fail
+ updateSwitch();
+ }
+
+ @Override
+ public void onBroadcastUpdated(int reason, int broadcastId) {}
+
+ @Override
+ public void onBroadcastUpdateFailed(int reason, int broadcastId) {}
+
+ @Override
+ public void onPlaybackStarted(int reason, int broadcastId) {}
+
+ @Override
+ public void onPlaybackStopped(int reason, int broadcastId) {}
+ };
+
+ private BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback =
+ new BluetoothLeBroadcastAssistant.Callback() {
+ @Override
+ public void onSearchStarted(int reason) {}
+
+ @Override
+ public void onSearchStartFailed(int reason) {}
+
+ @Override
+ public void onSearchStopped(int reason) {}
+
+ @Override
+ public void onSearchStopFailed(int reason) {}
+
+ @Override
+ public void onSourceFound(@NonNull BluetoothLeBroadcastMetadata source) {}
+
+ @Override
+ public void onSourceAdded(@NonNull BluetoothDevice sink, int sourceId, int reason) {
+ Log.d(
+ TAG,
+ "onSourceAdded(), sink = "
+ + sink
+ + ", sourceId = "
+ + sourceId
+ + ", reason = "
+ + reason);
+ }
+
+ @Override
+ public void onSourceAddFailed(
+ @NonNull BluetoothDevice sink,
+ @NonNull BluetoothLeBroadcastMetadata source,
+ int reason) {
+ Log.d(
+ TAG,
+ "onSourceAddFailed(), sink = "
+ + sink
+ + ", source = "
+ + source
+ + ", reason = "
+ + reason);
+ }
+
+ @Override
+ public void onSourceModified(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onSourceModifyFailed(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onSourceRemoved(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onSourceRemoveFailed(
+ @NonNull BluetoothDevice sink, int sourceId, int reason) {}
+
+ @Override
+ public void onReceiveStateChanged(
+ BluetoothDevice sink,
+ int sourceId,
+ BluetoothLeBroadcastReceiveState state) {}
+ };
AudioSharingSwitchBarController(Context context, SettingsMainSwitchBar switchBar) {
- mContext = context;
+ super(context, PREF_KEY);
mSwitchBar = switchBar;
- mSwitchBar.setChecked(false);
+ mBtManager = Utils.getLocalBtManager(context);
+ mBroadcast = mBtManager.getProfileManager().getLeAudioBroadcastProfile();
+ mAssistant = mBtManager.getProfileManager().getLeAudioBroadcastAssistantProfile();
+ mExecutor = Executors.newSingleThreadExecutor();
+ mSwitchBar.setChecked(isBroadcasting());
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
mSwitchBar.addOnSwitchChangeListener(this);
+ if (mBroadcast != null) {
+ mBroadcast.registerServiceCallBack(mExecutor, mBroadcastCallback);
+ }
+ if (mAssistant != null) {
+ mAssistant.registerServiceCallBack(mExecutor, mBroadcastAssistantCallback);
+ }
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
mSwitchBar.removeOnSwitchChangeListener(this);
+ if (mBroadcast != null) {
+ mBroadcast.unregisterServiceCallBack(mBroadcastCallback);
+ }
+ if (mAssistant != null) {
+ mAssistant.unregisterServiceCallBack(mBroadcastAssistantCallback);
+ }
}
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
// Filter out unnecessary callbacks when switch is disabled.
if (!switchView.isEnabled()) return;
-
if (isChecked) {
- // TODO: start sharing
+ startAudioSharing();
} else {
- // TODO: stop sharing
+ stopAudioSharing();
+ }
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return Flags.enableLeAudioSharing() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ /**
+ * Initialize the controller.
+ *
+ * @param fragment The fragment to host the {@link AudioSharingSwitchBarController} dialog.
+ */
+ public void init(DashboardFragment fragment) {
+ this.mFragment = fragment;
+ }
+
+ private void startAudioSharing() {
+ mSwitchBar.setEnabled(false);
+ if (mBroadcast == null || isBroadcasting()) {
+ Log.d(TAG, "Already in broadcasting or broadcast not support, ignore!");
+ mSwitchBar.setEnabled(true);
+ return;
+ }
+ if (mFragment == null) {
+ Log.w(TAG, "Dialog fail to show due to null fragment.");
+ mSwitchBar.setEnabled(true);
+ return;
+ }
+ Map<Integer, List<CachedBluetoothDevice>> groupedDevices = fetchConnectedDevicesByGroupId();
+ ArrayList<AudioSharingDeviceItem> deviceItems = new ArrayList<>();
+ Optional<Integer> activeGroupId = Optional.empty();
+ for (List<CachedBluetoothDevice> devices : groupedDevices.values()) {
+ // Use random device in the group to represent the group.
+ CachedBluetoothDevice device = devices.get(0);
+ // TODO: add BluetoothUtils.isActiveLeAudioDevice to avoid directly using isActiveDevice
+ if (device.isActiveDevice(BluetoothProfile.LE_AUDIO)) {
+ activeGroupId = Optional.of(device.getGroupId());
+ } else {
+ AudioSharingDeviceItem item =
+ new AudioSharingDeviceItem(device.getName(), device.getGroupId());
+ deviceItems.add(item);
+ }
+ }
+ mTargetSinks = new ArrayList<>();
+ activeGroupId.ifPresent(
+ gId -> {
+ if (groupedDevices.containsKey(gId)) {
+ for (CachedBluetoothDevice device : groupedDevices.get(gId)) {
+ mTargetSinks.add(device.getDevice());
+ }
+ }
+ });
+ AudioSharingDialogFragment.show(
+ mFragment,
+ deviceItems,
+ new AudioSharingDialogFragment.DialogEventListener() {
+ @Override
+ public void onItemClick(AudioSharingDeviceItem item) {
+ if (groupedDevices.containsKey(item.getGroupId())) {
+ for (CachedBluetoothDevice device :
+ groupedDevices.get(item.getGroupId())) {
+ mTargetSinks.add(device.getDevice());
+ }
+ }
+ // TODO: handle app source name for broadcasting.
+ mBroadcast.startBroadcast("test", /* language= */ null);
+ }
+
+ @Override
+ public void onCancelClick() {
+ // TODO: handle app source name for broadcasting.
+ mBroadcast.startBroadcast("test", /* language= */ null);
+ }
+ });
+ }
+
+ private void stopAudioSharing() {
+ mSwitchBar.setEnabled(false);
+ if (mBroadcast == null || !isBroadcasting()) {
+ Log.d(TAG, "Already not broadcasting or broadcast not support, ignore!");
+ mSwitchBar.setEnabled(true);
+ return;
+ }
+ mBroadcast.stopBroadcast(mBroadcast.getLatestBroadcastId());
+ }
+
+ private void updateSwitch() {
+ ThreadUtils.postOnMainThread(
+ () -> {
+ mSwitchBar.setChecked(isBroadcasting());
+ mSwitchBar.setEnabled(true);
+ });
+ }
+
+ private boolean isBroadcasting() {
+ return mBroadcast != null && mBroadcast.isEnabled(null);
+ }
+
+ private Map<Integer, List<CachedBluetoothDevice>> fetchConnectedDevicesByGroupId() {
+ // TODO: filter out devices with le audio disabled.
+ List<BluetoothDevice> connectedDevices =
+ mAssistant == null ? ImmutableList.of() : mAssistant.getConnectedDevices();
+ Map<Integer, List<CachedBluetoothDevice>> groupedDevices = new HashMap<>();
+ CachedBluetoothDeviceManager cacheManager = mBtManager.getCachedDeviceManager();
+ for (BluetoothDevice device : connectedDevices) {
+ CachedBluetoothDevice cachedDevice = cacheManager.findDevice(device);
+ if (cachedDevice == null) {
+ Log.d(TAG, "Skip device due to not being cached: " + device.getAnonymizedAddress());
+ continue;
+ }
+ int groupId = cachedDevice.getGroupId();
+ if (groupId == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+ Log.d(TAG, "Skip device due to no valid group id");
+ continue;
+ }
+ if (!groupedDevices.containsKey(groupId)) {
+ groupedDevices.put(groupId, new ArrayList<>());
+ }
+ groupedDevices.get(groupId).add(cachedDevice);
+ }
+ return groupedDevices;
+ }
+
+ private void addSourceToTargetDevices(List<BluetoothDevice> sinks) {
+ if (sinks.isEmpty() || mBroadcast == null || mAssistant == null) {
+ Log.d(TAG, "Skip adding source to target.");
+ return;
+ }
+ BluetoothLeBroadcastMetadata broadcastMetadata =
+ mBroadcast.getLatestBluetoothLeBroadcastMetadata();
+ if (broadcastMetadata == null) {
+ Log.e(TAG, "Error: There is no broadcastMetadata.");
+ return;
+ }
+ for (BluetoothDevice sink : sinks) {
+ Log.d(
+ TAG,
+ "Add broadcast with broadcastId: "
+ + broadcastMetadata.getBroadcastId()
+ + "to the device: "
+ + sink.getAnonymizedAddress());
+ mAssistant.addSource(sink, broadcastMetadata, /* isGroupOp= */ false);
}
}
}
diff --git a/src/com/android/settings/datausage/AppDataUsageCycleController.kt b/src/com/android/settings/datausage/AppDataUsageCycleController.kt
index b1a0e76..a3b7499 100644
--- a/src/com/android/settings/datausage/AppDataUsageCycleController.kt
+++ b/src/com/android/settings/datausage/AppDataUsageCycleController.kt
@@ -25,7 +25,6 @@
import androidx.lifecycle.repeatOnLifecycle
import androidx.preference.PreferenceScreen
import com.android.settings.core.BasePreferenceController
-import com.android.settings.datausage.lib.AppDataUsageDetailsRepository
import com.android.settings.datausage.lib.IAppDataUsageDetailsRepository
import com.android.settings.datausage.lib.NetworkUsageDetailsData
import kotlinx.coroutines.Dispatchers
@@ -40,11 +39,18 @@
private lateinit var preference: SpinnerPreference
private var cycleAdapter: CycleAdapter? = null
- private var initialCycles: List<Long> = emptyList()
- private var initialSelectedEndTime: Long = -1
-
private var usageDetailsDataList: List<NetworkUsageDetailsData> = emptyList()
+ override fun getAvailabilityStatus() = AVAILABLE
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ super.displayPreference(screen)
+ preference = screen.findPreference(preferenceKey)!!
+ if (cycleAdapter == null) {
+ cycleAdapter = CycleAdapter(mContext, preference)
+ }
+ }
+
fun init(
repository: IAppDataUsageDetailsRepository,
onUsageDataUpdated: (NetworkUsageDetailsData) -> Unit,
@@ -60,22 +66,9 @@
* before loading to reduce flicker.
*/
fun setInitialCycles(initialCycles: List<Long>, initialSelectedEndTime: Long) {
- this.initialCycles = initialCycles
- this.initialSelectedEndTime = initialSelectedEndTime
- }
-
- override fun getAvailabilityStatus() = AVAILABLE
-
- override fun displayPreference(screen: PreferenceScreen) {
- super.displayPreference(screen)
- preference = screen.findPreference(preferenceKey)!!
- if (cycleAdapter == null) {
- cycleAdapter = CycleAdapter(mContext, preference).apply {
- if (initialCycles.isNotEmpty()) {
- setInitialCycleList(initialCycles, initialSelectedEndTime)
- preference.setHasCycles(true)
- }
- }
+ if (initialCycles.isNotEmpty()) {
+ cycleAdapter?.setInitialCycleList(initialCycles, initialSelectedEndTime)
+ preference.setHasCycles(true)
}
}
diff --git a/src/com/android/settings/datausage/CellDataPreference.java b/src/com/android/settings/datausage/CellDataPreference.java
index 9374217..3bd3ecc 100644
--- a/src/com/android/settings/datausage/CellDataPreference.java
+++ b/src/com/android/settings/datausage/CellDataPreference.java
@@ -26,11 +26,10 @@
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
-import android.widget.Checkable;
+import android.widget.CompoundButton;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog.Builder;
-import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
@@ -51,12 +50,10 @@
public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
public boolean mChecked;
public boolean mMultiSimDialog;
- private MobileDataEnabledListener mDataStateListener;
+ private final MobileDataEnabledListener mDataStateListener;
public CellDataPreference(Context context, AttributeSet attrs) {
- super(context, attrs, TypedArrayUtils.getAttr(context,
- androidx.preference.R.attr.switchPreferenceStyle,
- android.R.attr.switchPreferenceStyle));
+ super(context, attrs, androidx.preference.R.attr.switchPreferenceCompatStyle);
mDataStateListener = new MobileDataEnabledListener(context, this);
}
@@ -170,9 +167,10 @@
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- final View switchView = holder.findViewById(android.R.id.switch_widget);
+ final CompoundButton switchView =
+ (CompoundButton) holder.findViewById(androidx.preference.R.id.switchWidget);
switchView.setClickable(false);
- ((Checkable) switchView).setChecked(mChecked);
+ switchView.setChecked(mChecked);
}
@Override
diff --git a/src/com/android/settings/datausage/ChartDataUsagePreference.java b/src/com/android/settings/datausage/ChartDataUsagePreference.java
index e5a7307..e8e2109 100644
--- a/src/com/android/settings/datausage/ChartDataUsagePreference.java
+++ b/src/com/android/settings/datausage/ChartDataUsagePreference.java
@@ -112,9 +112,6 @@
// increment by current bucket total
totalData += data.getUsage();
- if (points.size() == 1) {
- points.put(toInt(startTime - mStart) - 1, -1);
- }
points.put(toInt(startTime - mStart + 1), (int) (totalData / RESOLUTION));
points.put(toInt(endTime - mStart), (int) (totalData / RESOLUTION));
}
diff --git a/src/com/android/settings/datausage/ChartDataUsagePreferenceController.kt b/src/com/android/settings/datausage/ChartDataUsagePreferenceController.kt
index 5149af0..780978f 100644
--- a/src/com/android/settings/datausage/ChartDataUsagePreferenceController.kt
+++ b/src/com/android/settings/datausage/ChartDataUsagePreferenceController.kt
@@ -39,6 +39,8 @@
private lateinit var repository: INetworkCycleDataRepository
private lateinit var preference: ChartDataUsagePreference
private lateinit var lifecycleScope: LifecycleCoroutineScope
+ private var lastStartTime: Long? = null
+ private var lastEndTime: Long? = null
open fun init(template: NetworkTemplate) {
this.repository = NetworkCycleDataRepository(mContext, template)
@@ -72,6 +74,10 @@
}
fun update(startTime: Long, endTime: Long) {
+ if (lastStartTime == startTime && lastEndTime == endTime) return
+ lastStartTime = startTime
+ lastEndTime = endTime
+
preference.setTime(startTime, endTime)
preference.setNetworkCycleData(NetworkCycleChartData.AllZero)
lifecycleScope.launch {
diff --git a/src/com/android/settings/datausage/DataUsageList.kt b/src/com/android/settings/datausage/DataUsageList.kt
index 7240150..30e8db3 100644
--- a/src/com/android/settings/datausage/DataUsageList.kt
+++ b/src/com/android/settings/datausage/DataUsageList.kt
@@ -31,9 +31,10 @@
import com.android.settings.R
import com.android.settings.datausage.lib.BillingCycleRepository
import com.android.settings.datausage.lib.NetworkUsageData
-import com.android.settings.network.MobileDataEnabledListener
import com.android.settings.network.MobileNetworkRepository
+import com.android.settings.network.mobileDataEnabledFlow
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
import com.android.settingslib.spaprivileged.framework.common.userManager
import com.android.settingslib.utils.ThreadUtils
import kotlin.jvm.optionals.getOrNull
@@ -43,10 +44,7 @@
* to inspect based on usage cycle and control through [NetworkPolicy].
*/
@OpenForTesting
-open class DataUsageList : DataUsageBaseFragment(), MobileDataEnabledListener.Client {
- @VisibleForTesting
- lateinit var dataStateListener: MobileDataEnabledListener
-
+open class DataUsageList : DataUsageBaseFragment() {
@JvmField
@VisibleForTesting
var template: NetworkTemplate? = null
@@ -89,7 +87,6 @@
return
}
updateSubscriptionInfoEntity()
- dataStateListener = MobileDataEnabledListener(activity, this)
dataUsageListAppsController = use(DataUsageListAppsController::class.java).apply {
init(template)
}
@@ -103,6 +100,9 @@
override fun onViewCreated(v: View, savedInstanceState: Bundle?) {
super.onViewCreated(v, savedInstanceState)
+ requireContext().mobileDataEnabledFlow(subId)
+ .collectLatestWithLifecycle(viewLifecycleOwner) { updatePolicy() }
+
val template = template ?: return
dataUsageListHeaderController = DataUsageListHeaderController(
setPinnedHeaderView(R.layout.apps_filter_spinner),
@@ -114,17 +114,6 @@
)
}
- override fun onResume() {
- super.onResume()
- dataStateListener.start(subId)
- updatePolicy()
- }
-
- override fun onPause() {
- super.onPause()
- dataStateListener.stop()
- }
-
override fun getPreferenceScreenResId() = R.xml.data_usage_list
override fun getLogTag() = TAG
@@ -154,13 +143,6 @@
}
}
- /**
- * Implementation of `MobileDataEnabledListener.Client`
- */
- override fun onMobileDataEnabledChange() {
- updatePolicy()
- }
-
/** Update chart sweeps and cycle list to reflect [NetworkPolicy] for current [template]. */
@VisibleForTesting
fun updatePolicy() {
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index b88c345..a995ac3 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -666,6 +666,7 @@
controllers.add(new ShowKeyPressesPreferenceController(context));
controllers.add(new ShowSurfaceUpdatesPreferenceController(context));
controllers.add(new ShowLayoutBoundsPreferenceController(context));
+ controllers.add(new ShowHdrSdrRatioPreferenceController(context));
controllers.add(new ShowRefreshRatePreferenceController(context));
controllers.add(new RtlLayoutPreferenceController(context));
controllers.add(new WindowAnimationScalePreferenceController(context));
diff --git a/src/com/android/settings/development/OWNERS b/src/com/android/settings/development/OWNERS
new file mode 100644
index 0000000..6443afe
--- /dev/null
+++ b/src/com/android/settings/development/OWNERS
@@ -0,0 +1,5 @@
+# ShowHdrSdrRatioPreferenceController
+per-file ShowHdrSdrRatioPreferenceController.java=file:platform/frameworks/native:/services/surfaceflinger/OWNERS
+
+# ShowRefreshRatePreferenceController
+per-file ShowRefreshRatePreferenceController.java=file:platform/frameworks/native:/services/surfaceflinger/OWNERS
diff --git a/src/com/android/settings/development/ShowHdrSdrRatioPreferenceController.java b/src/com/android/settings/development/ShowHdrSdrRatioPreferenceController.java
new file mode 100644
index 0000000..2e7807e
--- /dev/null
+++ b/src/com/android/settings/development/ShowHdrSdrRatioPreferenceController.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (C) 2023 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;
+
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.view.Display;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.flags.Flags;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+/**
+ * Controller class for controlling the hdr/sdr ratio on SurfaceFlinger
+ */
+public class ShowHdrSdrRatioPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ private static final String SHOW_REFRESH_RATE_KEY = "show_hdr_sdr_ratio";
+
+ private static final int SETTING_VALUE_QUERY = 2;
+ private static final int SETTING_VALUE_ON = 1;
+ private static final int SETTING_VALUE_OFF = 0;
+
+ private static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
+
+ private static final int SURFACE_FLINGER_CODE = 1043;
+
+ private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
+
+ private final IBinder mSurfaceFlinger;
+
+ private final boolean mIsHdrSdrRatioAvailable;
+
+ public ShowHdrSdrRatioPreferenceController(Context context) {
+ super(context);
+ mSurfaceFlinger = ServiceManager.getService(SURFACE_FLINGER_SERVICE_KEY);
+ DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+ Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ mIsHdrSdrRatioAvailable = display != null && display.isHdrSdrRatioAvailable();
+ }
+
+ @VisibleForTesting
+ ShowHdrSdrRatioPreferenceController(Context context, IBinder surfaceFlinger,
+ boolean isHdrSdrRatioAvailable) {
+ super(context);
+ mSurfaceFlinger = surfaceFlinger;
+ mIsHdrSdrRatioAvailable = isHdrSdrRatioAvailable;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return SHOW_REFRESH_RATE_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ writeShowHdrSdrRatioSetting(isEnabled);
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ updateShowHdrSdrRatioSetting();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return Flags.developmentHdrSdrRatio() && mIsHdrSdrRatioAvailable;
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ final TwoStatePreference preference = (TwoStatePreference) mPreference;
+ if (preference.isChecked()) {
+ // Writing false to the preference when the setting is already off will have a
+ // side effect of turning on the preference that we wish to avoid
+ writeShowHdrSdrRatioSetting(false);
+ preference.setChecked(false);
+ }
+ }
+
+ private void updateShowHdrSdrRatioSetting() {
+ // magic communication with surface flinger.
+ try {
+ if (mSurfaceFlinger != null) {
+ final Parcel data = Parcel.obtain();
+ final Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
+ data.writeInt(SETTING_VALUE_QUERY);
+ mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data, reply, 0 /* flags */);
+ final boolean enabled = reply.readBoolean();
+ ((TwoStatePreference) mPreference).setChecked(enabled);
+ reply.recycle();
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ // intentional no-op
+ }
+ }
+
+ @VisibleForTesting
+ void writeShowHdrSdrRatioSetting(boolean isEnabled) {
+ try {
+ if (mSurfaceFlinger != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
+ final int showHdrSdrRatio = isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF;
+ data.writeInt(showHdrSdrRatio);
+ mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data,
+ null /* reply */, 0 /* flags */);
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ // intentional no-op
+ }
+ updateShowHdrSdrRatioSetting();
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java
index e82d541..f212eea 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java
@@ -111,10 +111,7 @@
Log.d(TAG, "Fragment not attached yet.");
return;
}
- setText(viewId, text, true);
- }
- public void setText(int viewId, CharSequence text, boolean enableCopy) {
final TextView textView = mRootView.findViewById(viewId);
if (textView == null) {
return;
@@ -125,6 +122,5 @@
text = PhoneNumberUtil.expandByTts(text);
}
textView.setText(text);
- textView.setTextIsSelectable(enableCopy);
}
}
diff --git a/src/com/android/settings/display/darkmode/DarkModeCustomBedtimePreferenceController.java b/src/com/android/settings/display/darkmode/DarkModeCustomBedtimePreferenceController.java
index c6e379c..488befb 100644
--- a/src/com/android/settings/display/darkmode/DarkModeCustomBedtimePreferenceController.java
+++ b/src/com/android/settings/display/darkmode/DarkModeCustomBedtimePreferenceController.java
@@ -20,6 +20,7 @@
import android.app.UiModeManager;
import android.content.Context;
+import android.content.Intent;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -52,7 +53,12 @@
super.displayPreference(screen);
mFooterPreference = screen.findPreference(getPreferenceKey());
mFooterPreference.setLearnMoreAction(
- v -> v.getContext().startActivity(mBedtimeSettings.getBedtimeSettingsIntent()));
+ v -> {
+ Intent bedtimeSettingsIntent = mBedtimeSettings.getBedtimeSettingsIntent();
+ if (bedtimeSettingsIntent != null) {
+ v.getContext().startActivity(bedtimeSettingsIntent);
+ }
+ });
mFooterPreference.setLearnMoreText(
mContext.getString(R.string.dark_ui_bedtime_footer_action));
}
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 82917d2..86ef3cf 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -27,10 +27,13 @@
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
+import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
@@ -45,14 +48,12 @@
import com.android.settings.fuelgauge.batteryusage.BatteryEntry;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.EntityHeaderController;
-import com.android.settingslib.HelpUtils;
+import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.Instrumentable;
-import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.LayoutPreference;
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.ArrayList;
import java.util.List;
@@ -60,15 +61,15 @@
import java.util.concurrent.Executors;
/**
- * Power usage detail fragment for each app, this fragment contains
- *
- * 1. Detail battery usage information for app(i.e. usage time, usage amount)
+ * Power usage detail fragment for each app, this fragment contains <br>
+ * <br>
+ * 1. Detail battery usage information for app(i.e. usage time, usage amount) <br>
* 2. Battery related controls for app(i.e uninstall, force stop)
*/
-public class AdvancedPowerUsageDetail extends DashboardFragment implements
- ButtonActionDialogFragment.AppButtonsDialogListener,
- SelectorWithWidgetPreference.OnClickListener {
-
+public class AdvancedPowerUsageDetail extends DashboardFragment
+ implements ButtonActionDialogFragment.AppButtonsDialogListener,
+ Preference.OnPreferenceClickListener,
+ Preference.OnPreferenceChangeListener {
public static final String TAG = "AdvancedPowerDetail";
public static final String EXTRA_UID = "extra_uid";
public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
@@ -85,46 +86,28 @@
public static final String EXTRA_POWER_USAGE_AMOUNT = "extra_power_usage_amount";
private static final String KEY_PREF_HEADER = "header_view";
- private static final String KEY_PREF_UNRESTRICTED = "unrestricted_pref";
- private static final String KEY_PREF_OPTIMIZED = "optimized_pref";
- private static final String KEY_PREF_RESTRICTED = "restricted_pref";
- private static final String KEY_FOOTER_PREFERENCE = "app_usage_footer_preference";
- private static final String PACKAGE_NAME_NONE = "none";
-
- private static final String HEADER_SUMMARY_FORMAT = "%s\n(%s)";
+ private static final String KEY_ALLOW_BACKGROUND_USAGE = "allow_background_usage";
private static final int REQUEST_UNINSTALL = 0;
private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;
private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
- @VisibleForTesting
- LayoutPreference mHeaderPreference;
- @VisibleForTesting
- ApplicationsState mState;
- @VisibleForTesting
- ApplicationsState.AppEntry mAppEntry;
- @VisibleForTesting
- BatteryOptimizeUtils mBatteryOptimizeUtils;
- @VisibleForTesting
- FooterPreference mFooterPreference;
- @VisibleForTesting
- SelectorWithWidgetPreference mRestrictedPreference;
- @VisibleForTesting
- SelectorWithWidgetPreference mOptimizePreference;
- @VisibleForTesting
- SelectorWithWidgetPreference mUnrestrictedPreference;
- @VisibleForTesting
- @BatteryOptimizeUtils.OptimizationMode
- int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
- @VisibleForTesting
- BackupManager mBackupManager;
- @VisibleForTesting
- StringBuilder mLogStringBuilder;
-
private AppButtonsPreferenceController mAppButtonsPreferenceController;
private PowerUsageTimeController mPowerUsageTimeController;
+ @VisibleForTesting LayoutPreference mHeaderPreference;
+ @VisibleForTesting ApplicationsState mState;
+ @VisibleForTesting ApplicationsState.AppEntry mAppEntry;
+ @VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @VisibleForTesting PrimarySwitchPreference mAllowBackgroundUsagePreference;
+
+ @VisibleForTesting @BatteryOptimizeUtils.OptimizationMode
+ int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
+
+ @VisibleForTesting BackupManager mBackupManager;
+ @VisibleForTesting StringBuilder mLogStringBuilder;
+
// A wrapper class to carry LaunchBatteryDetailPage required arguments.
private static final class LaunchBatteryDetailPageArgs {
private String mUsagePercent;
@@ -145,9 +128,14 @@
/** Launches battery details page for an individual battery consumer fragment. */
public static void startBatteryDetailPage(
- Context context, int sourceMetricsCategory,
- BatteryDiffEntry diffEntry, String usagePercent, String slotInformation,
- boolean showTimeInformation, String anomalyHintPrefKey, String anomalyHintText) {
+ Context context,
+ int sourceMetricsCategory,
+ BatteryDiffEntry diffEntry,
+ String usagePercent,
+ String slotInformation,
+ boolean showTimeInformation,
+ String anomalyHintPrefKey,
+ String anomalyHintText) {
final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs();
// configure the launch argument.
launchArgs.mUsagePercent = usagePercent;
@@ -170,8 +158,11 @@
}
/** Launches battery details page for an individual battery consumer. */
- public static void startBatteryDetailPage(Activity caller,
- InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent) {
+ public static void startBatteryDetailPage(
+ Activity caller,
+ InstrumentedPreferenceFragment fragment,
+ BatteryEntry entry,
+ String usagePercent) {
final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs();
// configure the launch argument.
launchArgs.mUsagePercent = usagePercent;
@@ -208,8 +199,10 @@
args.putBoolean(EXTRA_SHOW_TIME_INFO, launchArgs.mShowTimeInformation);
args.putString(EXTRA_ANOMALY_HINT_PREF_KEY, launchArgs.mAnomalyHintPrefKey);
args.putString(EXTRA_ANOMALY_HINT_TEXT, launchArgs.mAnomalyHintText);
- final int userId = launchArgs.mIsUserEntry ? ActivityManager.getCurrentUser()
- : UserHandle.getUserId(launchArgs.mUid);
+ final int userId =
+ launchArgs.mIsUserEntry
+ ? ActivityManager.getCurrentUser()
+ : UserHandle.getUserId(launchArgs.mUid);
new SubSettingLauncher(context)
.setDestination(AdvancedPowerUsageDetail.class.getName())
@@ -220,11 +213,11 @@
.launch();
}
- /**
- * Start packageName's battery detail page.
- */
+ /** Start packageName's battery detail page. */
public static void startBatteryDetailPage(
- Activity caller, Instrumentable instrumentable, String packageName,
+ Activity caller,
+ Instrumentable instrumentable,
+ String packageName,
UserHandle userHandle) {
final Bundle args = new Bundle(3);
final PackageManager packageManager = caller.getPackageManager();
@@ -257,7 +250,7 @@
super.onCreate(icicle);
final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
- onCreateForTriState(packageName);
+ onCreateBackgroundUsageState(packageName);
mHeaderPreference = findPreference(KEY_PREF_HEADER);
if (packageName != null) {
@@ -271,16 +264,19 @@
initHeader();
mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
- initPreferenceForTriState(getContext());
- mExecutor.execute(() -> {
- String packageName =
- getLoggingPackageName(getContext(), mBatteryOptimizeUtils.getPackageName());
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
- .action(
- getContext(),
- SettingsEnums.OPEN_APP_BATTERY_USAGE,
- packageName);
- });
+ initFooter();
+ mExecutor.execute(
+ () -> {
+ final String packageName =
+ BatteryUtils.getLoggingPackageName(
+ getContext(), mBatteryOptimizeUtils.getPackageName());
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ getContext(),
+ SettingsEnums.OPEN_APP_BATTERY_USAGE,
+ packageName);
+ });
mLogStringBuilder = new StringBuilder("onResume mode = ").append(mOptimizationMode);
}
@@ -288,28 +284,28 @@
public void onPause() {
super.onPause();
- final int selectedPreference = getSelectedPreference();
-
notifyBackupManager();
- mLogStringBuilder.append(", onPause mode = ").append(selectedPreference);
- logMetricCategory(selectedPreference);
+ final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode();
+ mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode);
+ logMetricCategory(currentOptimizeMode);
- mExecutor.execute(() -> {
- BatteryOptimizeLogUtils.writeLog(
- getContext().getApplicationContext(),
- Action.LEAVE,
- BatteryOptimizeLogUtils.getPackageNameWithUserId(
- mBatteryOptimizeUtils.getPackageName(), UserHandle.myUserId()),
- mLogStringBuilder.toString());
- });
- Log.d(TAG, "Leave with mode: " + selectedPreference);
+ mExecutor.execute(
+ () -> {
+ BatteryOptimizeLogUtils.writeLog(
+ getContext().getApplicationContext(),
+ Action.LEAVE,
+ BatteryOptimizeLogUtils.getPackageNameWithUserId(
+ mBatteryOptimizeUtils.getPackageName(), UserHandle.myUserId()),
+ mLogStringBuilder.toString());
+ });
+ Log.d(TAG, "Leave with mode: " + currentOptimizeMode);
}
@VisibleForTesting
void notifyBackupManager() {
if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
- final BackupManager backupManager = mBackupManager != null
- ? mBackupManager : new BackupManager(getContext());
+ final BackupManager backupManager =
+ mBackupManager != null ? mBackupManager : new BackupManager(getContext());
backupManager.dataChanged();
}
}
@@ -319,10 +315,11 @@
final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);
final Activity context = getActivity();
final Bundle bundle = getArguments();
- EntityHeaderController controller = EntityHeaderController
- .newInstance(context, this, appSnippet)
- .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE,
- EntityHeaderController.ActionType.ACTION_NONE);
+ EntityHeaderController controller =
+ EntityHeaderController.newInstance(context, this, appSnippet)
+ .setButtonActions(
+ EntityHeaderController.ActionType.ACTION_NONE,
+ EntityHeaderController.ActionType.ACTION_NONE);
if (mAppEntry == null) {
controller.setLabel(bundle.getString(EXTRA_LABEL));
@@ -346,40 +343,39 @@
final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
final String anomalyHintPrefKey = bundle.getString(EXTRA_ANOMALY_HINT_PREF_KEY);
final String anomalyHintText = bundle.getString(EXTRA_ANOMALY_HINT_TEXT);
- mPowerUsageTimeController.handleScreenTimeUpdated(slotTime, screenOnTimeInMs,
- backgroundTimeMs, anomalyHintPrefKey, anomalyHintText);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ slotTime,
+ screenOnTimeInMs,
+ backgroundTimeMs,
+ anomalyHintPrefKey,
+ anomalyHintText);
}
controller.done(true /* rebindActions */);
}
@VisibleForTesting
- void initPreferenceForTriState(Context context) {
+ void initFooter() {
final String stateString;
- final String footerString;
+ final String detailInfoString;
+ final Context context = getContext();
if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) {
// Present optimized only string when the package name is invalid.
stateString = context.getString(R.string.manager_battery_usage_optimized_only);
- footerString = context.getString(
- R.string.manager_battery_usage_footer_limited, stateString);
+ detailInfoString =
+ context.getString(R.string.manager_battery_usage_footer_limited, stateString);
} else if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
// Present unrestricted only string when the package is system or default active app.
stateString = context.getString(R.string.manager_battery_usage_unrestricted_only);
- footerString = context.getString(
- R.string.manager_battery_usage_footer_limited, stateString);
+ detailInfoString =
+ context.getString(R.string.manager_battery_usage_footer_limited, stateString);
} else {
// Present default string to normal app.
- footerString = context.getString(R.string.manager_battery_usage_footer);
+ detailInfoString =
+ context.getString(
+ R.string.manager_battery_usage_allow_background_usage_summary);
}
- mFooterPreference.setTitle(footerString);
- final Intent helpIntent = HelpUtils.getHelpIntent(context, context.getString(
- R.string.help_url_app_usage_settings), /*backupContext=*/ "");
- if (helpIntent != null) {
- mFooterPreference.setLearnMoreAction(v ->
- startActivityForResult(helpIntent, /*requestCode=*/ 0));
- mFooterPreference.setLearnMoreText(
- context.getString(R.string.manager_battery_usage_link_a11y));
- }
+ mAllowBackgroundUsagePreference.setSummary(detailInfoString);
}
@Override
@@ -404,17 +400,21 @@
final int uid = bundle.getInt(EXTRA_UID, 0);
final String packageName = bundle.getString(EXTRA_PACKAGE_NAME);
- mAppButtonsPreferenceController = new AppButtonsPreferenceController(
- (SettingsActivity) getActivity(), this, getSettingsLifecycle(),
- packageName, mState, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN);
+ mAppButtonsPreferenceController =
+ new AppButtonsPreferenceController(
+ (SettingsActivity) getActivity(),
+ this,
+ getSettingsLifecycle(),
+ packageName,
+ mState,
+ REQUEST_UNINSTALL,
+ REQUEST_REMOVE_DEVICE_ADMIN);
if (bundle.getBoolean(EXTRA_SHOW_TIME_INFO, false)) {
mPowerUsageTimeController = new PowerUsageTimeController(getContext());
controllers.add(mPowerUsageTimeController);
}
controllers.add(mAppButtonsPreferenceController);
- controllers.add(new UnrestrictedPreferenceController(context, uid, packageName));
- controllers.add(new OptimizedPreferenceController(context, uid, packageName));
- controllers.add(new RestrictedPreferenceController(context, uid, packageName));
+ controllers.add(new AllowBackgroundPreferenceController(context, uid, packageName));
return controllers;
}
@@ -435,80 +435,76 @@
}
@Override
- public void onRadioButtonClicked(SelectorWithWidgetPreference selected) {
- final String selectedKey = selected.getKey();
- updatePreferenceState(mUnrestrictedPreference, selectedKey);
- updatePreferenceState(mOptimizePreference, selectedKey);
- updatePreferenceState(mRestrictedPreference, selectedKey);
- mBatteryOptimizeUtils.setAppUsageState(getSelectedPreference(), Action.APPLY);
+ public boolean onPreferenceClick(Preference preference) {
+ if (!(preference instanceof PrimarySwitchPreference)
+ || !TextUtils.equals(preference.getKey(), KEY_ALLOW_BACKGROUND_USAGE)) {
+ return false;
+ }
+ PowerBackgroundUsageDetail.startPowerBackgroundUsageDetailPage(
+ getContext(), getArguments());
+ return true;
}
- private void updatePreferenceState(SelectorWithWidgetPreference preference,
- String selectedKey) {
- preference.setChecked(selectedKey.equals(preference.getKey()));
+ @Override
+ public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
+ if (!(preference instanceof PrimarySwitchPreference)
+ || !TextUtils.equals(preference.getKey(), KEY_ALLOW_BACKGROUND_USAGE)) {
+ return false;
+ }
+ if (newValue instanceof Boolean) {
+ final boolean isAllowBackgroundUsage = (boolean) newValue;
+ mBatteryOptimizeUtils.setAppUsageState(
+ isAllowBackgroundUsage
+ ? BatteryOptimizeUtils.MODE_OPTIMIZED
+ : BatteryOptimizeUtils.MODE_RESTRICTED,
+ Action.APPLY);
+ }
+ return true;
}
- private void logMetricCategory(int selectedKey) {
- if (selectedKey == mOptimizationMode) {
+ private void logMetricCategory(int currentOptimizeMode) {
+ if (currentOptimizeMode == mOptimizationMode) {
return;
}
-
int metricCategory = 0;
- switch (selectedKey) {
+ switch (currentOptimizeMode) {
case BatteryOptimizeUtils.MODE_UNRESTRICTED:
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
- break;
case BatteryOptimizeUtils.MODE_OPTIMIZED:
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_ALLOW_BACKGROUND;
break;
case BatteryOptimizeUtils.MODE_RESTRICTED:
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_DISABLE_BACKGROUND;
break;
}
if (metricCategory == 0) {
return;
}
int finalMetricCategory = metricCategory;
- mExecutor.execute(() -> {
- String packageName =
- getLoggingPackageName(getContext(), mBatteryOptimizeUtils.getPackageName());
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
- .action(
- /* attribution */ SettingsEnums.OPEN_APP_BATTERY_USAGE,
- /* action */ finalMetricCategory,
- /* pageId */ SettingsEnums.OPEN_APP_BATTERY_USAGE,
- packageName,
- getArguments().getInt(EXTRA_POWER_USAGE_AMOUNT));
- });
+ mExecutor.execute(
+ () -> {
+ String packageName =
+ BatteryUtils.getLoggingPackageName(
+ getContext(), mBatteryOptimizeUtils.getPackageName());
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ /* attribution */ SettingsEnums.OPEN_APP_BATTERY_USAGE,
+ /* action */ finalMetricCategory,
+ /* pageId */ SettingsEnums.OPEN_APP_BATTERY_USAGE,
+ packageName,
+ getArguments().getInt(EXTRA_POWER_USAGE_AMOUNT));
+ });
}
- private void onCreateForTriState(String packageName) {
- mUnrestrictedPreference = findPreference(KEY_PREF_UNRESTRICTED);
- mOptimizePreference = findPreference(KEY_PREF_OPTIMIZED);
- mRestrictedPreference = findPreference(KEY_PREF_RESTRICTED);
- mFooterPreference = findPreference(KEY_FOOTER_PREFERENCE);
- mUnrestrictedPreference.setOnClickListener(this);
- mOptimizePreference.setOnClickListener(this);
- mRestrictedPreference.setOnClickListener(this);
-
- mBatteryOptimizeUtils = new BatteryOptimizeUtils(
- getContext(), getArguments().getInt(EXTRA_UID), packageName);
- }
-
- private int getSelectedPreference() {
- if (mRestrictedPreference.isChecked()) {
- return BatteryOptimizeUtils.MODE_RESTRICTED;
- } else if (mUnrestrictedPreference.isChecked()) {
- return BatteryOptimizeUtils.MODE_UNRESTRICTED;
- } else if (mOptimizePreference.isChecked()) {
- return BatteryOptimizeUtils.MODE_OPTIMIZED;
- } else {
- return BatteryOptimizeUtils.MODE_UNKNOWN;
+ private void onCreateBackgroundUsageState(String packageName) {
+ mAllowBackgroundUsagePreference = findPreference(KEY_ALLOW_BACKGROUND_USAGE);
+ if (mAllowBackgroundUsagePreference != null) {
+ mAllowBackgroundUsagePreference.setOnPreferenceClickListener(this);
+ mAllowBackgroundUsagePreference.setOnPreferenceChangeListener(this);
}
- }
- private static String getLoggingPackageName(Context context, String originalPackingName) {
- return BatteryUtils.isAppInstalledFromGooglePlayStore(context, originalPackingName)
- ? originalPackingName : PACKAGE_NAME_NONE;
+ mBatteryOptimizeUtils =
+ new BatteryOptimizeUtils(
+ getContext(), getArguments().getInt(EXTRA_UID), packageName);
}
}
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailActivity.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailActivity.java
index 67f2323..3ef2c0c 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailActivity.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailActivity.java
@@ -29,14 +29,11 @@
import androidx.appcompat.app.AppCompatActivity;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
-/**
- * Trampoline activity for launching the {@link AdvancedPowerUsageDetail} fragment.
- */
+/** Trampoline activity for launching the {@link AdvancedPowerUsageDetail} fragment. */
public class AdvancedPowerUsageDetailActivity extends AppCompatActivity {
private static final String TAG = "AdvancedPowerDetailActivity";
diff --git a/src/com/android/settings/fuelgauge/AllowBackgroundPreferenceController.java b/src/com/android/settings/fuelgauge/AllowBackgroundPreferenceController.java
new file mode 100644
index 0000000..ab9a9e0
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/AllowBackgroundPreferenceController.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.PrimarySwitchPreference;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.widget.MainSwitchPreference;
+
+/** Controller to update the app background usage state */
+public class AllowBackgroundPreferenceController extends AbstractPreferenceController
+ implements PreferenceControllerMixin {
+
+ private static final String TAG = "AllowBackgroundPreferenceController";
+
+ @VisibleForTesting static final String KEY_ALLOW_BACKGROUND_USAGE = "allow_background_usage";
+
+ @VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
+
+ public AllowBackgroundPreferenceController(Context context, int uid, String packageName) {
+ super(context);
+ mBatteryOptimizeUtils = new BatteryOptimizeUtils(context, uid, packageName);
+ }
+
+ private void setChecked(Preference preference, boolean checked) {
+ if (preference instanceof PrimarySwitchPreference) {
+ ((PrimarySwitchPreference) preference).setChecked(checked);
+ } else if (preference instanceof MainSwitchPreference) {
+ ((MainSwitchPreference) preference).setChecked(checked);
+ }
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ preference.setEnabled(mBatteryOptimizeUtils.isOptimizeModeMutable());
+
+ final boolean isAllowBackground =
+ mBatteryOptimizeUtils.getAppOptimizationMode()
+ != BatteryOptimizeUtils.MODE_RESTRICTED;
+ setChecked(preference, isAllowBackground);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_ALLOW_BACKGROUND_USAGE;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ return getPreferenceKey().equals(preference.getKey());
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceController.java b/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceController.java
index 8ed4c54..318f230 100644
--- a/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceController.java
@@ -24,11 +24,9 @@
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
-/**
- * Controller to change and update the auto restriction toggle
- */
-public class AutoRestrictionPreferenceController extends BasePreferenceController implements
- Preference.OnPreferenceChangeListener {
+/** Controller to change and update the auto restriction toggle */
+public class AutoRestrictionPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
private static final String KEY_SMART_BATTERY = "auto_restriction";
private static final int ON = 1;
private static final int OFF = 0;
@@ -50,15 +48,20 @@
@Override
public void updateState(Preference preference) {
super.updateState(preference);
- final boolean smartBatteryOn = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON;
+ final boolean smartBatteryOn =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.APP_AUTO_RESTRICTION_ENABLED,
+ ON)
+ == ON;
((TwoStatePreference) preference).setChecked(smartBatteryOn);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean smartBatteryOn = (Boolean) newValue;
- Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
Settings.Global.APP_AUTO_RESTRICTION_ENABLED,
smartBatteryOn ? ON : OFF);
return true;
diff --git a/src/com/android/settings/fuelgauge/BatteryActiveView.java b/src/com/android/settings/fuelgauge/BatteryActiveView.java
index 4856b3d..a9aa6a4 100644
--- a/src/com/android/settings/fuelgauge/BatteryActiveView.java
+++ b/src/com/android/settings/fuelgauge/BatteryActiveView.java
@@ -63,13 +63,15 @@
return;
}
mPaint.setColor(color);
- canvas.drawRect(start / period * getWidth(), 0, end / period * getWidth(), getHeight(),
- mPaint);
+ canvas.drawRect(
+ start / period * getWidth(), 0, end / period * getWidth(), getHeight(), mPaint);
}
public interface BatteryActiveProvider {
boolean hasData();
+
long getPeriod();
+
SparseIntArray getColorArray();
}
}
diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
index 821501c..797b7ad 100644
--- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
+++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
@@ -52,6 +52,7 @@
public final class BatteryBackupHelper implements BackupHelper {
/** An inditifier for {@link BackupHelper}. */
public static final String TAG = "BatteryBackupHelper";
+
// Definition for the device build information.
public static final String KEY_BUILD_BRAND = "device_build_brand";
public static final String KEY_BUILD_PRODUCT = "device_build_product";
@@ -70,17 +71,12 @@
static final String DELIMITER_MODE = ":";
static final String KEY_OPTIMIZATION_LIST = "optimization_mode_list";
- @VisibleForTesting
- ArraySet<ApplicationInfo> mTestApplicationInfoList = null;
+ @VisibleForTesting ArraySet<ApplicationInfo> mTestApplicationInfoList = null;
- @VisibleForTesting
- PowerAllowlistBackend mPowerAllowlistBackend;
- @VisibleForTesting
- IDeviceIdleController mIDeviceIdleController;
- @VisibleForTesting
- IPackageManager mIPackageManager;
- @VisibleForTesting
- BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @VisibleForTesting PowerAllowlistBackend mPowerAllowlistBackend;
+ @VisibleForTesting IDeviceIdleController mIDeviceIdleController;
+ @VisibleForTesting IPackageManager mIPackageManager;
+ @VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
private byte[] mOptimizationModeBytes;
private boolean mVerifyMigrateConfiguration = false;
@@ -95,8 +91,8 @@
}
@Override
- public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
- ParcelFileDescriptor newState) {
+ public void performBackup(
+ ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) {
if (!isOwner() || data == null) {
Log.w(TAG, "ignore performBackup() for non-owner or empty data");
return;
@@ -149,8 +145,7 @@
}
@Override
- public void writeNewStateDescription(ParcelFileDescriptor newState) {
- }
+ public void writeNewStateDescription(ParcelFileDescriptor newState) {}
private List<String> getFullPowerList() {
final long timestamp = System.currentTimeMillis();
@@ -166,8 +161,11 @@
Log.w(TAG, "no data found in the getFullPowerList()");
return new ArrayList<>();
}
- Log.d(TAG, String.format("getFullPowerList() size=%d in %d/ms",
- allowlistedApps.length, (System.currentTimeMillis() - timestamp)));
+ Log.d(
+ TAG,
+ String.format(
+ "getFullPowerList() size=%d in %d/ms",
+ allowlistedApps.length, (System.currentTimeMillis() - timestamp)));
return Arrays.asList(allowlistedApps);
}
@@ -187,27 +185,34 @@
for (ApplicationInfo info : applications) {
final int mode = BatteryOptimizeUtils.getMode(appOps, info.uid, info.packageName);
@BatteryOptimizeUtils.OptimizationMode
- final int optimizationMode = BatteryOptimizeUtils.getAppOptimizationMode(
- mode, allowlistedApps.contains(info.packageName));
+ final int optimizationMode =
+ BatteryOptimizeUtils.getAppOptimizationMode(
+ mode, allowlistedApps.contains(info.packageName));
// Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
|| isSystemOrDefaultApp(info.packageName, info.uid)) {
continue;
}
- final String packageOptimizeMode =
- info.packageName + DELIMITER_MODE + optimizationMode;
+ final String packageOptimizeMode = info.packageName + DELIMITER_MODE + optimizationMode;
builder.append(packageOptimizeMode + DELIMITER);
Log.d(TAG, "backupOptimizationMode: " + packageOptimizeMode);
BatteryOptimizeLogUtils.writeLog(
- sharedPreferences, Action.BACKUP, info.packageName,
+ sharedPreferences,
+ Action.BACKUP,
+ info.packageName,
/* actionDescription */ "mode: " + optimizationMode);
backupCount++;
}
writeBackupData(data, KEY_OPTIMIZATION_LIST, builder.toString());
- Log.d(TAG, String.format("backup getInstalledApplications():%d count=%d in %d/ms",
- applications.size(), backupCount, (System.currentTimeMillis() - timestamp)));
+ Log.d(
+ TAG,
+ String.format(
+ "backup getInstalledApplications():%d count=%d in %d/ms",
+ applications.size(),
+ backupCount,
+ (System.currentTimeMillis() - timestamp)));
}
@VisibleForTesting
@@ -225,8 +230,8 @@
}
int restoreCount = 0;
for (int index = 0; index < appConfigurations.length; index++) {
- final String[] results = appConfigurations[index]
- .split(BatteryBackupHelper.DELIMITER_MODE);
+ final String[] results =
+ appConfigurations[index].split(BatteryBackupHelper.DELIMITER_MODE);
// Example format: com.android.systemui:2 we should have length=2
if (results == null || results.length != 2) {
Log.w(TAG, "invalid raw data found:" + appConfigurations[index]);
@@ -244,15 +249,17 @@
try {
optimizationMode = Integer.parseInt(results[1]);
} catch (NumberFormatException e) {
- Log.e(TAG, "failed to parse the optimization mode: "
- + appConfigurations[index], e);
+ Log.e(TAG, "failed to parse the optimization mode: " + appConfigurations[index], e);
continue;
}
restoreOptimizationMode(packageName, optimizationMode);
restoreCount++;
}
- Log.d(TAG, String.format("restoreOptimizationMode() count=%d in %d/ms",
- restoreCount, (System.currentTimeMillis() - timestamp)));
+ Log.d(
+ TAG,
+ String.format(
+ "restoreOptimizationMode() count=%d in %d/ms",
+ restoreCount, (System.currentTimeMillis() - timestamp)));
return restoreCount;
}
@@ -319,8 +326,9 @@
if (mIDeviceIdleController != null) {
return mIDeviceIdleController;
}
- mIDeviceIdleController = IDeviceIdleController.Stub.asInterface(
- ServiceManager.getService(DEVICE_IDLE_SERVICE));
+ mIDeviceIdleController =
+ IDeviceIdleController.Stub.asInterface(
+ ServiceManager.getService(DEVICE_IDLE_SERVICE));
return mIDeviceIdleController;
}
@@ -374,8 +382,7 @@
return dataBytes;
}
- private static void writeBackupData(
- BackupDataOutput data, String dataKey, String dataContent) {
+ private static void writeBackupData(BackupDataOutput data, String dataKey, String dataContent) {
if (dataContent == null || dataContent.isEmpty()) {
return;
}
diff --git a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
index 79ecd40..324f897 100644
--- a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
+++ b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
@@ -34,19 +34,19 @@
import java.lang.annotation.RetentionPolicy;
/**
- * Use this broadcastReceiver to listen to the battery change and it will invoke
- * {@link OnBatteryChangedListener}
+ * Use this broadcastReceiver to listen to the battery change and it will invoke {@link
+ * OnBatteryChangedListener}
*/
public class BatteryBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "BatteryBroadcastRcvr";
+
/**
- * Callback if any of the monitored fields has been changed:
- *
- * Battery level(e.g. 100%->99%)
- * Battery status(e.g. plugged->unplugged)
- * Battery saver(e.g. off->on)
- * Battery health(e.g. good->overheat)
+ * Callback if any of the monitored fields has been changed: <br>
+ * <br>
+ * Battery level(e.g. 100%->99%) Battery status(e.g. plugged->unplugged) <br>
+ * Battery saver(e.g.off->on) <br>
+ * Battery health(e.g. good->overheat) <br>
* Battery charging status(e.g. default->long life)
*/
public interface OnBatteryChangedListener {
@@ -54,13 +54,15 @@
}
@Retention(RetentionPolicy.SOURCE)
- @IntDef({BatteryUpdateType.MANUAL,
- BatteryUpdateType.BATTERY_LEVEL,
- BatteryUpdateType.BATTERY_SAVER,
- BatteryUpdateType.BATTERY_STATUS,
- BatteryUpdateType.BATTERY_HEALTH,
- BatteryUpdateType.CHARGING_STATUS,
- BatteryUpdateType.BATTERY_NOT_PRESENT})
+ @IntDef({
+ BatteryUpdateType.MANUAL,
+ BatteryUpdateType.BATTERY_LEVEL,
+ BatteryUpdateType.BATTERY_SAVER,
+ BatteryUpdateType.BATTERY_STATUS,
+ BatteryUpdateType.BATTERY_HEALTH,
+ BatteryUpdateType.CHARGING_STATUS,
+ BatteryUpdateType.BATTERY_NOT_PRESENT
+ })
public @interface BatteryUpdateType {
int MANUAL = 0;
int BATTERY_LEVEL = 1;
@@ -71,14 +73,10 @@
int BATTERY_NOT_PRESENT = 6;
}
- @VisibleForTesting
- String mBatteryLevel;
- @VisibleForTesting
- String mBatteryStatus;
- @VisibleForTesting
- int mChargingStatus;
- @VisibleForTesting
- int mBatteryHealth;
+ @VisibleForTesting String mBatteryLevel;
+ @VisibleForTesting String mBatteryStatus;
+ @VisibleForTesting int mChargingStatus;
+ @VisibleForTesting int mBatteryHealth;
private OnBatteryChangedListener mBatteryListener;
private Context mContext;
@@ -102,8 +100,8 @@
intentFilter.addAction(BatteryUtils.BYPASS_DOCK_DEFENDER_ACTION);
intentFilter.addAction(UsbManager.ACTION_USB_PORT_COMPLIANCE_CHANGED);
- final Intent intent = mContext.registerReceiver(this, intentFilter,
- Context.RECEIVER_EXPORTED);
+ final Intent intent =
+ mContext.registerReceiver(this, intentFilter, Context.RECEIVER_EXPORTED);
updateBatteryStatus(intent, true /* forceUpdate */);
}
@@ -121,10 +119,13 @@
final String batteryLevel = Utils.getBatteryPercentage(intent);
final String batteryStatus =
Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false);
- final int chargingStatus = intent.getIntExtra(
- BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT);
- final int batteryHealth = intent.getIntExtra(
- BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
+ final int chargingStatus =
+ intent.getIntExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS,
+ BatteryManager.CHARGING_POLICY_DEFAULT);
+ final int batteryHealth =
+ intent.getIntExtra(
+ BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
Log.d(
TAG,
"Battery changed: level: "
@@ -144,7 +145,7 @@
mBatteryListener.onBatteryChanged(BatteryUpdateType.CHARGING_STATUS);
} else if (batteryHealth != mBatteryHealth) {
mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH);
- } else if(!batteryLevel.equals(mBatteryLevel)) {
+ } else if (!batteryLevel.equals(mBatteryLevel)) {
mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL);
} else if (!batteryStatus.equals(mBatteryStatus)) {
mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_STATUS);
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index a8335a9..d0b57fd 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -34,21 +34,16 @@
import com.android.settingslib.Utils;
import com.android.settingslib.widget.UsageProgressBarPreference;
-/**
- * Controller that update the battery header view
- */
+/** Controller that update the battery header view */
public class BatteryHeaderPreferenceController extends BasePreferenceController
implements PreferenceControllerMixin, BatteryPreferenceController {
private static final String TAG = "BatteryHeaderPreferenceController";
- @VisibleForTesting
- static final String KEY_BATTERY_HEADER = "battery_header";
+ @VisibleForTesting static final String KEY_BATTERY_HEADER = "battery_header";
private static final int BATTERY_MAX_LEVEL = 100;
- @VisibleForTesting
- BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
- @VisibleForTesting
- UsageProgressBarPreference mBatteryUsageProgressBarPref;
+ @VisibleForTesting BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
+ @VisibleForTesting UsageProgressBarPreference mBatteryUsageProgressBarPref;
private BatteryTip mBatteryTip;
private final PowerManager mPowerManager;
@@ -56,8 +51,8 @@
public BatteryHeaderPreferenceController(Context context, String key) {
super(context, key);
mPowerManager = context.getSystemService(PowerManager.class);
- mBatteryStatusFeatureProvider = FeatureFactory.getFeatureFactory()
- .getBatteryStatusFeatureProvider();
+ mBatteryStatusFeatureProvider =
+ FeatureFactory.getFeatureFactory().getBatteryStatusFeatureProvider();
}
@Override
@@ -96,12 +91,11 @@
R.string.battery_state_and_duration, info.statusLabel, info.remainingLabel);
} else if (mPowerManager.isPowerSaveMode()) {
// Power save mode is on
- final String powerSaverOn = mContext.getString(
- R.string.battery_tip_early_heads_up_done_title);
+ final String powerSaverOn =
+ mContext.getString(R.string.battery_tip_early_heads_up_done_title);
return mContext.getString(
R.string.battery_state_and_duration, powerSaverOn, info.remainingLabel);
- } else if (mBatteryTip != null
- && mBatteryTip.getType() == BatteryTip.TipType.LOW_BATTERY) {
+ } else if (mBatteryTip != null && mBatteryTip.getType() == BatteryTip.TipType.LOW_BATTERY) {
// Low battery state
final String lowBattery = mContext.getString(R.string.low_battery_summary);
return mContext.getString(
@@ -122,9 +116,7 @@
mBatteryUsageProgressBarPref.setPercent(info.batteryLevel, BATTERY_MAX_LEVEL);
}
- /**
- * Callback which receives text for the summary line.
- */
+ /** Callback which receives text for the summary line. */
public void updateBatteryStatus(String label, BatteryInfo info) {
final CharSequence summary = label != null ? label : generateLabel(info);
mBatteryUsageProgressBarPref.setBottomSummary(summary);
@@ -132,8 +124,8 @@
}
public void quickUpdateHeaderPreference() {
- Intent batteryBroadcast = com.android.settingslib.fuelgauge.BatteryUtils
- .getBatteryIntent(mContext);
+ Intent batteryBroadcast =
+ com.android.settingslib.fuelgauge.BatteryUtils.getBatteryIntent(mContext);
final int batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
final boolean discharging =
batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0;
@@ -142,9 +134,7 @@
mBatteryUsageProgressBarPref.setPercent(batteryLevel, BATTERY_MAX_LEVEL);
}
- /**
- * Update summary when battery tips changed.
- */
+ /** Update summary when battery tips changed. */
public void updateHeaderByBatteryTips(BatteryTip batteryTip, BatteryInfo batteryInfo) {
mBatteryTip = batteryTip;
@@ -154,7 +144,8 @@
}
private CharSequence formatBatteryPercentageText(int batteryLevel) {
- return TextUtils.expandTemplate(mContext.getText(R.string.battery_header_title_alternate),
+ return TextUtils.expandTemplate(
+ mContext.getText(R.string.battery_header_title_alternate),
NumberFormat.getIntegerInstance().format(batteryLevel));
}
}
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index 50ce579..ea8ef8d 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -68,93 +68,110 @@
public void bindHistory(final UsageView view, BatteryDataParser... parsers) {
final Context context = view.getContext();
- BatteryDataParser parser = new BatteryDataParser() {
- SparseIntArray points = new SparseIntArray();
- long startTime;
- int lastTime = -1;
- byte lastLevel;
+ BatteryDataParser parser =
+ new BatteryDataParser() {
+ SparseIntArray mPoints = new SparseIntArray();
+ long mStartTime;
+ int mLastTime = -1;
+ byte mLastLevel;
- @Override
- public void onParsingStarted(long startTime, long endTime) {
- this.startTime = startTime;
- timePeriod = endTime - startTime;
- view.clearPaths();
- // Initially configure the graph for history only.
- view.configureGraph((int) timePeriod, 100);
- }
+ @Override
+ public void onParsingStarted(long startTime, long endTime) {
+ this.mStartTime = startTime;
+ timePeriod = endTime - startTime;
+ view.clearPaths();
+ // Initially configure the graph for history only.
+ view.configureGraph((int) timePeriod, 100);
+ }
- @Override
- public void onDataPoint(long time, HistoryItem record) {
- lastTime = (int) time;
- lastLevel = record.batteryLevel;
- points.put(lastTime, lastLevel);
- }
+ @Override
+ public void onDataPoint(long time, HistoryItem record) {
+ mLastTime = (int) time;
+ mLastLevel = record.batteryLevel;
+ mPoints.put(mLastTime, mLastLevel);
+ }
- @Override
- public void onDataGap() {
- if (points.size() > 1) {
- view.addPath(points);
- }
- points.clear();
- }
+ @Override
+ public void onDataGap() {
+ if (mPoints.size() > 1) {
+ view.addPath(mPoints);
+ }
+ mPoints.clear();
+ }
- @Override
- public void onParsingDone() {
- onDataGap();
+ @Override
+ public void onParsingDone() {
+ onDataGap();
- // Add projection if we have an estimate.
- if (remainingTimeUs != 0) {
- PowerUsageFeatureProvider provider =
- FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
- if (!mCharging && provider.isEnhancedBatteryPredictionEnabled(context)) {
- points = provider.getEnhancedBatteryPredictionCurve(context, startTime);
- } else {
- // Linear extrapolation.
- if (lastTime >= 0) {
- points.put(lastTime, lastLevel);
- points.put((int) (timePeriod +
- PowerUtil.convertUsToMs(remainingTimeUs)),
- mCharging ? 100 : 0);
+ // Add projection if we have an estimate.
+ if (remainingTimeUs != 0) {
+ PowerUsageFeatureProvider provider =
+ FeatureFactory.getFeatureFactory()
+ .getPowerUsageFeatureProvider();
+ if (!mCharging
+ && provider.isEnhancedBatteryPredictionEnabled(context)) {
+ mPoints =
+ provider.getEnhancedBatteryPredictionCurve(
+ context, mStartTime);
+ } else {
+ // Linear extrapolation.
+ if (mLastTime >= 0) {
+ mPoints.put(mLastTime, mLastLevel);
+ mPoints.put(
+ (int)
+ (timePeriod
+ + PowerUtil.convertUsToMs(
+ remainingTimeUs)),
+ mCharging ? 100 : 0);
+ }
+ }
+ }
+
+ // If we have a projection, reconfigure the graph to show it.
+ if (mPoints != null && mPoints.size() > 0) {
+ int maxTime = mPoints.keyAt(mPoints.size() - 1);
+ view.configureGraph(maxTime, 100);
+ view.addProjectedPath(mPoints);
}
}
- }
-
- // If we have a projection, reconfigure the graph to show it.
- if (points != null && points.size() > 0) {
- int maxTime = points.keyAt(points.size() - 1);
- view.configureGraph(maxTime, 100);
- view.addProjectedPath(points);
- }
- }
- };
+ };
BatteryDataParser[] parserList = new BatteryDataParser[parsers.length + 1];
for (int i = 0; i < parsers.length; i++) {
parserList[i] = parsers[i];
}
parserList[parsers.length] = parser;
parseBatteryHistory(parserList);
- String timeString = context.getString(com.android.settingslib.R.string.charge_length_format,
- Formatter.formatShortElapsedTime(context, timePeriod));
+ String timeString =
+ context.getString(
+ com.android.settingslib.R.string.charge_length_format,
+ Formatter.formatShortElapsedTime(context, timePeriod));
String remaining = "";
if (remainingTimeUs != 0) {
- remaining = context.getString(com.android.settingslib.R.string.remaining_length_format,
- Formatter.formatShortElapsedTime(context, remainingTimeUs / 1000));
+ remaining =
+ context.getString(
+ com.android.settingslib.R.string.remaining_length_format,
+ Formatter.formatShortElapsedTime(context, remainingTimeUs / 1000));
}
- view.setBottomLabels(new CharSequence[]{timeString, remaining});
+ view.setBottomLabels(new CharSequence[] {timeString, remaining});
}
- public static void getBatteryInfo(final Context context, final Callback callback,
- boolean shortString) {
- BatteryInfo.getBatteryInfo(context, callback, /* batteryUsageStats */ null, shortString);
+ /** Gets battery info */
+ public static void getBatteryInfo(
+ final Context context, final Callback callback, boolean shortString) {
+ BatteryInfo.getBatteryInfo(context, callback, /* batteryUsageStats */ null, shortString);
}
static long getSettingsChargeTimeRemaining(final Context context) {
return Settings.Global.getLong(
context.getContentResolver(),
- com.android.settingslib.fuelgauge.BatteryUtils.GLOBAL_TIME_TO_FULL_MILLIS, -1);
+ com.android.settingslib.fuelgauge.BatteryUtils.GLOBAL_TIME_TO_FULL_MILLIS,
+ -1);
}
- public static void getBatteryInfo(final Context context, final Callback callback,
+ /** Gets battery info */
+ public static void getBatteryInfo(
+ final Context context,
+ final Callback callback,
@Nullable final BatteryUsageStats batteryUsageStats,
boolean shortString) {
new AsyncTask<Void, Void, BatteryInfo>() {
@@ -166,8 +183,9 @@
stats = batteryUsageStats;
} else {
try {
- stats = context.getSystemService(BatteryStatsManager.class)
- .getBatteryUsageStats();
+ stats =
+ context.getSystemService(BatteryStatsManager.class)
+ .getBatteryUsageStats();
shouldCloseBatteryUsageStats = true;
} catch (RuntimeException e) {
Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e);
@@ -175,8 +193,7 @@
stats = new BatteryUsageStats.Builder(new String[0]).build();
}
}
- final BatteryInfo batteryInfo =
- getBatteryInfo(context, stats, shortString);
+ final BatteryInfo batteryInfo = getBatteryInfo(context, stats, shortString);
if (shouldCloseBatteryUsageStats) {
try {
stats.close();
@@ -196,23 +213,22 @@
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
- /**
- * Creates a BatteryInfo based on BatteryUsageStats
- */
+ /** Creates a BatteryInfo based on BatteryUsageStats */
@WorkerThread
- public static BatteryInfo getBatteryInfo(final Context context,
- @NonNull final BatteryUsageStats batteryUsageStats, boolean shortString) {
+ public static BatteryInfo getBatteryInfo(
+ final Context context,
+ @NonNull final BatteryUsageStats batteryUsageStats,
+ boolean shortString) {
final long batteryStatsTime = System.currentTimeMillis();
BatteryUtils.logRuntime(LOG_TAG, "time for getStats", batteryStatsTime);
final long startTime = System.currentTimeMillis();
PowerUsageFeatureProvider provider =
FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
- final long elapsedRealtimeUs =
- PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
+ final long elapsedRealtimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
- final Intent batteryBroadcast = context.registerReceiver(null,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ final Intent batteryBroadcast =
+ context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
// 0 means we are discharging, anything else means charging
final boolean discharging =
batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0;
@@ -221,40 +237,65 @@
Estimate estimate = provider.getEnhancedBatteryPrediction(context);
if (estimate != null) {
Estimate.storeCachedEstimate(context, estimate);
- BatteryUtils
- .logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime);
- return BatteryInfo.getBatteryInfo(context, batteryBroadcast, batteryUsageStats,
- estimate, elapsedRealtimeUs, shortString);
+ BatteryUtils.logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime);
+ return BatteryInfo.getBatteryInfo(
+ context,
+ batteryBroadcast,
+ batteryUsageStats,
+ estimate,
+ elapsedRealtimeUs,
+ shortString);
}
}
final long prediction = discharging ? batteryUsageStats.getBatteryTimeRemainingMs() : 0;
- final Estimate estimate = new Estimate(
- prediction,
- false, /* isBasedOnUsage */
- EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
+ final Estimate estimate =
+ new Estimate(
+ prediction,
+ false, /* isBasedOnUsage */
+ EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
BatteryUtils.logRuntime(LOG_TAG, "time for regular BatteryInfo", startTime);
- return BatteryInfo.getBatteryInfo(context, batteryBroadcast, batteryUsageStats,
- estimate, elapsedRealtimeUs, shortString);
+ return BatteryInfo.getBatteryInfo(
+ context,
+ batteryBroadcast,
+ batteryUsageStats,
+ estimate,
+ elapsedRealtimeUs,
+ shortString);
}
@WorkerThread
- public static BatteryInfo getBatteryInfoOld(Context context, Intent batteryBroadcast,
- BatteryUsageStats batteryUsageStats, long elapsedRealtimeUs, boolean shortString) {
- Estimate estimate = new Estimate(
- batteryUsageStats.getBatteryTimeRemainingMs(),
- false,
- EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
- return getBatteryInfo(context, batteryBroadcast, batteryUsageStats, estimate,
- elapsedRealtimeUs, shortString);
+ public static BatteryInfo getBatteryInfoOld(
+ Context context,
+ Intent batteryBroadcast,
+ BatteryUsageStats batteryUsageStats,
+ long elapsedRealtimeUs,
+ boolean shortString) {
+ Estimate estimate =
+ new Estimate(
+ batteryUsageStats.getBatteryTimeRemainingMs(),
+ false,
+ EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
+ return getBatteryInfo(
+ context,
+ batteryBroadcast,
+ batteryUsageStats,
+ estimate,
+ elapsedRealtimeUs,
+ shortString);
}
@WorkerThread
- public static BatteryInfo getBatteryInfo(Context context, Intent batteryBroadcast,
- @NonNull BatteryUsageStats batteryUsageStats, Estimate estimate,
- long elapsedRealtimeUs, boolean shortString) {
+ public static BatteryInfo getBatteryInfo(
+ Context context,
+ Intent batteryBroadcast,
+ @NonNull BatteryUsageStats batteryUsageStats,
+ Estimate estimate,
+ long elapsedRealtimeUs,
+ boolean shortString) {
final long startTime = System.currentTimeMillis();
- final boolean isCompactStatus = context.getResources().getBoolean(
- com.android.settings.R.bool.config_use_compact_battery_status);
+ final boolean isCompactStatus =
+ context.getResources()
+ .getBoolean(com.android.settings.R.bool.config_use_compact_battery_status);
BatteryInfo info = new BatteryInfo();
info.mBatteryUsageStats = batteryUsageStats;
info.batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
@@ -262,25 +303,32 @@
info.pluggedStatus = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
info.mCharging = info.pluggedStatus != 0;
info.averageTimeToDischarge = estimate.getAverageDischargeTime();
- info.isBatteryDefender = batteryBroadcast.getIntExtra(
- BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT)
- == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE;
+ info.isBatteryDefender =
+ batteryBroadcast.getIntExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS,
+ BatteryManager.CHARGING_POLICY_DEFAULT)
+ == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE;
info.statusLabel = Utils.getBatteryStatus(context, batteryBroadcast, isCompactStatus);
- info.batteryStatus = batteryBroadcast.getIntExtra(
- BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
+ info.batteryStatus =
+ batteryBroadcast.getIntExtra(
+ BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
if (!info.mCharging) {
updateBatteryInfoDischarging(context, shortString, estimate, info);
} else {
- updateBatteryInfoCharging(context, batteryBroadcast, batteryUsageStats,
- info, isCompactStatus);
+ updateBatteryInfoCharging(
+ context, batteryBroadcast, batteryUsageStats, info, isCompactStatus);
}
BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime);
return info;
}
- private static void updateBatteryInfoCharging(Context context, Intent batteryBroadcast,
- BatteryUsageStats stats, BatteryInfo info, boolean compactStatus) {
+ private static void updateBatteryInfoCharging(
+ Context context,
+ Intent batteryBroadcast,
+ BatteryUsageStats stats,
+ BatteryInfo info,
+ boolean compactStatus) {
final Resources resources = context.getResources();
final long chargeTimeMs = stats.getChargeTimeRemainingMs();
if (getSettingsChargeTimeRemaining(context) != chargeTimeMs) {
@@ -290,59 +338,76 @@
chargeTimeMs);
}
- final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
- BatteryManager.BATTERY_STATUS_UNKNOWN);
+ final int status =
+ batteryBroadcast.getIntExtra(
+ BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
info.discharging = false;
info.suggestionLabel = null;
int dockDefenderMode = BatteryUtils.getCurrentDockDefenderMode(context, info);
- if ((info.isBatteryDefender && status != BatteryManager.BATTERY_STATUS_FULL
- && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED)
+ if ((info.isBatteryDefender
+ && status != BatteryManager.BATTERY_STATUS_FULL
+ && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED)
|| dockDefenderMode == BatteryUtils.DockDefenderMode.ACTIVE) {
// Battery defender active, battery charging paused
info.remainingLabel = null;
int chargingLimitedResId = com.android.settingslib.R.string.power_charging_limited;
info.chargeLabel = context.getString(chargingLimitedResId, info.batteryPercentString);
- } else if ((chargeTimeMs > 0 && status != BatteryManager.BATTERY_STATUS_FULL
- && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED)
+ } else if ((chargeTimeMs > 0
+ && status != BatteryManager.BATTERY_STATUS_FULL
+ && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED)
|| dockDefenderMode == BatteryUtils.DockDefenderMode.TEMPORARILY_BYPASSED) {
// Battery is charging to full
info.remainingTimeUs = PowerUtil.convertMsToUs(chargeTimeMs);
- final CharSequence timeString = StringUtil.formatElapsedTime(context,
- (double) PowerUtil.convertUsToMs(info.remainingTimeUs), false /* withSeconds */,
- true /* collapseTimeUnit */);
+ final CharSequence timeString =
+ StringUtil.formatElapsedTime(
+ context,
+ (double) PowerUtil.convertUsToMs(info.remainingTimeUs),
+ false /* withSeconds */,
+ true /* collapseTimeUnit */);
int resId = com.android.settingslib.R.string.power_charging_duration;
- info.remainingLabel = chargeTimeMs <= 0 ? null : context.getString(
- com.android.settingslib.R.string.power_remaining_charging_duration_only,
- timeString);
- info.chargeLabel = chargeTimeMs <= 0 ? info.batteryPercentString
- : context.getString(resId, info.batteryPercentString, timeString);
+ info.remainingLabel =
+ chargeTimeMs <= 0
+ ? null
+ : context.getString(
+ com.android.settingslib.R.string
+ .power_remaining_charging_duration_only,
+ timeString);
+ info.chargeLabel =
+ chargeTimeMs <= 0
+ ? info.batteryPercentString
+ : context.getString(resId, info.batteryPercentString, timeString);
} else if (dockDefenderMode == BatteryUtils.DockDefenderMode.FUTURE_BYPASS) {
// Dock defender will be triggered in the future, charging will be optimized.
- info.chargeLabel = context.getString(
- com.android.settingslib.R.string.power_charging_future_paused,
- info.batteryPercentString);
+ info.chargeLabel =
+ context.getString(
+ com.android.settingslib.R.string.power_charging_future_paused,
+ info.batteryPercentString);
} else {
- final String chargeStatusLabel = Utils.getBatteryStatus(context, batteryBroadcast,
- compactStatus);
+ final String chargeStatusLabel =
+ Utils.getBatteryStatus(context, batteryBroadcast, compactStatus);
info.remainingLabel = null;
- info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString :
- resources.getString(com.android.settingslib.R.string.power_charging,
- info.batteryPercentString, chargeStatusLabel);
+ info.chargeLabel =
+ info.batteryLevel == 100
+ ? info.batteryPercentString
+ : resources.getString(
+ com.android.settingslib.R.string.power_charging,
+ info.batteryPercentString,
+ chargeStatusLabel);
}
}
- private static void updateBatteryInfoDischarging(Context context, boolean shortString,
- Estimate estimate, BatteryInfo info) {
+ private static void updateBatteryInfoDischarging(
+ Context context, boolean shortString, Estimate estimate, BatteryInfo info) {
final long drainTimeUs = PowerUtil.convertMsToUs(estimate.getEstimateMillis());
if (drainTimeUs > 0) {
info.remainingTimeUs = drainTimeUs;
- info.remainingLabel = PowerUtil.getBatteryRemainingShortStringFormatted(
- context,
- PowerUtil.convertUsToMs(drainTimeUs)
- );
+ info.remainingLabel =
+ PowerUtil.getBatteryRemainingShortStringFormatted(
+ context, PowerUtil.convertUsToMs(drainTimeUs));
info.chargeLabel = info.remainingLabel;
- info.suggestionLabel = PowerUtil.getBatteryTipStringFormatted(
- context, PowerUtil.convertUsToMs(drainTimeUs));
+ info.suggestionLabel =
+ PowerUtil.getBatteryTipStringFormatted(
+ context, PowerUtil.convertUsToMs(drainTimeUs));
} else {
info.remainingLabel = null;
info.suggestionLabel = null;
@@ -361,8 +426,8 @@
}
/**
- * Iterates over battery history included in the BatteryUsageStats that this object
- * was initialized with.
+ * Iterates over battery history included in the BatteryUsageStats that this object was
+ * initialized with.
*/
public void parseBatteryHistory(BatteryDataParser... parsers) {
long startWalltime = 0;
@@ -384,8 +449,7 @@
first = false;
historyStart = rec.time;
}
- if (rec.cmd == HistoryItem.CMD_CURRENT_TIME
- || rec.cmd == HistoryItem.CMD_RESET) {
+ if (rec.cmd == HistoryItem.CMD_CURRENT_TIME || rec.cmd == HistoryItem.CMD_RESET) {
// If there is a ridiculously large jump in time, then we won't be
// able to create a good chart with that data, so just ignore the
// times we got before and pretend like our data extends back from
@@ -447,7 +511,7 @@
if (rec.cmd != HistoryItem.CMD_OVERFLOW
&& (rec.cmd != HistoryItem.CMD_CURRENT_TIME
- || Math.abs(lastWalltime - curWalltime) > (60 * 60 * 1000))) {
+ || Math.abs(lastWalltime - curWalltime) > (60 * 60 * 1000))) {
for (int j = 0; j < parsers.length; j++) {
parsers[j].onDataGap();
}
diff --git a/src/com/android/settings/fuelgauge/BatteryInfoLoader.java b/src/com/android/settings/fuelgauge/BatteryInfoLoader.java
index ffee462..5ea94f8 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfoLoader.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfoLoader.java
@@ -26,11 +26,10 @@
* automatically grab enhanced battery estimates if available or fall back to the system estimate
* when not available.
*/
-public class BatteryInfoLoader extends AsyncLoaderCompat<BatteryInfo>{
+public class BatteryInfoLoader extends AsyncLoaderCompat<BatteryInfo> {
private static final String LOG_TAG = "BatteryInfoLoader";
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
public BatteryInfoLoader(Context context) {
super(context);
@@ -38,9 +37,7 @@
}
@Override
- protected void onDiscardResult(BatteryInfo result) {
-
- }
+ protected void onDiscardResult(BatteryInfo result) {}
@Override
public BatteryInfo loadInBackground() {
diff --git a/src/com/android/settings/fuelgauge/BatteryMeterView.java b/src/com/android/settings/fuelgauge/BatteryMeterView.java
index 1cd9f71..ecd8a1b 100644
--- a/src/com/android/settings/fuelgauge/BatteryMeterView.java
+++ b/src/com/android/settings/fuelgauge/BatteryMeterView.java
@@ -29,14 +29,10 @@
import com.android.settingslib.graph.ThemedBatteryDrawable;
public class BatteryMeterView extends ImageView {
- @VisibleForTesting
- BatteryMeterDrawable mDrawable;
- @VisibleForTesting
- ColorFilter mErrorColorFilter;
- @VisibleForTesting
- ColorFilter mAccentColorFilter;
- @VisibleForTesting
- ColorFilter mForegroundColorFilter;
+ @VisibleForTesting BatteryMeterDrawable mDrawable;
+ @VisibleForTesting ColorFilter mErrorColorFilter;
+ @VisibleForTesting ColorFilter mAccentColorFilter;
+ @VisibleForTesting ColorFilter mForegroundColorFilter;
public BatteryMeterView(Context context) {
this(context, null, 0);
@@ -51,12 +47,15 @@
final int frameColor =
context.getColor(com.android.settingslib.R.color.meter_background_color);
- mAccentColorFilter = Utils.getAlphaInvariantColorFilterForColor(
- Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent));
- mErrorColorFilter = Utils.getAlphaInvariantColorFilterForColor(
- context.getColor(R.color.battery_icon_color_error));
- mForegroundColorFilter = Utils.getAlphaInvariantColorFilterForColor(
- Utils.getColorAttrDefaultColor(context, android.R.attr.colorForeground));
+ mAccentColorFilter =
+ Utils.getAlphaInvariantColorFilterForColor(
+ Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent));
+ mErrorColorFilter =
+ Utils.getAlphaInvariantColorFilterForColor(
+ context.getColor(R.color.battery_icon_color_error));
+ mForegroundColorFilter =
+ Utils.getAlphaInvariantColorFilterForColor(
+ Utils.getColorAttrDefaultColor(context, android.R.attr.colorForeground));
mDrawable = new BatteryMeterDrawable(context, frameColor);
mDrawable.setColorFilter(mAccentColorFilter);
setImageDrawable(mDrawable);
@@ -108,10 +107,10 @@
public BatteryMeterDrawable(Context context, int frameColor) {
super(context, frameColor);
- mIntrinsicWidth = context.getResources()
- .getDimensionPixelSize(R.dimen.battery_meter_width);
- mIntrinsicHeight = context.getResources()
- .getDimensionPixelSize(R.dimen.battery_meter_height);
+ mIntrinsicWidth =
+ context.getResources().getDimensionPixelSize(R.dimen.battery_meter_width);
+ mIntrinsicHeight =
+ context.getResources().getDimensionPixelSize(R.dimen.battery_meter_height);
}
public BatteryMeterDrawable(Context context, int frameColor, int width, int height) {
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtils.java
index d093d35..afdae8e 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtils.java
@@ -34,8 +34,7 @@
private static final String BATTERY_OPTIMIZE_FILE_NAME = "battery_optimize_historical_logs";
private static final String LOGS_KEY = "battery_optimize_logs_key";
- @VisibleForTesting
- static final int MAX_ENTRIES = 40;
+ @VisibleForTesting static final int MAX_ENTRIES = 40;
private BatteryOptimizeLogUtils() {}
@@ -45,8 +44,11 @@
writeLog(getSharedPreferences(context), action, packageName, actionDescription);
}
- static void writeLog(SharedPreferences sharedPreferences, Action action,
- String packageName, String actionDescription) {
+ static void writeLog(
+ SharedPreferences sharedPreferences,
+ Action action,
+ String packageName,
+ String actionDescription) {
writeLog(
sharedPreferences,
BatteryOptimizeHistoricalLogEntry.newBuilder()
@@ -70,10 +72,7 @@
String loggingContent =
Base64.encodeToString(newLogBuilder.build().toByteArray(), Base64.DEFAULT);
- sharedPreferences
- .edit()
- .putString(LOGS_KEY, loggingContent)
- .apply();
+ sharedPreferences.edit().putString(LOGS_KEY, loggingContent).apply();
}
private static BatteryOptimizeHistoricalLog parseLogFromString(String storedLogs) {
@@ -107,9 +106,11 @@
}
private static String toString(BatteryOptimizeHistoricalLogEntry entry) {
- return String.format("%s\t%s\taction:%s\tevent:%s",
+ return String.format(
+ "%s\t%s\taction:%s\tevent:%s",
ConvertUtils.utcToLocalTimeForLogging(entry.getTimestamp()),
- entry.getPackageName(), entry.getAction(),
+ entry.getPackageName(),
+ entry.getAction(),
entry.getActionDescription());
}
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
index 7b3a6ad..2924f54 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
@@ -62,11 +62,11 @@
// If current user is admin, match apps from all users. Otherwise, only match the currect user.
private static final int RETRIEVE_FLAG_ADMIN =
PackageManager.MATCH_ANY_USER
- | PackageManager.MATCH_DISABLED_COMPONENTS
- | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
+ | PackageManager.MATCH_DISABLED_COMPONENTS
+ | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
private static final int RETRIEVE_FLAG =
PackageManager.MATCH_DISABLED_COMPONENTS
- | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
+ | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
// Optimization modes.
static final int MODE_UNKNOWN = 0;
@@ -74,12 +74,14 @@
static final int MODE_UNRESTRICTED = 2;
static final int MODE_OPTIMIZED = 3;
- @IntDef(prefix = {"MODE_"}, value = {
- MODE_UNKNOWN,
- MODE_RESTRICTED,
- MODE_UNRESTRICTED,
- MODE_OPTIMIZED,
- })
+ @IntDef(
+ prefix = {"MODE_"},
+ value = {
+ MODE_UNKNOWN,
+ MODE_RESTRICTED,
+ MODE_UNRESTRICTED,
+ MODE_OPTIMIZED,
+ })
@Retention(RetentionPolicy.SOURCE)
static @interface OptimizationMode {}
@@ -118,8 +120,12 @@
/** Resets optimization mode for all applications. */
public static void resetAppOptimizationMode(
Context context, IPackageManager ipm, AppOpsManager aom) {
- resetAppOptimizationMode(context, ipm, aom,
- PowerAllowlistBackend.getInstance(context), BatteryUtils.getInstance(context));
+ resetAppOptimizationMode(
+ context,
+ ipm,
+ aom,
+ PowerAllowlistBackend.getInstance(context),
+ BatteryUtils.getInstance(context));
}
/** Sets the {@link OptimizationMode} for associated app. */
@@ -138,17 +144,27 @@
|| mBatteryUtils.getPackageUid(mPackageName) == BatteryUtils.UID_NULL;
}
- /**
- * Return {@code true} if this package is system or default active app.
- */
+ /** Return {@code true} if this package is system or default active app. */
public boolean isSystemOrDefaultApp() {
mPowerAllowListBackend.refreshList();
return isSystemOrDefaultApp(mContext, mPowerAllowListBackend, mPackageName, mUid);
}
+ /** Return {@code true} if the optimization mode of this package can be changed */
+ public boolean isOptimizeModeMutable() {
+ return !isDisabledForOptimizeModeOnly() && !isSystemOrDefaultApp();
+ }
+
/**
- * Gets the list of installed applications.
- */
+ * Return {@code true} if the optimization mode is mutable and current state is not restricted
+ */
+ public boolean isSelectorPreferenceEnabled() {
+ // Enable the preference if apps are not set into restricted mode, otherwise disable it
+ return isOptimizeModeMutable()
+ && getAppOptimizationMode() != BatteryOptimizeUtils.MODE_RESTRICTED;
+ }
+
+ /** Gets the list of installed applications. */
public static ArraySet<ApplicationInfo> getInstalledApplications(
Context context, IPackageManager ipm) {
final ArraySet<ApplicationInfo> applications = new ArraySet<>();
@@ -156,9 +172,10 @@
for (UserInfo userInfo : um.getProfiles(UserHandle.myUserId())) {
try {
@SuppressWarnings("unchecked")
- final ParceledListSlice<ApplicationInfo> infoList = ipm.getInstalledApplications(
- userInfo.isAdmin() ? RETRIEVE_FLAG_ADMIN : RETRIEVE_FLAG,
- userInfo.id);
+ final ParceledListSlice<ApplicationInfo> infoList =
+ ipm.getInstalledApplications(
+ userInfo.isAdmin() ? RETRIEVE_FLAG_ADMIN : RETRIEVE_FLAG,
+ userInfo.id);
if (infoList != null) {
applications.addAll(infoList.getList());
}
@@ -169,15 +186,19 @@
}
// Removes the application which is disabled by the system.
applications.removeIf(
- info -> info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
- && !info.enabled);
+ info ->
+ info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
+ && !info.enabled);
return applications;
}
@VisibleForTesting
static void resetAppOptimizationMode(
- Context context, IPackageManager ipm, AppOpsManager aom,
- PowerAllowlistBackend allowlistBackend, BatteryUtils batteryUtils) {
+ Context context,
+ IPackageManager ipm,
+ AppOpsManager aom,
+ PowerAllowlistBackend allowlistBackend,
+ BatteryUtils batteryUtils) {
final ArraySet<ApplicationInfo> applications = getInstalledApplications(context, ipm);
if (applications == null || applications.isEmpty()) {
Log.w(TAG, "no data found in the getInstalledApplications()");
@@ -187,11 +208,13 @@
allowlistBackend.refreshList();
// Resets optimization mode for each application.
for (ApplicationInfo info : applications) {
- final int mode = aom.checkOpNoThrow(
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName);
+ final int mode =
+ aom.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName);
@OptimizationMode
- final int optimizationMode = getAppOptimizationMode(
- mode, allowlistBackend.isAllowlisted(info.packageName, info.uid));
+ final int optimizationMode =
+ getAppOptimizationMode(
+ mode, allowlistBackend.isAllowlisted(info.packageName, info.uid));
// Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == MODE_OPTIMIZED
|| optimizationMode == MODE_UNKNOWN
@@ -201,8 +224,14 @@
}
// Resets to the default mode: MODE_OPTIMIZED.
- setAppUsageStateInternal(context, MODE_OPTIMIZED, info.uid, info.packageName,
- batteryUtils, allowlistBackend, Action.RESET);
+ setAppUsageStateInternal(
+ context,
+ MODE_OPTIMIZED,
+ info.uid,
+ info.packageName,
+ batteryUtils,
+ allowlistBackend,
+ Action.RESET);
}
}
@@ -228,25 +257,33 @@
static List<String> getForceBatteryOptimizeModeList(Context context) {
if (sBatteryOptimizeModeList == null) {
- sBatteryOptimizeModeList = Arrays.asList(
- context.getResources().getStringArray(
- R.array.config_force_battery_optimize_mode_apps));
+ sBatteryOptimizeModeList =
+ Arrays.asList(
+ context.getResources()
+ .getStringArray(
+ R.array.config_force_battery_optimize_mode_apps));
}
return sBatteryOptimizeModeList;
}
static List<String> getForceBatteryUnrestrictModeList(Context context) {
if (sBatteryUnrestrictModeList == null) {
- sBatteryUnrestrictModeList = Arrays.asList(
- context.getResources().getStringArray(
- R.array.config_force_battery_unrestrict_mode_apps));
+ sBatteryUnrestrictModeList =
+ Arrays.asList(
+ context.getResources()
+ .getStringArray(
+ R.array.config_force_battery_unrestrict_mode_apps));
}
return sBatteryUnrestrictModeList;
}
private static void setAppUsageStateInternal(
- Context context, @OptimizationMode int mode, int uid, String packageName,
- BatteryUtils batteryUtils, PowerAllowlistBackend powerAllowlistBackend,
+ Context context,
+ @OptimizationMode int mode,
+ int uid,
+ String packageName,
+ BatteryUtils batteryUtils,
+ PowerAllowlistBackend powerAllowlistBackend,
Action action) {
if (mode == MODE_UNKNOWN) {
Log.d(TAG, "set unknown app optimization mode.");
@@ -260,16 +297,29 @@
mode == MODE_RESTRICTED ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED;
final boolean allowListed = mode == MODE_UNRESTRICTED;
- setAppOptimizationModeInternal(context, appOpsManagerMode, allowListed, uid,
- packageName, batteryUtils, powerAllowlistBackend, action);
+ setAppOptimizationModeInternal(
+ context,
+ appOpsManagerMode,
+ allowListed,
+ uid,
+ packageName,
+ batteryUtils,
+ powerAllowlistBackend,
+ action);
}
private static void setAppOptimizationModeInternal(
- Context context, int appStandbyMode, boolean allowListed, int uid, String packageName,
- BatteryUtils batteryUtils, PowerAllowlistBackend powerAllowlistBackend,
+ Context context,
+ int appStandbyMode,
+ boolean allowListed,
+ int uid,
+ String packageName,
+ BatteryUtils batteryUtils,
+ PowerAllowlistBackend powerAllowlistBackend,
Action action) {
- final String packageNameKey = BatteryOptimizeLogUtils
- .getPackageNameWithUserId(packageName, UserHandle.myUserId());
+ final String packageNameKey =
+ BatteryOptimizeLogUtils.getPackageNameWithUserId(
+ packageName, UserHandle.myUserId());
try {
batteryUtils.setForceAppStandby(uid, packageName, appStandbyMode);
if (allowListed) {
@@ -283,24 +333,27 @@
Log.e(TAG, "set OPTIMIZATION MODE failed for " + packageName, e);
}
BatteryOptimizeLogUtils.writeLog(
- context,
- action,
- packageNameKey,
- createLogEvent(appStandbyMode, allowListed));
+ context, action, packageNameKey, createLogEvent(appStandbyMode, allowListed));
}
private void refreshState() {
mPowerAllowListBackend.refreshList();
mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName, mUid);
- mMode = mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mPackageName);
- Log.d(TAG, String.format("refresh %s state, allowlisted = %s, mode = %d",
- mPackageName, mAllowListed, mMode));
+ mMode =
+ mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mPackageName);
+ Log.d(
+ TAG,
+ String.format(
+ "refresh %s state, allowlisted = %s, mode = %d",
+ mPackageName, mAllowListed, mMode));
}
private static String createLogEvent(int appStandbyMode, boolean allowListed) {
- return appStandbyMode < 0 ? "Apply optimize setting ERROR" :
- String.format("\tStandbyMode: %s, allowListed: %s, mode: %s",
+ return appStandbyMode < 0
+ ? "Apply optimize setting ERROR"
+ : String.format(
+ "\tStandbyMode: %s, allowListed: %s, mode: %s",
appStandbyMode,
allowListed,
getAppOptimizationMode(appStandbyMode, allowListed));
diff --git a/src/com/android/settings/fuelgauge/BatteryPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryPreferenceController.java
index badf5c8..08ad1d1 100644
--- a/src/com/android/settings/fuelgauge/BatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryPreferenceController.java
@@ -16,15 +16,12 @@
package com.android.settings.fuelgauge;
-/**
- * Common interface for a preference controller that updates battery status
- */
+/** 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.
+ * 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/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index c712ab0..70abfbc 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -35,22 +35,20 @@
import com.android.settingslib.core.lifecycle.events.OnStop;
import com.android.settingslib.fuelgauge.BatterySaverUtils;
-/**
- * Controller to update the battery saver entry preference.
- */
+/** Controller to update the battery saver entry preference. */
public class BatterySaverController extends BasePreferenceController
implements LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
private static final String KEY_BATTERY_SAVER = "battery_saver_summary";
private final BatterySaverReceiver mBatteryStateChangeReceiver;
private final PowerManager mPowerManager;
private Preference mBatterySaverPref;
- private final ContentObserver mObserver = new ContentObserver(
- new Handler(Looper.getMainLooper())) {
- @Override
- public void onChange(boolean selfChange) {
- updateSummary();
- }
- };
+ private final ContentObserver mObserver =
+ new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateSummary();
+ }
+ };
public BatterySaverController(Context context) {
super(context, KEY_BATTERY_SAVER);
@@ -79,9 +77,11 @@
@Override
public void onStart() {
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
- true /* notifyForDescendants */, mObserver);
+ mContext.getContentResolver()
+ .registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
+ true /* notifyForDescendants */,
+ mObserver);
mBatteryStateChangeReceiver.setListening(true);
updateSummary();
@@ -101,15 +101,20 @@
}
final ContentResolver resolver = mContext.getContentResolver();
- final int mode = Settings.Global.getInt(resolver,
- Global.AUTOMATIC_POWER_SAVE_MODE, PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+ final int mode =
+ Settings.Global.getInt(
+ resolver,
+ Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
if (mode == PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE) {
- final int percent = Settings.Global.getInt(resolver,
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- return percent != 0 ?
- mContext.getString(R.string.battery_saver_off_scheduled_summary,
- Utils.formatPercentage(percent)) :
- mContext.getString(R.string.battery_saver_off_summary);
+ final int percent =
+ Settings.Global.getInt(
+ resolver, Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ return percent != 0
+ ? mContext.getString(
+ R.string.battery_saver_off_scheduled_summary,
+ Utils.formatPercentage(percent))
+ : mContext.getString(R.string.battery_saver_off_summary);
} else {
return mContext.getString(R.string.battery_saver_pref_auto_routine_summary);
}
@@ -127,6 +132,5 @@
}
@Override
- public void onBatteryChanged(boolean pluggedIn) {
- }
+ public void onBatteryChanged(boolean pluggedIn) {}
}
diff --git a/src/com/android/settings/fuelgauge/BatterySaverDrawable.java b/src/com/android/settings/fuelgauge/BatterySaverDrawable.java
index ce29361..bde1335 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverDrawable.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverDrawable.java
@@ -23,9 +23,7 @@
import com.android.settingslib.Utils;
import com.android.settingslib.graph.BatteryMeterDrawableBase;
-/**
- * Drawable that shows a static battery saver icon - a full battery symbol and a plus sign.
- */
+/** Drawable that shows a static battery saver icon - a full battery symbol and a plus sign. */
public class BatterySaverDrawable extends BatteryMeterDrawableBase {
private static final int MAX_BATTERY = 100;
diff --git a/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java b/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java
index c4e5ce6..fb12dbe 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java
@@ -27,8 +27,8 @@
import com.android.settingslib.fuelgauge.BatterySaverUtils;
/**
- * Activity for modifying the {@link android.os.PowerManager} power save mode
- * setting using the Voice Interaction API.
+ * Activity for modifying the {@link android.os.PowerManager} power save mode setting using the
+ * Voice Interaction API.
*/
public class BatterySaverModeVoiceActivity extends VoiceSettingsActivity {
private static final String TAG = "BatterySaverModeVoiceActivity";
@@ -36,9 +36,11 @@
@Override
protected boolean onVoiceSettingInteraction(Intent intent) {
if (intent.hasExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED)) {
- if (BatterySaverUtils.setPowerSaveMode(this,
+ if (BatterySaverUtils.setPowerSaveMode(
+ this,
intent.getBooleanExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED, false),
- /*needFirstTimeWarning=*/ true, SAVER_ENABLED_VOICE)) {
+ /* needFirstTimeWarning= */ true,
+ SAVER_ENABLED_VOICE)) {
notifySuccess(null);
} else {
Log.v(TAG, "Unable to set power mode");
diff --git a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
index bf5c51b..7537c54 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
@@ -71,6 +71,7 @@
public interface BatterySaverListener {
void onPowerSaveModeChanged();
+
void onBatteryChanged(boolean pluggedIn);
}
}
diff --git a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java
index b41e153..5d9d047 100644
--- a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java
+++ b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java
@@ -34,8 +34,7 @@
public final class BatterySettingsMigrateChecker extends BroadcastReceiver {
private static final String TAG = "BatterySettingsMigrateChecker";
- @VisibleForTesting
- static BatteryOptimizeUtils sBatteryOptimizeUtils = null;
+ @VisibleForTesting static BatteryOptimizeUtils sBatteryOptimizeUtils = null;
@Override
public void onReceive(Context context, Intent intent) {
@@ -71,31 +70,38 @@
Context context,
@BatteryOptimizeUtils.OptimizationMode int optimizationMode,
List<String> allowList) {
- allowList.forEach(packageName -> {
- final BatteryOptimizeUtils batteryOptimizeUtils =
- BatteryBackupHelper.newBatteryOptimizeUtils(context, packageName,
- /* testOptimizeUtils */ sBatteryOptimizeUtils);
- if (batteryOptimizeUtils == null) {
- return;
- }
- if (batteryOptimizeUtils.getAppOptimizationMode() != optimizationMode) {
- Log.w(TAG, "Reset " + packageName + " battery mode into " + optimizationMode);
- batteryOptimizeUtils.setAppUsageState(
- optimizationMode,
- BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET);
- }
- });
+ allowList.forEach(
+ packageName -> {
+ final BatteryOptimizeUtils batteryOptimizeUtils =
+ BatteryBackupHelper.newBatteryOptimizeUtils(
+ context,
+ packageName,
+ /* testOptimizeUtils */ sBatteryOptimizeUtils);
+ if (batteryOptimizeUtils == null) {
+ return;
+ }
+ if (batteryOptimizeUtils.getAppOptimizationMode() != optimizationMode) {
+ Log.w(
+ TAG,
+ "Reset " + packageName + " battery mode into " + optimizationMode);
+ batteryOptimizeUtils.setAppUsageState(
+ optimizationMode,
+ BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET);
+ }
+ });
}
static void verifySaverConfiguration(Context context) {
Log.d(TAG, "invoke verifySaverConfiguration()");
final ContentResolver resolver = context.getContentResolver();
- final int threshold = Settings.Global.getInt(resolver,
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ final int threshold =
+ Settings.Global.getInt(resolver, Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
// Force refine the invalid scheduled battery level.
if (threshold < BatterySaverScheduleRadioButtonsController.TRIGGER_LEVEL_MIN
&& threshold > 0) {
- Settings.Global.putInt(resolver, Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
+ Settings.Global.putInt(
+ resolver,
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
BatterySaverScheduleRadioButtonsController.TRIGGER_LEVEL_MIN);
Log.w(TAG, "Reset invalid scheduled battery level from: " + threshold);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java
index 46f00c7..b6b3b35 100644
--- a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java
@@ -16,14 +16,9 @@
package com.android.settings.fuelgauge;
-/**
- * Feature Provider used to retrieve battery status
- */
+/** Feature Provider used to retrieve battery status */
public interface BatteryStatusFeatureProvider {
- /**
- * Trigger a battery status update; return false if built-in status should be used.
- */
- boolean triggerBatteryStatusUpdate(
- BatteryPreferenceController controller, BatteryInfo info);
+ /** Trigger a battery status update; return false if built-in status should be used. */
+ boolean triggerBatteryStatusUpdate(BatteryPreferenceController controller, BatteryInfo info);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java
index dc4b5db..11c4628 100644
--- a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java
@@ -18,9 +18,7 @@
import android.content.Context;
-/**
- * Used to override battery status string in Battery Header.
- */
+/** Used to override battery status string in Battery Header. */
public class BatteryStatusFeatureProviderImpl implements BatteryStatusFeatureProvider {
protected Context mContext;
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 3b958ae..5a808f2 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -70,15 +70,15 @@
import java.time.format.FormatStyle;
import java.util.List;
-/**
- * Utils for battery operation
- */
+/** Utils for battery operation */
public class BatteryUtils {
public static final int UID_ZERO = 0;
public static final int UID_NULL = -1;
public static final int SDK_NULL = -1;
+
/** Special UID value for data usage by removed apps. */
public static final int UID_REMOVED_APPS = -4;
+
/** Special UID value for data usage by tethering. */
public static final int UID_TETHERING = -5;
@@ -88,13 +88,10 @@
public static final String BYPASS_DOCK_DEFENDER_ACTION = "battery.dock.defender.bypass";
private static final String GOOGLE_PLAY_STORE_PACKAGE = "com.android.vending";
+ private static final String PACKAGE_NAME_NONE = "none";
@Retention(RetentionPolicy.SOURCE)
- @IntDef({StatusType.SCREEN_USAGE,
- StatusType.FOREGROUND,
- StatusType.BACKGROUND,
- StatusType.ALL
- })
+ @IntDef({StatusType.SCREEN_USAGE, StatusType.FOREGROUND, StatusType.BACKGROUND, StatusType.ALL})
public @interface StatusType {
int SCREEN_USAGE = 0;
int FOREGROUND = 1;
@@ -103,10 +100,12 @@
}
@Retention(RetentionPolicy.SOURCE)
- @IntDef({DockDefenderMode.FUTURE_BYPASS,
- DockDefenderMode.ACTIVE,
- DockDefenderMode.TEMPORARILY_BYPASSED,
- DockDefenderMode.DISABLED})
+ @IntDef({
+ DockDefenderMode.FUTURE_BYPASS,
+ DockDefenderMode.ACTIVE,
+ DockDefenderMode.TEMPORARILY_BYPASSED,
+ DockDefenderMode.DISABLED
+ })
public @interface DockDefenderMode {
int FUTURE_BYPASS = 0;
int ACTIVE = 1;
@@ -121,8 +120,7 @@
private AppOpsManager mAppOpsManager;
private Context mContext;
- @VisibleForTesting
- PowerUsageFeatureProvider mPowerUsageFeatureProvider;
+ @VisibleForTesting PowerUsageFeatureProvider mPowerUsageFeatureProvider;
public static BatteryUtils getInstance(Context context) {
if (sInstance == null || sInstance.isDataCorrupted()) {
@@ -140,8 +138,15 @@
FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
}
- public long getProcessTimeMs(@StatusType int type, @Nullable BatteryStats.Uid uid,
- int which) {
+ /** For test to reset single instance. */
+ @VisibleForTesting
+ public void reset() {
+ sInstance = null;
+ }
+
+
+ /** Gets the process time */
+ public long getProcessTimeMs(@StatusType int type, @Nullable BatteryStats.Uid uid, int which) {
if (uid == null) {
return 0;
}
@@ -185,8 +190,9 @@
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
- final long timeUs = uid.getProcessStateTime(
- BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
+ final long timeUs =
+ uid.getProcessStateTime(
+ BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
Log.v(TAG, "background time(us): " + timeUs);
@@ -200,17 +206,17 @@
}
/**
- * Returns true if the specified battery consumer should be excluded from the summary
- * battery consumption list.
+ * Returns true if the specified battery consumer should be excluded from the summary battery
+ * consumption list.
*/
public boolean shouldHideUidBatteryConsumer(UidBatteryConsumer consumer) {
- return shouldHideUidBatteryConsumer(consumer,
- mPackageManager.getPackagesForUid(consumer.getUid()));
+ return shouldHideUidBatteryConsumer(
+ consumer, mPackageManager.getPackagesForUid(consumer.getUid()));
}
/**
- * Returns true if the specified battery consumer should be excluded from the summary
- * battery consumption list.
+ * Returns true if the specified battery consumer should be excluded from the summary battery
+ * consumption list.
*/
public boolean shouldHideUidBatteryConsumer(UidBatteryConsumer consumer, String[] packages) {
return mPowerUsageFeatureProvider.isTypeSystem(consumer.getUid(), packages)
@@ -218,20 +224,16 @@
}
/**
- * Returns true if the specified battery consumer should be excluded from
- * battery consumption lists, either short or full.
+ * Returns true if the specified battery consumer should be excluded from battery consumption
+ * lists, either short or full.
*/
- public boolean shouldHideUidBatteryConsumerUnconditionally(UidBatteryConsumer consumer,
- String[] packages) {
+ public boolean shouldHideUidBatteryConsumerUnconditionally(
+ UidBatteryConsumer consumer, String[] packages) {
final int uid = consumer.getUid();
- return uid == UID_TETHERING
- ? false
- : uid < 0 || isHiddenSystemModule(packages);
+ return uid == UID_TETHERING ? false : uid < 0 || isHiddenSystemModule(packages);
}
- /**
- * Returns true if one the specified packages belongs to a hidden system module.
- */
+ /** Returns true if one the specified packages belongs to a hidden system module. */
public boolean isHiddenSystemModule(String[] packages) {
if (packages != null) {
for (int i = 0, length = packages.length; i < length; i++) {
@@ -246,14 +248,14 @@
/**
* Calculate the power usage percentage for an app
*
- * @param powerUsageMah power used by the app
- * @param totalPowerMah total power used in the system
+ * @param powerUsageMah power used by the app
+ * @param totalPowerMah total power used in the system
* @param dischargeAmount The discharge amount calculated by {@link BatteryStats}
* @return A percentage value scaled by {@paramref dischargeAmount}
* @see BatteryStats#getDischargeAmount(int)
*/
- public double calculateBatteryPercent(double powerUsageMah, double totalPowerMah,
- int dischargeAmount) {
+ public double calculateBatteryPercent(
+ double powerUsageMah, double totalPowerMah, int dischargeAmount) {
if (totalPowerMah == 0) {
return 0;
}
@@ -265,9 +267,8 @@
* Find the package name for a {@link android.os.BatteryStats.Uid}
*
* @param uid id to get the package name
- * @return the package name. If there are multiple packages related to
- * given id, return the first one. Or return null if there are no known
- * packages with the given id
+ * @return the package name. If there are multiple packages related to given id, return the
+ * first one. Or return null if there are no known packages with the given id
* @see PackageManager#getPackagesForUid(int)
*/
public String getPackageName(int uid) {
@@ -283,8 +284,8 @@
*/
public int getTargetSdkVersion(final String packageName) {
try {
- ApplicationInfo info = mPackageManager.getApplicationInfo(packageName,
- PackageManager.GET_META_DATA);
+ ApplicationInfo info =
+ mPackageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
return info.targetSdkVersion;
} catch (PackageManager.NameNotFoundException e) {
@@ -294,28 +295,26 @@
return SDK_NULL;
}
- /**
- * Check whether background restriction is enabled
- */
- public boolean isBackgroundRestrictionEnabled(final int targetSdkVersion, final int uid,
- final String packageName) {
+ /** Check whether background restriction is enabled */
+ public boolean isBackgroundRestrictionEnabled(
+ final int targetSdkVersion, final int uid, final String packageName) {
if (targetSdkVersion >= Build.VERSION_CODES.O) {
return true;
}
- final int mode = mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName);
+ final int mode =
+ mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName);
return mode == AppOpsManager.MODE_IGNORED || mode == AppOpsManager.MODE_ERRORED;
}
/**
* Calculate the time since last full charge, including the device off time
*
- * @param batteryUsageStats class that contains the data
- * @param currentTimeMs current wall time
+ * @param batteryUsageStats class that contains the data
+ * @param currentTimeMs current wall time
* @return time in millis
*/
- public long calculateLastFullChargeTime(BatteryUsageStats batteryUsageStats,
- long currentTimeMs) {
+ public long calculateLastFullChargeTime(
+ BatteryUsageStats batteryUsageStats, long currentTimeMs) {
return currentTimeMs - batteryUsageStats.getStatsStartTimestamp();
}
@@ -323,9 +322,7 @@
Log.d(tag, message + ": " + (System.currentTimeMillis() - startTime) + "ms");
}
- /**
- * Return {@code true} if battery defender is on and charging.
- */
+ /** Return {@code true} if battery defender is on and charging. */
public static boolean isBatteryDefenderOn(BatteryInfo batteryInfo) {
return batteryInfo.isBatteryDefender && !batteryInfo.discharging;
}
@@ -334,13 +331,14 @@
* Find package uid from package name
*
* @param packageName used to find the uid
- * @return uid for packageName, or {@link #UID_NULL} if exception happens or
- * {@code packageName} is null
+ * @return uid for packageName, or {@link #UID_NULL} if exception happens or {@code packageName}
+ * is null
*/
public int getPackageUid(String packageName) {
try {
- return packageName == null ? UID_NULL : mPackageManager.getPackageUid(packageName,
- PackageManager.GET_META_DATA);
+ return packageName == null
+ ? UID_NULL
+ : mPackageManager.getPackageUid(packageName, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
return UID_NULL;
}
@@ -360,16 +358,18 @@
return (T) protoClass.getDefaultInstanceForType();
}
try {
- return (T) protoClass.getParserForType()
- .parseFrom(Base64.decode(serializedProto, Base64.DEFAULT));
+ return (T)
+ protoClass
+ .getParserForType()
+ .parseFrom(Base64.decode(serializedProto, Base64.DEFAULT));
} catch (InvalidProtocolBufferException e) {
Log.e(TAG, "Failed to deserialize proto class", e);
return (T) protoClass.getDefaultInstanceForType();
}
}
- public void setForceAppStandby(int uid, String packageName,
- int mode) {
+ /** Sets force app standby mode */
+ public void setForceAppStandby(int uid, String packageName, int mode) {
final boolean isPreOApp = isPreOApp(packageName);
if (isPreOApp) {
// Control whether app could run in the background if it is pre O app
@@ -378,22 +378,27 @@
// Control whether app could run jobs in the background
mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode);
- ThreadUtils.postOnBackgroundThread(() -> {
- final BatteryDatabaseManager batteryDatabaseManager = BatteryDatabaseManager
- .getInstance(mContext);
- if (mode == AppOpsManager.MODE_IGNORED) {
- batteryDatabaseManager.insertAction(AnomalyDatabaseHelper.ActionType.RESTRICTION,
- uid, packageName, System.currentTimeMillis());
- } else if (mode == AppOpsManager.MODE_ALLOWED) {
- batteryDatabaseManager.deleteAction(AnomalyDatabaseHelper.ActionType.RESTRICTION,
- uid, packageName);
- }
- });
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ final BatteryDatabaseManager batteryDatabaseManager =
+ BatteryDatabaseManager.getInstance(mContext);
+ if (mode == AppOpsManager.MODE_IGNORED) {
+ batteryDatabaseManager.insertAction(
+ AnomalyDatabaseHelper.ActionType.RESTRICTION,
+ uid,
+ packageName,
+ System.currentTimeMillis());
+ } else if (mode == AppOpsManager.MODE_ALLOWED) {
+ batteryDatabaseManager.deleteAction(
+ AnomalyDatabaseHelper.ActionType.RESTRICTION, uid, packageName);
+ }
+ });
}
public boolean isForceAppStandbyEnabled(int uid, String packageName) {
- return mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid,
- packageName) == AppOpsManager.MODE_IGNORED;
+ return mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName)
+ == AppOpsManager.MODE_IGNORED;
}
public boolean clearForceAppStandby(String packageName) {
@@ -408,12 +413,13 @@
@WorkerThread
public BatteryInfo getBatteryInfo(final String tag) {
- final BatteryStatsManager systemService = mContext.getSystemService(
- BatteryStatsManager.class);
+ final BatteryStatsManager systemService =
+ mContext.getSystemService(BatteryStatsManager.class);
BatteryUsageStats batteryUsageStats;
try {
- batteryUsageStats = systemService.getBatteryUsageStats(
- new BatteryUsageStatsQuery.Builder().includeBatteryHistory().build());
+ batteryUsageStats =
+ systemService.getBatteryUsageStats(
+ new BatteryUsageStatsQuery.Builder().includeBatteryHistory().build());
} catch (RuntimeException e) {
Log.e(TAG, "getBatteryInfo() error from getBatteryUsageStats()", e);
// Use default BatteryUsageStats.
@@ -425,23 +431,29 @@
// Stuff we always need to get BatteryInfo
final Intent batteryBroadcast = getBatteryIntent(mContext);
- final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
- SystemClock.elapsedRealtime());
+ final long elapsedRealtimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
BatteryInfo batteryInfo;
Estimate estimate = getEnhancedEstimate();
// couldn't get estimate from cache or provider, use fallback
if (estimate == null) {
- estimate = new Estimate(
- batteryUsageStats.getBatteryTimeRemainingMs(),
- false /* isBasedOnUsage */,
- EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
+ estimate =
+ new Estimate(
+ batteryUsageStats.getBatteryTimeRemainingMs(),
+ false /* isBasedOnUsage */,
+ EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
}
BatteryUtils.logRuntime(tag, "BatteryInfoLoader post query", startTime);
- batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast,
- batteryUsageStats, estimate, elapsedRealtimeUs, false /* shortString */);
+ batteryInfo =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ batteryBroadcast,
+ batteryUsageStats,
+ estimate,
+ elapsedRealtimeUs,
+ false /* shortString */);
BatteryUtils.logRuntime(tag, "BatteryInfoLoader.loadInBackground", startTime);
try {
@@ -456,9 +468,9 @@
Estimate getEnhancedEstimate() {
// Align the same logic in the BatteryControllerImpl.updateEstimate()
Estimate estimate = Estimate.getCachedEstimateIfAvailable(mContext);
- if (estimate == null &&
- mPowerUsageFeatureProvider != null &&
- mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(mContext)) {
+ if (estimate == null
+ && mPowerUsageFeatureProvider != null
+ && mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(mContext)) {
estimate = mPowerUsageFeatureProvider.getEnhancedBatteryPrediction(mContext);
if (estimate != null) {
Estimate.storeCachedEstimate(mContext, estimate);
@@ -493,8 +505,8 @@
public boolean isPreOApp(final String packageName) {
try {
- ApplicationInfo info = mPackageManager.getApplicationInfo(packageName,
- PackageManager.GET_META_DATA);
+ ApplicationInfo info =
+ mPackageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
return info.targetSdkVersion < Build.VERSION_CODES.O;
} catch (PackageManager.NameNotFoundException e) {
@@ -518,18 +530,17 @@
return false;
}
- /**
- * Return {@code true} if we should hide anomaly app represented by {@code uid}
- */
- public boolean shouldHideAnomaly(PowerAllowlistBackend powerAllowlistBackend, int uid,
- AnomalyInfo anomalyInfo) {
+ /** Return {@code true} if we should hide anomaly app represented by {@code uid} */
+ public boolean shouldHideAnomaly(
+ PowerAllowlistBackend powerAllowlistBackend, int uid, AnomalyInfo anomalyInfo) {
final String[] packageNames = mPackageManager.getPackagesForUid(uid);
if (ArrayUtils.isEmpty(packageNames)) {
// Don't show it if app has been uninstalled
return true;
}
- return isSystemUid(uid) || powerAllowlistBackend.isAllowlisted(packageNames, uid)
+ return isSystemUid(uid)
+ || powerAllowlistBackend.isAllowlisted(packageNames, uid)
|| (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames))
|| (isExcessiveBackgroundAnomaly(anomalyInfo) && !isPreOApp(packageNames));
}
@@ -547,8 +558,8 @@
private boolean isSystemApp(PackageManager packageManager, String[] packageNames) {
for (String packageName : packageNames) {
try {
- final ApplicationInfo info = packageManager.getApplicationInfo(packageName,
- 0 /* flags */);
+ final ApplicationInfo info =
+ packageManager.getApplicationInfo(packageName, 0 /* flags */);
if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
return true;
}
@@ -570,11 +581,13 @@
// components
// with ComponentInfo#directBootAware == false will be filtered. We should
// explicitly include both direct boot aware and unaware components here.
- final List<ResolveInfo> resolveInfos = mPackageManager.queryIntentActivities(launchIntent,
- PackageManager.MATCH_DISABLED_COMPONENTS
- | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.MATCH_SYSTEM_ONLY);
+ final List<ResolveInfo> resolveInfos =
+ mPackageManager.queryIntentActivities(
+ launchIntent,
+ PackageManager.MATCH_DISABLED_COMPONENTS
+ | PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.MATCH_SYSTEM_ONLY);
for (int i = 0, size = resolveInfos.size(); i < size; i++) {
final ResolveInfo resolveInfo = resolveInfos.get(i);
if (ArrayUtils.contains(packageNames, resolveInfo.activityInfo.packageName)) {
@@ -591,8 +604,8 @@
*/
public long getAppLongVersionCode(String packageName) {
try {
- final PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName,
- 0 /* flags */);
+ final PackageInfo packageInfo =
+ mPackageManager.getPackageInfo(packageName, 0 /* flags */);
return packageInfo.getLongVersionCode();
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Cannot find package: " + packageName, e);
@@ -616,6 +629,13 @@
&& GOOGLE_PLAY_STORE_PACKAGE.equals(installSourceInfo.getInitiatingPackageName());
}
+ /** Gets the logging package name. */
+ public static String getLoggingPackageName(Context context, String originalPackingName) {
+ return BatteryUtils.isAppInstalledFromGooglePlayStore(context, originalPackingName)
+ ? originalPackingName
+ : PACKAGE_NAME_NONE;
+ }
+
/** Gets the latest sticky battery intent from the Android system. */
public static Intent getBatteryIntent(Context context) {
return com.android.settingslib.fuelgauge.BatteryUtils.getBatteryIntent(context);
@@ -624,12 +644,14 @@
/** Gets the current dock defender mode */
public static int getCurrentDockDefenderMode(Context context, BatteryInfo batteryInfo) {
if (batteryInfo.pluggedStatus == BatteryManager.BATTERY_PLUGGED_DOCK) {
- if (Settings.Global.getInt(context.getContentResolver(),
- SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0) == 1) {
+ if (Settings.Global.getInt(
+ context.getContentResolver(), SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0)
+ == 1) {
return DockDefenderMode.TEMPORARILY_BYPASSED;
- } else if (batteryInfo.isBatteryDefender && FeatureFactory.getFeatureFactory()
- .getPowerUsageFeatureProvider()
- .isExtraDefend()) {
+ } else if (batteryInfo.isBatteryDefender
+ && FeatureFactory.getFeatureFactory()
+ .getPowerUsageFeatureProvider()
+ .isExtraDefend()) {
return DockDefenderMode.ACTIVE;
} else if (!batteryInfo.isBatteryDefender) {
return DockDefenderMode.FUTURE_BYPASS;
@@ -638,59 +660,82 @@
return DockDefenderMode.DISABLED;
}
- /** Formats elapsed time without commas in between. */
+ /** Formats elapsed time without commas in between. */
public static CharSequence formatElapsedTimeWithoutComma(
Context context, double millis, boolean withSeconds, boolean collapseTimeUnit) {
return StringUtil.formatElapsedTime(context, millis, withSeconds, collapseTimeUnit)
- .toString().replaceAll(",", "");
+ .toString()
+ .replaceAll(",", "");
}
/** Builds the battery usage time summary. */
- public static String buildBatteryUsageTimeSummary(final Context context, final boolean isSystem,
- final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
+ public static String buildBatteryUsageTimeSummary(
+ final Context context,
+ final boolean isSystem,
+ final long foregroundUsageTimeInMs,
+ final long backgroundUsageTimeInMs,
final long screenOnTimeInMs) {
StringBuilder summary = new StringBuilder();
if (isSystem) {
final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
if (totalUsageTimeInMs != 0) {
- summary.append(buildBatteryUsageTimeInfo(context, totalUsageTimeInMs,
- R.string.battery_usage_total_less_than_one_minute,
- R.string.battery_usage_for_total_time));
+ summary.append(
+ buildBatteryUsageTimeInfo(
+ context,
+ totalUsageTimeInMs,
+ R.string.battery_usage_total_less_than_one_minute,
+ R.string.battery_usage_for_total_time));
}
} else {
if (screenOnTimeInMs != 0) {
- summary.append(buildBatteryUsageTimeInfo(context, screenOnTimeInMs,
- R.string.battery_usage_screen_time_less_than_one_minute,
- R.string.battery_usage_screen_time));
+ summary.append(
+ buildBatteryUsageTimeInfo(
+ context,
+ screenOnTimeInMs,
+ R.string.battery_usage_screen_time_less_than_one_minute,
+ R.string.battery_usage_screen_time));
}
if (screenOnTimeInMs != 0 && backgroundUsageTimeInMs != 0) {
summary.append('\n');
}
if (backgroundUsageTimeInMs != 0) {
- summary.append(buildBatteryUsageTimeInfo(context, backgroundUsageTimeInMs,
- R.string.battery_usage_background_less_than_one_minute,
- R.string.battery_usage_for_background_time));
+ summary.append(
+ buildBatteryUsageTimeInfo(
+ context,
+ backgroundUsageTimeInMs,
+ R.string.battery_usage_background_less_than_one_minute,
+ R.string.battery_usage_for_background_time));
}
}
return summary.toString();
}
+
/** Format the date of battery related info */
public static CharSequence getBatteryInfoFormattedDate(long dateInMs) {
final Instant instant = Instant.ofEpochMilli(dateInMs);
- final String localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate().format(
- DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG));
+ final String localDate =
+ instant.atZone(ZoneId.systemDefault())
+ .toLocalDate()
+ .format(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG));
return localDate;
}
/** Builds the battery usage time information for one timestamp. */
- private static String buildBatteryUsageTimeInfo(final Context context, long timeInMs,
- final int lessThanOneMinuteResId, final int normalResId) {
+ private static String buildBatteryUsageTimeInfo(
+ final Context context,
+ long timeInMs,
+ final int lessThanOneMinuteResId,
+ final int normalResId) {
if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
return context.getString(lessThanOneMinuteResId);
}
- final CharSequence timeSequence = formatElapsedTimeWithoutComma(
- context, (double) timeInMs, /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
+ final CharSequence timeSequence =
+ formatElapsedTimeWithoutComma(
+ context,
+ (double) timeInMs,
+ /* withSeconds= */ false,
+ /* collapseTimeUnit= */ false);
return context.getString(normalResId, timeSequence);
}
}
diff --git a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
index dda83a8..a68a4de 100644
--- a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
+++ b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
@@ -40,9 +40,7 @@
}
@Override
- protected void onDiscardResult(List<BatteryInfo> result) {
-
- }
+ protected void onDiscardResult(List<BatteryInfo> result) {}
@Override
public List<BatteryInfo> loadInBackground() {
@@ -51,29 +49,39 @@
FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
// get stuff we'll need for both BatteryInfo
- final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
- SystemClock.elapsedRealtime());
- Intent batteryBroadcast = getContext().registerReceiver(null,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ final long elapsedRealtimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
+ Intent batteryBroadcast =
+ getContext()
+ .registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
BatteryUsageStats batteryUsageStats;
try {
- batteryUsageStats = context.getSystemService(BatteryStatsManager.class)
- .getBatteryUsageStats();
+ batteryUsageStats =
+ context.getSystemService(BatteryStatsManager.class).getBatteryUsageStats();
} catch (RuntimeException e) {
Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e);
// Use default BatteryUsageStats.
batteryUsageStats = new BatteryUsageStats.Builder(new String[0]).build();
}
- BatteryInfo oldinfo = BatteryInfo.getBatteryInfoOld(getContext(), batteryBroadcast,
- batteryUsageStats, elapsedRealtimeUs, false);
+ BatteryInfo oldinfo =
+ BatteryInfo.getBatteryInfoOld(
+ getContext(),
+ batteryBroadcast,
+ batteryUsageStats,
+ elapsedRealtimeUs,
+ false);
Estimate estimate = powerUsageFeatureProvider.getEnhancedBatteryPrediction(context);
if (estimate == null) {
estimate = new Estimate(0, false, EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN);
}
- BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast,
- batteryUsageStats,
- estimate, elapsedRealtimeUs, false);
+ BatteryInfo newInfo =
+ BatteryInfo.getBatteryInfo(
+ getContext(),
+ batteryBroadcast,
+ batteryUsageStats,
+ estimate,
+ elapsedRealtimeUs,
+ false);
List<BatteryInfo> infos = new ArrayList<>();
infos.add(oldinfo);
diff --git a/src/com/android/settings/fuelgauge/HighPowerDetail.java b/src/com/android/settings/fuelgauge/HighPowerDetail.java
index dc9150a..b2585a6 100644
--- a/src/com/android/settings/fuelgauge/HighPowerDetail.java
+++ b/src/com/android/settings/fuelgauge/HighPowerDetail.java
@@ -40,23 +40,18 @@
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
-public class HighPowerDetail extends InstrumentedDialogFragment implements OnClickListener,
- View.OnClickListener {
+public class HighPowerDetail extends InstrumentedDialogFragment
+ implements OnClickListener, View.OnClickListener {
private static final String ARG_DEFAULT_ON = "default_on";
- @VisibleForTesting
- PowerAllowlistBackend mBackend;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
- @VisibleForTesting
- String mPackageName;
- @VisibleForTesting
- int mPackageUid;
+ @VisibleForTesting PowerAllowlistBackend mBackend;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
+ @VisibleForTesting String mPackageName;
+ @VisibleForTesting int mPackageUid;
private CharSequence mLabel;
private boolean mDefaultOn;
- @VisibleForTesting
- boolean mIsEnabled;
+ @VisibleForTesting boolean mIsEnabled;
private Checkable mOptionOn;
private Checkable mOptionOff;
@@ -85,10 +80,13 @@
}
public Checkable setup(View view, boolean on) {
- ((TextView) view.findViewById(android.R.id.title)).setText(on
- ? R.string.ignore_optimizations_on : R.string.ignore_optimizations_off);
- ((TextView) view.findViewById(android.R.id.summary)).setText(on
- ? R.string.ignore_optimizations_on_desc : R.string.ignore_optimizations_off_desc);
+ ((TextView) view.findViewById(android.R.id.title))
+ .setText(on ? R.string.ignore_optimizations_on : R.string.ignore_optimizations_off);
+ ((TextView) view.findViewById(android.R.id.summary))
+ .setText(
+ on
+ ? R.string.ignore_optimizations_on_desc
+ : R.string.ignore_optimizations_off_desc);
view.setClickable(true);
view.setOnClickListener(this);
if (!on && mBackend.isSysAllowlisted(mPackageName)) {
@@ -99,10 +97,11 @@
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- AlertDialog.Builder b = new AlertDialog.Builder(getContext())
- .setTitle(mLabel)
- .setNegativeButton(R.string.cancel, null)
- .setView(R.layout.ignore_optimizations_content);
+ AlertDialog.Builder b =
+ new AlertDialog.Builder(getContext())
+ .setTitle(mLabel)
+ .setNegativeButton(R.string.cancel, null)
+ .setView(R.layout.ignore_optimizations_content);
if (!mBackend.isSysAllowlisted(mPackageName)) {
b.setPositiveButton(R.string.done, this);
}
@@ -141,8 +140,8 @@
if (newValue != oldValue) {
logSpecialPermissionChange(newValue, mPackageName, getContext());
if (newValue) {
- mBatteryUtils.setForceAppStandby(mPackageUid, mPackageName,
- AppOpsManager.MODE_ALLOWED);
+ mBatteryUtils.setForceAppStandby(
+ mPackageUid, mPackageName, AppOpsManager.MODE_ALLOWED);
mBackend.addApp(mPackageName);
} else {
mBackend.removeApp(mPackageName);
@@ -153,10 +152,13 @@
@VisibleForTesting
static void logSpecialPermissionChange(boolean allowlist, String packageName, Context context) {
- int logCategory = allowlist ? SettingsEnums.APP_SPECIAL_PERMISSION_BATTERY_DENY
- : SettingsEnums.APP_SPECIAL_PERMISSION_BATTERY_ALLOW;
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider().action(context, logCategory,
- packageName);
+ int logCategory =
+ allowlist
+ ? SettingsEnums.APP_SPECIAL_PERMISSION_BATTERY_DENY
+ : SettingsEnums.APP_SPECIAL_PERMISSION_BATTERY_ALLOW;
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(context, logCategory, packageName);
}
@Override
@@ -177,8 +179,8 @@
}
@VisibleForTesting
- static CharSequence getSummary(Context context, PowerAllowlistBackend powerAllowlist,
- String pkg, int uid) {
+ static CharSequence getSummary(
+ Context context, PowerAllowlistBackend powerAllowlist, String pkg, int uid) {
return context.getString(
powerAllowlist.isSysAllowlisted(pkg) || powerAllowlist.isDefaultActiveApp(pkg, uid)
? R.string.high_power_system
diff --git a/src/com/android/settings/fuelgauge/InactiveApps.java b/src/com/android/settings/fuelgauge/InactiveApps.java
index a629fce..465a9d8 100644
--- a/src/com/android/settings/fuelgauge/InactiveApps.java
+++ b/src/com/android/settings/fuelgauge/InactiveApps.java
@@ -47,15 +47,16 @@
public class InactiveApps extends SettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener {
- private static final CharSequence[] FULL_SETTABLE_BUCKETS_NAMES =
- {"ACTIVE", "WORKING_SET", "FREQUENT", "RARE", "RESTRICTED"};
+ private static final CharSequence[] FULL_SETTABLE_BUCKETS_NAMES = {
+ "ACTIVE", "WORKING_SET", "FREQUENT", "RARE", "RESTRICTED"
+ };
private static final CharSequence[] FULL_SETTABLE_BUCKETS_VALUES = {
- Integer.toString(STANDBY_BUCKET_ACTIVE),
- Integer.toString(STANDBY_BUCKET_WORKING_SET),
- Integer.toString(STANDBY_BUCKET_FREQUENT),
- Integer.toString(STANDBY_BUCKET_RARE),
- Integer.toString(STANDBY_BUCKET_RESTRICTED)
+ Integer.toString(STANDBY_BUCKET_ACTIVE),
+ Integer.toString(STANDBY_BUCKET_WORKING_SET),
+ Integer.toString(STANDBY_BUCKET_FREQUENT),
+ Integer.toString(STANDBY_BUCKET_RARE),
+ Integer.toString(STANDBY_BUCKET_RESTRICTED)
};
private UsageStatsManager mUsageStats;
@@ -118,7 +119,7 @@
return possibleBuckets;
}
if (minBucket < STANDBY_BUCKET_ACTIVE) {
- return new CharSequence[]{};
+ return new CharSequence[] {};
}
// Use FULL_SETTABLE_BUCKETS_VALUES since we're searching using the int value. The index
// should apply no matter which array we're going to copy from.
@@ -133,13 +134,20 @@
static String bucketToName(int bucket) {
switch (bucket) {
- case STANDBY_BUCKET_EXEMPTED: return "EXEMPTED";
- case STANDBY_BUCKET_ACTIVE: return "ACTIVE";
- case STANDBY_BUCKET_WORKING_SET: return "WORKING_SET";
- case STANDBY_BUCKET_FREQUENT: return "FREQUENT";
- case STANDBY_BUCKET_RARE: return "RARE";
- case STANDBY_BUCKET_RESTRICTED: return "RESTRICTED";
- case STANDBY_BUCKET_NEVER: return "NEVER";
+ case STANDBY_BUCKET_EXEMPTED:
+ return "EXEMPTED";
+ case STANDBY_BUCKET_ACTIVE:
+ return "ACTIVE";
+ case STANDBY_BUCKET_WORKING_SET:
+ return "WORKING_SET";
+ case STANDBY_BUCKET_FREQUENT:
+ return "FREQUENT";
+ case STANDBY_BUCKET_RARE:
+ return "RARE";
+ case STANDBY_BUCKET_RESTRICTED:
+ return "RESTRICTED";
+ case STANDBY_BUCKET_NEVER:
+ return "NEVER";
}
return "";
}
@@ -148,13 +156,13 @@
final Resources res = getActivity().getResources();
final int appBucket = mUsageStats.getAppStandbyBucket(p.getKey());
final String bucketName = bucketToName(appBucket);
- p.setSummary(res.getString(
- com.android.settingslib.R.string.standby_bucket_summary, bucketName));
+ p.setSummary(
+ res.getString(com.android.settingslib.R.string.standby_bucket_summary, bucketName));
// Buckets outside of the range of the dynamic ones are only used for special
// purposes and can either not be changed out of, or might have undesirable
// side-effects in combination with other assumptions.
- final boolean changeable = appBucket >= STANDBY_BUCKET_ACTIVE
- && appBucket <= STANDBY_BUCKET_RESTRICTED;
+ final boolean changeable =
+ appBucket >= STANDBY_BUCKET_ACTIVE && appBucket <= STANDBY_BUCKET_RESTRICTED;
if (changeable) {
p.setValue(Integer.toString(appBucket));
}
diff --git a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
index ca75b0e..a26ab7a 100644
--- a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
@@ -17,7 +17,6 @@
package com.android.settings.fuelgauge;
import android.content.Context;
-import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -31,7 +30,7 @@
private static final String TAG = "OPTIMIZED_PREF";
- @VisibleForTesting String KEY_OPTIMIZED_PREF = "optimized_pref";
+ @VisibleForTesting static final String KEY_OPTIMIZED_PREF = "optimized_preference";
@VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
public OptimizedPreferenceController(Context context, int uid, String packageName) {
@@ -46,24 +45,13 @@
@Override
public void updateState(Preference preference) {
- if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) {
- Log.d(TAG, "disable preference for " + mBatteryOptimizeUtils.getPackageName());
- preference.setEnabled(true);
- ((SelectorWithWidgetPreference) preference).setChecked(true);
- return;
- }
+ preference.setEnabled(mBatteryOptimizeUtils.isSelectorPreferenceEnabled());
- if (mBatteryOptimizeUtils.getAppOptimizationMode()
- == BatteryOptimizeUtils.MODE_OPTIMIZED) {
- Log.d(TAG, "is optimized states");
- ((SelectorWithWidgetPreference) preference).setChecked(true);
- } else {
- ((SelectorWithWidgetPreference) preference).setChecked(false);
- if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
- Log.d(TAG, "is system or default app, disable pref");
- preference.setEnabled(false);
- }
- }
+ final boolean isOptimized =
+ mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()
+ || mBatteryOptimizeUtils.getAppOptimizationMode()
+ == BatteryOptimizeUtils.MODE_OPTIMIZED;
+ ((SelectorWithWidgetPreference) preference).setChecked(isOptimized);
}
@Override
diff --git a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
new file mode 100644
index 0000000..664d916
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
@@ -0,0 +1,348 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import static com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
+
+import android.app.Activity;
+import android.app.backup.BackupManager;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Switch;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.HelpUtils;
+import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.widget.FooterPreference;
+import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.MainSwitchPreference;
+import com.android.settingslib.widget.OnMainSwitchChangeListener;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/** Allow background usage fragment for each app */
+public class PowerBackgroundUsageDetail extends DashboardFragment
+ implements SelectorWithWidgetPreference.OnClickListener, OnMainSwitchChangeListener {
+ private static final String TAG = "PowerBackgroundUsageDetail";
+
+ public static final String EXTRA_UID = "extra_uid";
+ public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
+ public static final String EXTRA_LABEL = "extra_label";
+ public static final String EXTRA_POWER_USAGE_AMOUNT = "extra_power_usage_amount";
+ public static final String EXTRA_ICON_ID = "extra_icon_id";
+ private static final String KEY_PREF_HEADER = "header_view";
+ private static final String KEY_PREF_UNRESTRICTED = "unrestricted_preference";
+ private static final String KEY_PREF_OPTIMIZED = "optimized_preference";
+ private static final String KEY_ALLOW_BACKGROUND_USAGE = "allow_background_usage";
+ private static final String KEY_FOOTER_PREFERENCE = "app_usage_footer_preference";
+
+ private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
+
+ @VisibleForTesting LayoutPreference mHeaderPreference;
+ @VisibleForTesting ApplicationsState mState;
+ @VisibleForTesting ApplicationsState.AppEntry mAppEntry;
+ @VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @VisibleForTesting SelectorWithWidgetPreference mOptimizePreference;
+ @VisibleForTesting SelectorWithWidgetPreference mUnrestrictedPreference;
+ @VisibleForTesting MainSwitchPreference mMainSwitchPreference;
+ @VisibleForTesting FooterPreference mFooterPreference;
+ @VisibleForTesting BackupManager mBackupManager;
+ @VisibleForTesting StringBuilder mLogStringBuilder;
+
+ @VisibleForTesting @BatteryOptimizeUtils.OptimizationMode
+ int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ mState = ApplicationsState.getInstance(getActivity().getApplication());
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
+ onCreateBackgroundUsageState(packageName);
+ mHeaderPreference = findPreference(KEY_PREF_HEADER);
+
+ if (packageName != null) {
+ mAppEntry = mState.getEntry(packageName, UserHandle.myUserId());
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ initHeader();
+ mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
+ initFooter();
+ mExecutor.execute(
+ () -> {
+ String packageName =
+ BatteryUtils.getLoggingPackageName(
+ getContext(), mBatteryOptimizeUtils.getPackageName());
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ getContext(),
+ SettingsEnums.OPEN_APP_BATTERY_USAGE,
+ packageName);
+ });
+ mLogStringBuilder = new StringBuilder("onResume mode = ").append(mOptimizationMode);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ notifyBackupManager();
+ final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode();
+ mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode);
+ logMetricCategory(currentOptimizeMode);
+
+ mExecutor.execute(
+ () -> {
+ BatteryOptimizeLogUtils.writeLog(
+ getContext().getApplicationContext(),
+ Action.LEAVE,
+ BatteryOptimizeLogUtils.getPackageNameWithUserId(
+ mBatteryOptimizeUtils.getPackageName(), UserHandle.myUserId()),
+ mLogStringBuilder.toString());
+ });
+ Log.d(TAG, "Leave with mode: " + currentOptimizeMode);
+ }
+
+ @Override
+ public void onRadioButtonClicked(SelectorWithWidgetPreference selected) {
+ final String selectedKey = selected == null ? null : selected.getKey();
+ updateSelectorPreferenceState(mUnrestrictedPreference, selectedKey);
+ updateSelectorPreferenceState(mOptimizePreference, selectedKey);
+ mBatteryOptimizeUtils.setAppUsageState(getSelectedPreference(), Action.APPLY);
+ }
+
+ @Override
+ public void onSwitchChanged(Switch switchView, boolean isChecked) {
+ mMainSwitchPreference.setChecked(isChecked);
+ updateSelectorPreference(isChecked);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.FUELGAUGE_POWER_USAGE_MANAGE_BACKGROUND;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ final Bundle bundle = getArguments();
+ final int uid = bundle.getInt(EXTRA_UID, 0);
+ final String packageName = bundle.getString(EXTRA_PACKAGE_NAME);
+
+ controllers.add(new AllowBackgroundPreferenceController(context, uid, packageName));
+ controllers.add(new OptimizedPreferenceController(context, uid, packageName));
+ controllers.add(new UnrestrictedPreferenceController(context, uid, packageName));
+
+ return controllers;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.power_background_usage_detail;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @VisibleForTesting
+ void updateSelectorPreference(boolean isEnabled) {
+ mOptimizePreference.setEnabled(isEnabled);
+ mUnrestrictedPreference.setEnabled(isEnabled);
+ onRadioButtonClicked(isEnabled ? mOptimizePreference : null);
+ }
+
+ @VisibleForTesting
+ void notifyBackupManager() {
+ if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
+ final BackupManager backupManager =
+ mBackupManager != null ? mBackupManager : new BackupManager(getContext());
+ backupManager.dataChanged();
+ }
+ }
+
+ @VisibleForTesting
+ int getSelectedPreference() {
+ if (!mMainSwitchPreference.isChecked()) {
+ return BatteryOptimizeUtils.MODE_RESTRICTED;
+ } else if (mUnrestrictedPreference.isChecked()) {
+ return BatteryOptimizeUtils.MODE_UNRESTRICTED;
+ } else if (mOptimizePreference.isChecked()) {
+ return BatteryOptimizeUtils.MODE_OPTIMIZED;
+ } else {
+ return BatteryOptimizeUtils.MODE_UNKNOWN;
+ }
+ }
+
+ static void startPowerBackgroundUsageDetailPage(Context context, Bundle args) {
+ new SubSettingLauncher(context)
+ .setDestination(PowerBackgroundUsageDetail.class.getName())
+ .setArguments(args)
+ .setSourceMetricsCategory(SettingsEnums.FUELGAUGE_POWER_USAGE_MANAGE_BACKGROUND)
+ .launch();
+ }
+
+ @VisibleForTesting
+ void initHeader() {
+ final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);
+ final Activity context = getActivity();
+ final Bundle bundle = getArguments();
+ EntityHeaderController controller =
+ EntityHeaderController.newInstance(context, this, appSnippet)
+ .setButtonActions(
+ EntityHeaderController.ActionType.ACTION_NONE,
+ EntityHeaderController.ActionType.ACTION_NONE);
+
+ if (mAppEntry == null) {
+ controller.setLabel(bundle.getString(EXTRA_LABEL));
+
+ final int iconId = bundle.getInt(EXTRA_ICON_ID, 0);
+ if (iconId == 0) {
+ controller.setIcon(context.getPackageManager().getDefaultActivityIcon());
+ } else {
+ controller.setIcon(context.getDrawable(bundle.getInt(EXTRA_ICON_ID)));
+ }
+ } else {
+ mState.ensureIcon(mAppEntry);
+ controller.setLabel(mAppEntry);
+ controller.setIcon(mAppEntry);
+ controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
+ }
+
+ controller.done(true /* rebindActions */);
+ }
+
+ @VisibleForTesting
+ void initFooter() {
+ final String stateString;
+ final String footerString;
+ final Context context = getContext();
+
+ if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) {
+ // Present optimized only string when the package name is invalid.
+ stateString = context.getString(R.string.manager_battery_usage_optimized_only);
+ footerString =
+ context.getString(R.string.manager_battery_usage_footer_limited, stateString);
+ } else if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
+ // Present unrestricted only string when the package is system or default active app.
+ stateString = context.getString(R.string.manager_battery_usage_unrestricted_only);
+ footerString =
+ context.getString(R.string.manager_battery_usage_footer_limited, stateString);
+ } else {
+ // Present default string to normal app.
+ footerString = context.getString(R.string.manager_battery_usage_footer);
+ }
+ mFooterPreference.setTitle(footerString);
+ final Intent helpIntent =
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_app_usage_settings),
+ /* backupContext= */ "");
+ if (helpIntent != null) {
+ mFooterPreference.setLearnMoreAction(
+ v -> startActivityForResult(helpIntent, /* requestCode= */ 0));
+ mFooterPreference.setLearnMoreText(
+ context.getString(R.string.manager_battery_usage_link_a11y));
+ }
+ }
+
+ private void onCreateBackgroundUsageState(String packageName) {
+ mOptimizePreference = findPreference(KEY_PREF_OPTIMIZED);
+ mUnrestrictedPreference = findPreference(KEY_PREF_UNRESTRICTED);
+ mMainSwitchPreference = findPreference(KEY_ALLOW_BACKGROUND_USAGE);
+ mFooterPreference = findPreference(KEY_FOOTER_PREFERENCE);
+
+ mOptimizePreference.setOnClickListener(this);
+ mUnrestrictedPreference.setOnClickListener(this);
+ mMainSwitchPreference.addOnSwitchChangeListener(this);
+
+ mBatteryOptimizeUtils =
+ new BatteryOptimizeUtils(
+ getContext(), getArguments().getInt(EXTRA_UID), packageName);
+ }
+
+ private void updateSelectorPreferenceState(
+ SelectorWithWidgetPreference preference, String selectedKey) {
+ preference.setChecked(TextUtils.equals(selectedKey, preference.getKey()));
+ }
+
+ private void logMetricCategory(int currentOptimizeMode) {
+ if (currentOptimizeMode == mOptimizationMode) {
+ return;
+ }
+ int metricCategory = 0;
+ switch (currentOptimizeMode) {
+ case BatteryOptimizeUtils.MODE_UNRESTRICTED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
+ break;
+ case BatteryOptimizeUtils.MODE_OPTIMIZED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
+ break;
+ case BatteryOptimizeUtils.MODE_RESTRICTED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
+ break;
+ }
+ if (metricCategory == 0) {
+ return;
+ }
+ int finalMetricCategory = metricCategory;
+ mExecutor.execute(
+ () -> {
+ String packageName =
+ BatteryUtils.getLoggingPackageName(
+ getContext(), mBatteryOptimizeUtils.getPackageName());
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ /* attribution */ SettingsEnums.OPEN_APP_BATTERY_USAGE,
+ /* action */ finalMetricCategory,
+ /* pageId */ SettingsEnums.OPEN_APP_BATTERY_USAGE,
+ packageName,
+ getArguments().getInt(EXTRA_POWER_USAGE_AMOUNT));
+ });
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index 4253ca6..a2ee3e4 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -28,19 +28,13 @@
import java.util.List;
import java.util.Set;
-/**
- * Feature Provider used in power usage
- */
+/** Feature Provider used in power usage */
public interface PowerUsageFeatureProvider {
- /**
- * Check whether the battery usage button is enabled in the battery page
- */
+ /** Check whether the battery usage button is enabled in the battery page */
boolean isBatteryUsageEnabled();
- /**
- * Check whether the battery tips card is enabled in the battery usage page
- */
+ /** Check whether the battery tips card is enabled in the battery usage page */
boolean isBatteryTipsEnabled();
/**
@@ -48,39 +42,25 @@
*/
double getBatteryUsageListScreenOnTimeThresholdInMs();
- /**
- * Returns a threshold (mA) for the minimal comsume power in battery usage list
- */
+ /** Returns a threshold (mA) for the minimal comsume power in battery usage list */
double getBatteryUsageListConsumePowerThreshold();
- /**
- * Returns an allowlist of app names combined into the system-apps item
- */
+ /** Returns an allowlist of app names combined into the system-apps item */
List<String> getSystemAppsAllowlist();
- /**
- * Check whether location setting is enabled
- */
+ /** Check whether location setting is enabled */
boolean isLocationSettingEnabled(String[] packages);
- /**
- * Gets an {@link Intent} to show additional battery info
- */
+ /** Gets an {@link Intent} to show additional battery info */
Intent getAdditionalBatteryInfoIntent();
- /**
- * Check whether it is type service
- */
+ /** Check whether it is type service */
boolean isTypeService(int uid);
- /**
- * Check whether it is type system
- */
+ /** Check whether it is type system */
boolean isTypeSystem(int uid, String[] packages);
- /**
- * Returns an improved prediction for battery time remaining
- */
+ /** Returns an improved prediction for battery time remaining */
Estimate getEnhancedBatteryPrediction(Context context);
/**
@@ -90,14 +70,10 @@
*/
SparseIntArray getEnhancedBatteryPredictionCurve(Context context, long zeroTime);
- /**
- * Checks whether the toggle for enhanced battery predictions is enabled
- */
+ /** Checks whether the toggle for enhanced battery predictions is enabled */
boolean isEnhancedBatteryPredictionEnabled(Context context);
- /**
- * Checks whether debugging should be enabled for battery estimates
- */
+ /** Checks whether debugging should be enabled for battery estimates */
boolean isEstimateDebugEnabled();
/**
@@ -115,88 +91,54 @@
*/
String getOldEstimateDebugString(String timeRemaining);
- /**
- * Checks whether smart battery feature is supported in this device
- */
+ /** Checks whether smart battery feature is supported in this device */
boolean isSmartBatterySupported();
- /**
- * Checks whether we should show usage information by slots or not
- */
+ /** Checks whether we should show usage information by slots or not */
boolean isChartGraphSlotsEnabled(Context context);
- /**
- * Returns {@code true} if current defender mode is extra defend
- */
+ /** Returns {@code true} if current defender mode is extra defend */
boolean isExtraDefend();
- /**
- * Returns {@code true} if delay the hourly job when device is booting
- */
+ /** Returns {@code true} if delay the hourly job when device is booting */
boolean delayHourlyJobWhenBooting();
- /**
- * Insert settings configuration data for anomaly detection
- */
+ /** Insert settings configuration data for anomaly detection */
void insertSettingsData(Context context, double displayDrain);
- /**
- * Returns {@link Bundle} for settings anomaly detection result
- */
+ /** Returns {@link Bundle} for settings anomaly detection result */
PowerAnomalyEventList detectSettingsAnomaly(Context context, double displayDrain);
- /**
- * Gets an intent for one time bypass charge limited to resume charging.
- */
+ /** Gets an intent for one time bypass charge limited to resume charging. */
Intent getResumeChargeIntent(boolean isDockDefender);
- /**
- * Returns the intent action used to mark as the full charge start event.
- */
+ /** Returns the intent action used to mark as the full charge start event. */
String getFullChargeIntentAction();
- /**
- * Returns {@link Set} for the system component ids which are combined into others
- */
+ /** Returns {@link Set} for the system component ids which are combined into others */
Set<Integer> getOthersSystemComponentSet();
- /**
- * Returns {@link Set} for the custom system component names which are combined into others
- */
+ /** Returns {@link Set} for the custom system component names which are combined into others */
Set<String> getOthersCustomComponentNameSet();
- /**
- * Returns {@link Set} for hiding system component ids in the usage screen
- */
+ /** Returns {@link Set} for hiding system component ids in the usage screen */
Set<Integer> getHideSystemComponentSet();
- /**
- * Returns {@link Set} for hiding application package names in the usage screen
- */
+ /** Returns {@link Set} for hiding application package names in the usage screen */
Set<String> getHideApplicationSet();
- /**
- * Returns {@link Set} for hiding applications background usage time
- */
+ /** Returns {@link Set} for hiding applications background usage time */
Set<String> getHideBackgroundUsageTimeSet();
- /**
- * Returns {@link Set} for ignoring task root class names for screen on time
- */
+ /** Returns {@link Set} for ignoring task root class names for screen on time */
Set<String> getIgnoreScreenOnTimeTaskRootSet();
- /**
- * Returns the customized device build information for data backup
- */
+ /** Returns the customized device build information for data backup */
String getBuildMetadata1(Context context);
- /**
- * Returns the customized device build information for data backup
- */
+ /** Returns the customized device build information for data backup */
String getBuildMetadata2(Context context);
- /**
- * Whether the app optimization mode is valid to restore
- */
+ /** Whether the app optimization mode is valid to restore */
boolean isValidToRestoreOptimizationMode(ArrayMap<String, String> deviceInfoMap);
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 5931e206..2e2cf12 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -39,8 +39,9 @@
private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar";
private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media";
- private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER,
- PACKAGE_CALENDAR_PROVIDER, SYSTEMUI_PACKAGE_NAME};
+ private static final String[] PACKAGES_SYSTEM = {
+ PACKAGE_MEDIA_PROVIDER, PACKAGE_CALENDAR_PROVIDER, SYSTEMUI_PACKAGE_NAME
+ };
protected PackageManager mPackageManager;
protected Context mContext;
@@ -137,8 +138,8 @@
@Override
public boolean isSmartBatterySupported() {
- return mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_smart_battery_available);
+ return mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_smart_battery_available);
}
@Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageTimeController.java b/src/com/android/settings/fuelgauge/PowerUsageTimeController.java
index 5ee15fb..0dfdd5d 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageTimeController.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageTimeController.java
@@ -36,12 +36,9 @@
private static final String KEY_SCREEN_TIME_PREF = "battery_usage_screen_time";
private static final String KEY_BACKGROUND_TIME_PREF = "battery_usage_background_time";
- @VisibleForTesting
- PreferenceCategory mPowerUsageTimeCategory;
- @VisibleForTesting
- PowerUsageTimePreference mScreenTimePreference;
- @VisibleForTesting
- PowerUsageTimePreference mBackgroundTimePreference;
+ @VisibleForTesting PreferenceCategory mPowerUsageTimeCategory;
+ @VisibleForTesting PowerUsageTimePreference mScreenTimePreference;
+ @VisibleForTesting PowerUsageTimePreference mBackgroundTimePreference;
public PowerUsageTimeController(Context context) {
super(context, KEY_POWER_USAGE_TIME);
@@ -61,22 +58,37 @@
mPowerUsageTimeCategory.setVisible(false);
}
- void handleScreenTimeUpdated(final String slotTime,
- final long screenOnTimeInMs, final long backgroundTimeInMs,
- final String anomalyHintPrefKey, final String anomalyHintText) {
- final boolean isShowScreenOnTime = showTimePreference(
- mScreenTimePreference, R.string.power_usage_detail_screen_time,
- screenOnTimeInMs, anomalyHintPrefKey, anomalyHintText);
- final boolean isShowBackgroundTime = showTimePreference(
- mBackgroundTimePreference, R.string.power_usage_detail_background_time,
- backgroundTimeInMs, anomalyHintPrefKey, anomalyHintText);
+ void handleScreenTimeUpdated(
+ final String slotTime,
+ final long screenOnTimeInMs,
+ final long backgroundTimeInMs,
+ final String anomalyHintPrefKey,
+ final String anomalyHintText) {
+ final boolean isShowScreenOnTime =
+ showTimePreference(
+ mScreenTimePreference,
+ R.string.power_usage_detail_screen_time,
+ screenOnTimeInMs,
+ anomalyHintPrefKey,
+ anomalyHintText);
+ final boolean isShowBackgroundTime =
+ showTimePreference(
+ mBackgroundTimePreference,
+ R.string.power_usage_detail_background_time,
+ backgroundTimeInMs,
+ anomalyHintPrefKey,
+ anomalyHintText);
if (isShowScreenOnTime || isShowBackgroundTime) {
showCategoryTitle(slotTime);
}
}
- boolean showTimePreference(PowerUsageTimePreference preference,
- int titleResId, long summaryTimeMs, String anomalyHintKey, String anomalyHintText) {
+ boolean showTimePreference(
+ PowerUsageTimePreference preference,
+ int titleResId,
+ long summaryTimeMs,
+ String anomalyHintKey,
+ String anomalyHintText) {
if (preference == null
|| (summaryTimeMs == 0 && !TextUtils.equals(anomalyHintKey, preference.getKey()))) {
return false;
@@ -94,15 +106,19 @@
if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
return mContext.getString(R.string.power_usage_time_less_than_one_minute);
}
- return formatElapsedTimeWithoutComma(mContext, (double) timeInMs,
- /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
+ return formatElapsedTimeWithoutComma(
+ mContext,
+ (double) timeInMs,
+ /* withSeconds= */ false,
+ /* collapseTimeUnit= */ false);
}
@VisibleForTesting
void showCategoryTitle(String slotTimestamp) {
- mPowerUsageTimeCategory.setTitle(slotTimestamp == null
- ? mContext.getString(R.string.battery_app_usage)
- : mContext.getString(R.string.battery_app_usage_for, slotTimestamp));
+ mPowerUsageTimeCategory.setTitle(
+ slotTimestamp == null
+ ? mContext.getString(R.string.battery_app_usage)
+ : mContext.getString(R.string.battery_app_usage_for, slotTimestamp));
mPowerUsageTimeCategory.setVisible(true);
}
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageTimePreference.java b/src/com/android/settings/fuelgauge/PowerUsageTimePreference.java
index 16f8be2..16c7770 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageTimePreference.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageTimePreference.java
@@ -28,18 +28,13 @@
import com.android.settings.R;
-/**
- * Custom preference for displaying the app power usage time.
- */
+/** Custom preference for displaying the app power usage time. */
public class PowerUsageTimePreference extends Preference {
private static final String TAG = "PowerUsageTimePreference";
- @VisibleForTesting
- CharSequence mTimeTitle;
- @VisibleForTesting
- CharSequence mTimeSummary;
- @VisibleForTesting
- CharSequence mAnomalyHintText;
+ @VisibleForTesting CharSequence mTimeTitle;
+ @VisibleForTesting CharSequence mTimeSummary;
+ @VisibleForTesting CharSequence mAnomalyHintText;
public PowerUsageTimePreference(Context context, AttributeSet attrs) {
super(context, attrs);
diff --git a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
index 9ef8c8c..d948cc0 100644
--- a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
+++ b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
@@ -31,8 +31,8 @@
import com.android.internal.app.AlertController;
import com.android.settings.R;
-public class RequestIgnoreBatteryOptimizations extends AlertActivity implements
- DialogInterface.OnClickListener {
+public class RequestIgnoreBatteryOptimizations extends AlertActivity
+ implements DialogInterface.OnClickListener {
private static final String TAG = "RequestIgnoreBatteryOptimizations";
private static final boolean DEBUG = false;
@@ -42,22 +42,24 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
- .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ getWindow()
+ .addSystemFlags(
+ android.view.WindowManager.LayoutParams
+ .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mPowerWhitelistManager = getSystemService(PowerWhitelistManager.class);
Uri data = getIntent().getData();
if (data == null) {
- debugLog("No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: "
- + getIntent());
+ debugLog(
+ "No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: " + getIntent());
finish();
return;
}
mPackageName = data.getSchemeSpecificPart();
if (mPackageName == null) {
- debugLog("No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: "
- + getIntent());
+ debugLog(
+ "No data supplied for IGNORE_BATTERY_OPTIMIZATION_SETTINGS in: " + getIntent());
finish();
return;
}
@@ -69,11 +71,16 @@
return;
}
- if (getPackageManager().checkPermission(
- Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, mPackageName)
+ if (getPackageManager()
+ .checkPermission(
+ Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
+ mPackageName)
!= PackageManager.PERMISSION_GRANTED) {
- debugLog("Requested package " + mPackageName + " does not hold permission "
- + Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
+ debugLog(
+ "Requested package "
+ + mPackageName
+ + " does not hold permission "
+ + Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
finish();
return;
}
@@ -88,9 +95,12 @@
}
final AlertController.AlertParams p = mAlertParams;
- final CharSequence appLabel = ai.loadSafeLabel(getPackageManager(),
- PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
- | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
+ final CharSequence appLabel =
+ ai.loadSafeLabel(
+ getPackageManager(),
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+ | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
p.mTitle = getText(R.string.high_power_prompt_title);
p.mMessage = getString(R.string.high_power_prompt_body, appLabel);
p.mPositiveButtonText = getText(R.string.allow);
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index e17119f..ea59afa 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -35,15 +35,11 @@
import java.util.List;
-/**
- * Controller to change and update the smart battery toggle
- */
+/** Controller to change and update the smart battery toggle */
public class RestrictAppPreferenceController extends BasePreferenceController {
- @VisibleForTesting
- static final String KEY_RESTRICT_APP = "restricted_app";
+ @VisibleForTesting static final String KEY_RESTRICT_APP = "restricted_app";
- @VisibleForTesting
- List<AppInfo> mAppInfos;
+ @VisibleForTesting List<AppInfo> mAppInfos;
private AppOpsManager mAppOpsManager;
private InstrumentedPreferenceFragment mPreferenceFragment;
private UserManager mUserManager;
@@ -65,7 +61,8 @@
@Override
public int getAvailabilityStatus() {
- return mAppInfos.size() > 0 && !mEnableAppBatteryUsagePage ? AVAILABLE
+ return mAppInfos.size() > 0 && !mEnableAppBatteryUsagePage
+ ? AVAILABLE
: CONDITIONALLY_UNAVAILABLE;
}
@@ -76,17 +73,17 @@
final int num = mAppInfos.size();
// Fragment change RestrictedAppsList after onPause(), UI needs to be updated in onResume()
preference.setVisible(num > 0);
- preference.setSummary(StringUtil.getIcuPluralsString(mContext, num,
- R.string.restricted_app_summary));
+ preference.setSummary(
+ StringUtil.getIcuPluralsString(mContext, num, R.string.restricted_app_summary));
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (getPreferenceKey().equals(preference.getKey())) {
// start fragment
- RestrictedAppDetails.startRestrictedAppDetails(mPreferenceFragment,
- mAppInfos);
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
+ RestrictedAppDetails.startRestrictedAppDetails(mPreferenceFragment, mAppInfos);
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
.action(mContext, SettingsEnums.OPEN_APP_RESTRICTED_LIST);
return true;
}
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index 8cc59d0..82c92de 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -52,36 +52,28 @@
import java.util.List;
-/**
- * Fragment to show a list of anomaly apps, where user could handle these anomalies
- */
-public class RestrictedAppDetails extends DashboardFragment implements
- BatteryTipPreferenceController.BatteryTipListener {
+/** Fragment to show a list of anomaly apps, where user could handle these anomalies */
+public class RestrictedAppDetails extends DashboardFragment
+ implements BatteryTipPreferenceController.BatteryTipListener {
public static final String TAG = "RestrictedAppDetails";
- @VisibleForTesting
- static final String EXTRA_APP_INFO_LIST = "app_info_list";
+ @VisibleForTesting static final String EXTRA_APP_INFO_LIST = "app_info_list";
private static final String KEY_PREF_RESTRICTED_APP_LIST = "restrict_app_list";
private static final long TIME_NULL = -1;
- @VisibleForTesting
- List<AppInfo> mAppInfos;
- @VisibleForTesting
- IconDrawableFactory mIconDrawableFactory;
- @VisibleForTesting
- PreferenceGroup mRestrictedAppListGroup;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
- @VisibleForTesting
- PackageManager mPackageManager;
- @VisibleForTesting
- BatteryDatabaseManager mBatteryDatabaseManager;
+ @VisibleForTesting List<AppInfo> mAppInfos;
+ @VisibleForTesting IconDrawableFactory mIconDrawableFactory;
+ @VisibleForTesting PreferenceGroup mRestrictedAppListGroup;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
+ @VisibleForTesting PackageManager mPackageManager;
+ @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager;
private MetricsFeatureProvider mMetricsFeatureProvider;
- public static void startRestrictedAppDetails(InstrumentedPreferenceFragment fragment,
- List<AppInfo> appInfos) {
+ /** Starts restricted app details page */
+ public static void startRestrictedAppDetails(
+ InstrumentedPreferenceFragment fragment, List<AppInfo> appInfos) {
final Bundle args = new Bundle();
args.putParcelableList(EXTRA_APP_INFO_LIST, appInfos);
@@ -104,8 +96,7 @@
mIconDrawableFactory = IconDrawableFactory.newInstance(context);
mBatteryUtils = BatteryUtils.getInstance(context);
mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
- mMetricsFeatureProvider =
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
refreshUi();
}
@@ -144,39 +135,50 @@
void refreshUi() {
mRestrictedAppListGroup.removeAll();
final Context context = getPrefContext();
- final SparseLongArray timestampArray = mBatteryDatabaseManager
- .queryActionTime(AnomalyDatabaseHelper.ActionType.RESTRICTION);
+ final SparseLongArray timestampArray =
+ mBatteryDatabaseManager.queryActionTime(
+ AnomalyDatabaseHelper.ActionType.RESTRICTION);
final long now = System.currentTimeMillis();
for (int i = 0, size = mAppInfos.size(); i < size; i++) {
final CheckBoxPreference checkBoxPreference = new AppCheckBoxPreference(context);
final AppInfo appInfo = mAppInfos.get(i);
try {
- final ApplicationInfo applicationInfo = mPackageManager.getApplicationInfoAsUser(
- appInfo.packageName, 0 /* flags */, UserHandle.getUserId(appInfo.uid));
+ final ApplicationInfo applicationInfo =
+ mPackageManager.getApplicationInfoAsUser(
+ appInfo.packageName,
+ 0 /* flags */,
+ UserHandle.getUserId(appInfo.uid));
checkBoxPreference.setChecked(
mBatteryUtils.isForceAppStandbyEnabled(appInfo.uid, appInfo.packageName));
checkBoxPreference.setTitle(mPackageManager.getApplicationLabel(applicationInfo));
checkBoxPreference.setIcon(
- Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
+ Utils.getBadgedIcon(
+ mIconDrawableFactory,
+ mPackageManager,
appInfo.packageName,
UserHandle.getUserId(appInfo.uid)));
checkBoxPreference.setKey(getKeyFromAppInfo(appInfo));
- checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
- final BatteryTipDialogFragment fragment = createDialogFragment(appInfo,
- (Boolean) value);
- fragment.setTargetFragment(this, 0 /* requestCode */);
- fragment.show(getFragmentManager(), TAG);
- mMetricsFeatureProvider.action(getContext(),
- SettingsEnums.ACTION_APP_RESTRICTED_LIST_UNCHECKED,
- appInfo.packageName);
- return false;
- });
+ checkBoxPreference.setOnPreferenceChangeListener(
+ (pref, value) -> {
+ final BatteryTipDialogFragment fragment =
+ createDialogFragment(appInfo, (Boolean) value);
+ fragment.setTargetFragment(this, 0 /* requestCode */);
+ fragment.show(getFragmentManager(), TAG);
+ mMetricsFeatureProvider.action(
+ getContext(),
+ SettingsEnums.ACTION_APP_RESTRICTED_LIST_UNCHECKED,
+ appInfo.packageName);
+ return false;
+ });
final long timestamp = timestampArray.get(appInfo.uid, TIME_NULL);
if (timestamp != TIME_NULL) {
- checkBoxPreference.setSummary(getString(R.string.restricted_app_time_summary,
- StringUtil.formatRelativeTime(context, now - timestamp, false)));
+ checkBoxPreference.setSummary(
+ getString(
+ R.string.restricted_app_time_summary,
+ StringUtil.formatRelativeTime(
+ context, now - timestamp, false)));
}
final CharSequence test = checkBoxPreference.getSummaryOn();
mRestrictedAppListGroup.addPreference(checkBoxPreference);
@@ -196,8 +198,9 @@
appInfo = ((UnrestrictAppTip) batteryTip).getUnrestrictAppInfo();
}
- CheckBoxPreference preference = (CheckBoxPreference) mRestrictedAppListGroup
- .findPreference(getKeyFromAppInfo(appInfo));
+ CheckBoxPreference preference =
+ (CheckBoxPreference)
+ mRestrictedAppListGroup.findPreference(getKeyFromAppInfo(appInfo));
if (preference != null) {
preference.setChecked(isRestricted);
}
@@ -205,12 +208,12 @@
@VisibleForTesting
BatteryTipDialogFragment createDialogFragment(AppInfo appInfo, boolean toRestrict) {
- final BatteryTip batteryTip = toRestrict
- ? new RestrictAppTip(BatteryTip.StateType.NEW, appInfo)
- : new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo);
+ final BatteryTip batteryTip =
+ toRestrict
+ ? new RestrictAppTip(BatteryTip.StateType.NEW, appInfo)
+ : new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo);
- return BatteryTipDialogFragment.newInstance(
- batteryTip, getMetricsCategory());
+ return BatteryTipDialogFragment.newInstance(batteryTip, getMetricsCategory());
}
@VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
deleted file mode 100644
index 7db77f1..0000000
--- a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
-
-public class RestrictedPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin {
-
- private static final String TAG = "RESTRICTED_PREF";
-
- @VisibleForTesting String KEY_RESTRICTED_PREF = "restricted_pref";
- @VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
-
- public RestrictedPreferenceController(Context context, int uid, String packageName) {
- super(context);
- mBatteryOptimizeUtils = new BatteryOptimizeUtils(context, uid, packageName);
- }
-
- @Override
- public void updateState(Preference preference) {
-
- if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) {
- Log.d(TAG, "disable preference for " + mBatteryOptimizeUtils.getPackageName());
- preference.setEnabled(false);
- return;
- } else {
- preference.setEnabled(true);
- }
-
- if (mBatteryOptimizeUtils.getAppOptimizationMode()
- == BatteryOptimizeUtils.MODE_RESTRICTED) {
- Log.d(TAG, "is restricted states");
- ((SelectorWithWidgetPreference) preference).setChecked(true);
- } else {
- ((SelectorWithWidgetPreference) preference).setChecked(false);
- if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
- Log.d(TAG, "is system or default app, disable pref");
- preference.setEnabled(false);
- }
- }
- }
-
- @Override
- public boolean isAvailable() {
- return true;
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_RESTRICTED_PREF;
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- return getPreferenceKey().equals(preference.getKey());
- }
-}
diff --git a/src/com/android/settings/fuelgauge/SmartBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/SmartBatteryPreferenceController.java
index 7afd119..ba292f2 100644
--- a/src/com/android/settings/fuelgauge/SmartBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/SmartBatteryPreferenceController.java
@@ -28,11 +28,9 @@
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
-/**
- * Controller to change and update the smart battery toggle
- */
-public class SmartBatteryPreferenceController extends BasePreferenceController implements
- Preference.OnPreferenceChangeListener {
+/** Controller to change and update the smart battery toggle */
+public class SmartBatteryPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
private static final String KEY_SMART_BATTERY = "smart_battery";
private static final int ON = 1;
@@ -70,16 +68,22 @@
@Override
public void updateState(Preference preference) {
super.updateState(preference);
- final boolean smartBatteryOn = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON;
+ final boolean smartBatteryOn =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED,
+ ON)
+ == ON;
((TwoStatePreference) preference).setChecked(smartBatteryOn);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean smartBatteryOn = (Boolean) newValue;
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, smartBatteryOn ? ON : OFF);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED,
+ smartBatteryOn ? ON : OFF);
return true;
}
}
diff --git a/src/com/android/settings/fuelgauge/SmartBatterySettings.java b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
index 88b1fc9..44dba9a 100644
--- a/src/com/android/settings/fuelgauge/SmartBatterySettings.java
+++ b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
@@ -32,9 +32,7 @@
import java.util.Arrays;
import java.util.List;
-/**
- * Fragment to show smart battery and restricted app controls
- */
+/** Fragment to show smart battery and restricted app controls */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class SmartBatterySettings extends DashboardFragment {
public static final String TAG = "SmartBatterySettings";
@@ -65,12 +63,12 @@
}
private static List<AbstractPreferenceController> buildPreferenceControllers(
- Context context, SettingsActivity settingsActivity,
+ Context context,
+ SettingsActivity settingsActivity,
InstrumentedPreferenceFragment fragment) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
if (settingsActivity != null && fragment != null) {
- controllers.add(
- new RestrictAppPreferenceController(fragment));
+ controllers.add(new RestrictAppPreferenceController(fragment));
} else {
controllers.add(new RestrictAppPreferenceController(context));
}
diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index b514888..0f54f3e 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -34,15 +34,13 @@
import com.android.settingslib.core.lifecycle.events.OnStop;
import com.android.settingslib.utils.ThreadUtils;
-public class TopLevelBatteryPreferenceController extends BasePreferenceController implements
- LifecycleObserver, OnStart, OnStop, BatteryPreferenceController {
+public class TopLevelBatteryPreferenceController extends BasePreferenceController
+ implements LifecycleObserver, OnStart, OnStop, BatteryPreferenceController {
private static final String TAG = "TopLvBatteryPrefControl";
- @VisibleForTesting
- Preference mPreference;
- @VisibleForTesting
- protected boolean mIsBatteryPresent = true;
+ @VisibleForTesting Preference mPreference;
+ @VisibleForTesting protected boolean mIsBatteryPresent = true;
private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
@@ -53,28 +51,33 @@
public TopLevelBatteryPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
- mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
- Log.d(TAG, "onBatteryChanged: type=" + type);
- if (type == BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT) {
- mIsBatteryPresent = false;
- }
- BatteryInfo.getBatteryInfo(mContext, info -> {
- Log.d(TAG, "getBatteryInfo: " + info);
- mBatteryInfo = info;
- updateState(mPreference);
- // Update the preference summary text to the latest state.
- setSummaryAsync(info);
- }, true /* shortString */);
- });
+ mBatteryBroadcastReceiver.setBatteryChangedListener(
+ type -> {
+ Log.d(TAG, "onBatteryChanged: type=" + type);
+ if (type == BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT) {
+ mIsBatteryPresent = false;
+ }
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ info -> {
+ Log.d(TAG, "getBatteryInfo: " + info);
+ mBatteryInfo = info;
+ updateState(mPreference);
+ // Update the preference summary text to the latest state.
+ setSummaryAsync(info);
+ },
+ true /* shortString */);
+ });
- mBatteryStatusFeatureProvider = FeatureFactory.getFeatureFactory()
- .getBatteryStatusFeatureProvider();
+ mBatteryStatusFeatureProvider =
+ FeatureFactory.getFeatureFactory().getBatteryStatusFeatureProvider();
}
@Override
public int getAvailabilityStatus() {
return mContext.getResources().getBoolean(R.bool.config_show_top_level_battery)
- ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
@@ -106,13 +109,17 @@
return getDashboardLabel(mContext, mBatteryInfo, batteryStatusUpdate);
}
- protected CharSequence getDashboardLabel(Context context, BatteryInfo info,
- boolean batteryStatusUpdate) {
+ protected CharSequence getDashboardLabel(
+ Context context, BatteryInfo info, boolean batteryStatusUpdate) {
if (info == null || context == null) {
return null;
}
- Log.d(TAG, "getDashboardLabel: " + mBatteryStatusLabel + " batteryStatusUpdate="
- + batteryStatusUpdate);
+ Log.d(
+ TAG,
+ "getDashboardLabel: "
+ + mBatteryStatusLabel
+ + " batteryStatusUpdate="
+ + batteryStatusUpdate);
if (batteryStatusUpdate) {
setSummaryAsync(info);
@@ -121,19 +128,24 @@
}
private void setSummaryAsync(BatteryInfo info) {
- ThreadUtils.postOnBackgroundThread(() -> {
- // Return false if built-in status should be used, will use updateBatteryStatus()
- // method to inject the customized battery status label.
- final boolean triggerBatteryStatusUpdate =
- mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info);
- ThreadUtils.postOnMainThread(() -> {
- if (!triggerBatteryStatusUpdate) {
- mBatteryStatusLabel = null; // will generateLabel()
- }
- mPreference.setSummary(
- mBatteryStatusLabel == null ? generateLabel(info) : mBatteryStatusLabel);
- });
- });
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ // Return false if built-in status should be used, will use
+ // updateBatteryStatus()
+ // method to inject the customized battery status label.
+ final boolean triggerBatteryStatusUpdate =
+ mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info);
+ ThreadUtils.postOnMainThread(
+ () -> {
+ if (!triggerBatteryStatusUpdate) {
+ mBatteryStatusLabel = null; // will generateLabel()
+ }
+ mPreference.setSummary(
+ mBatteryStatusLabel == null
+ ? generateLabel(info)
+ : mBatteryStatusLabel);
+ });
+ });
}
private CharSequence generateLabel(BatteryInfo info) {
@@ -156,9 +168,7 @@
}
}
- /**
- * Callback which receives text for the label.
- */
+ /** Callback which receives text for the label. */
@Override
public void updateBatteryStatus(String label, BatteryInfo info) {
mBatteryStatusLabel = label; // Null if adaptive charging is not active
diff --git a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
index 4578723..652941b 100644
--- a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
@@ -17,7 +17,6 @@
package com.android.settings.fuelgauge;
import android.content.Context;
-import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -31,7 +30,8 @@
private static final String TAG = "UNRESTRICTED_PREF";
- @VisibleForTesting String KEY_UNRESTRICTED_PREF = "unrestricted_pref";
+ @VisibleForTesting static final String KEY_UNRESTRICTED_PREF = "unrestricted_preference";
+
@VisibleForTesting BatteryOptimizeUtils mBatteryOptimizeUtils;
public UnrestrictedPreferenceController(Context context, int uid, String packageName) {
@@ -41,26 +41,12 @@
@Override
public void updateState(Preference preference) {
+ preference.setEnabled(mBatteryOptimizeUtils.isSelectorPreferenceEnabled());
- if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) {
- Log.d(TAG, "disable preference for " + mBatteryOptimizeUtils.getPackageName());
- preference.setEnabled(false);
- return;
- } else {
- preference.setEnabled(true);
- }
-
- if (mBatteryOptimizeUtils.getAppOptimizationMode()
- == BatteryOptimizeUtils.MODE_UNRESTRICTED) {
- Log.d(TAG, "is unrestricted states");
- ((SelectorWithWidgetPreference) preference).setChecked(true);
- } else {
- ((SelectorWithWidgetPreference) preference).setChecked(false);
- if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
- Log.d(TAG, "is system or default app, disable pref");
- preference.setEnabled(false);
- }
- }
+ final boolean isUnrestricted =
+ mBatteryOptimizeUtils.getAppOptimizationMode()
+ == BatteryOptimizeUtils.MODE_UNRESTRICTED;
+ ((SelectorWithWidgetPreference) preference).setChecked(isUnrestricted);
}
@Override
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
index be364ee..5c57c0c 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
@@ -37,12 +37,9 @@
import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.widget.MainSwitchPreference;
-/**
- * Controller to update the battery saver button
- */
-public class BatterySaverButtonPreferenceController extends
- TogglePreferenceController implements LifecycleObserver, OnStart, OnStop,
- BatterySaverReceiver.BatterySaverListener {
+/** Controller to update the battery saver button */
+public class BatterySaverButtonPreferenceController extends TogglePreferenceController
+ implements LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
private static final long SWITCH_ANIMATION_DURATION = 350L;
private final BatterySaverReceiver mBatterySaverReceiver;
@@ -104,8 +101,8 @@
@Override
public boolean setChecked(boolean stateOn) {
- return BatterySaverUtils.setPowerSaveMode(mContext, stateOn,
- false /* needFirstTimeWarning */, SAVER_ENABLED_SETTINGS);
+ return BatterySaverUtils.setPowerSaveMode(
+ mContext, stateOn, false /* needFirstTimeWarning */, SAVER_ENABLED_SETTINGS);
}
@Override
@@ -115,8 +112,7 @@
@Override
public void onPowerSaveModeChanged() {
- mHandler.postDelayed(() -> onPowerSaveModeChangedInternal(),
- SWITCH_ANIMATION_DURATION);
+ mHandler.postDelayed(() -> onPowerSaveModeChangedInternal(), SWITCH_ANIMATION_DURATION);
}
private void onPowerSaveModeChangedInternal() {
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceController.java
index dce1903..ebec5cf 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceController.java
@@ -32,17 +32,14 @@
import com.android.settingslib.fuelgauge.BatterySaverUtils;
/**
- * Simple controller to navigate users to the scheduling page from
- * "Settings > Battery > Battery Saver". Also updates the summary for preference based on
- * the currently selected settings.
+ * Simple controller to navigate users to the scheduling page from "Settings > Battery > Battery
+ * Saver". Also updates the summary for preference based on the currently selected settings.
*/
public class BatterySaverSchedulePreferenceController extends BasePreferenceController {
- @VisibleForTesting
- Preference mBatterySaverSchedulePreference;
+ @VisibleForTesting Preference mBatterySaverSchedulePreference;
public static final String KEY_BATTERY_SAVER_SCHEDULE = "battery_saver_schedule";
-
public BatterySaverSchedulePreferenceController(Context context) {
super(context, KEY_BATTERY_SAVER_SCHEDULE);
BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
@@ -66,7 +63,8 @@
if (KEY_PERCENTAGE.equals(mode)) {
final int threshold =
Settings.Global.getInt(resolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- return mContext.getString(R.string.battery_saver_auto_percentage_summary,
+ return mContext.getString(
+ R.string.battery_saver_auto_percentage_summary,
Utils.formatPercentage(threshold));
}
return mContext.getText(R.string.battery_saver_auto_no_schedule);
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java
index 4266bea..45c1be0 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java
@@ -31,12 +31,12 @@
/**
* Responds to user actions in the Settings > Battery > Set a Schedule Screen
*
- * Note that this is not a preference controller since that screen does not inherit from
+ * <p>Note that this is not a preference controller since that screen does not inherit from
* DashboardFragment.
*
- * Will call the appropriate power manager APIs and modify the correct settings to enable
- * users to control their automatic battery saver toggling preferences.
- * See {@link Settings.Global#AUTOMATIC_POWER_SAVE_MODE} for more details.
+ * <p>Will call the appropriate power manager APIs and modify the correct settings to enable users
+ * to control their automatic battery saver toggling preferences. See {@link
+ * Settings.Global#AUTOMATIC_POWER_SAVE_MODE} for more details.
*/
public class BatterySaverScheduleRadioButtonsController {
private static final String TAG = "BatterySaverScheduleRadioButtonsController";
@@ -46,8 +46,8 @@
private Context mContext;
private BatterySaverScheduleSeekBarController mSeekBarController;
- public BatterySaverScheduleRadioButtonsController(Context context,
- BatterySaverScheduleSeekBarController seekbar) {
+ public BatterySaverScheduleRadioButtonsController(
+ Context context, BatterySaverScheduleSeekBarController seekbar) {
mContext = context;
mSeekBarController = seekbar;
}
@@ -67,10 +67,11 @@
case KEY_PERCENTAGE:
triggerLevel = TRIGGER_LEVEL_MIN;
confirmationExtras.putBoolean(BatterySaverUtils.EXTRA_CONFIRM_TEXT_ONLY, true);
- confirmationExtras.putInt(BatterySaverUtils.EXTRA_POWER_SAVE_MODE_TRIGGER,
+ confirmationExtras.putInt(
+ BatterySaverUtils.EXTRA_POWER_SAVE_MODE_TRIGGER,
PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
- confirmationExtras.putInt(BatterySaverUtils.EXTRA_POWER_SAVE_MODE_TRIGGER_LEVEL,
- triggerLevel);
+ confirmationExtras.putInt(
+ BatterySaverUtils.EXTRA_POWER_SAVE_MODE_TRIGGER_LEVEL, triggerLevel);
break;
default:
throw new IllegalStateException(
@@ -79,7 +80,7 @@
if (!TextUtils.equals(key, KEY_NO_SCHEDULE)
&& BatterySaverUtils.maybeShowBatterySaverConfirmation(
- mContext, confirmationExtras)) {
+ mContext, confirmationExtras)) {
// reset this if we need to show the confirmation message
mode = PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE;
triggerLevel = 0;
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java
index 687221e..8580f6e 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java
@@ -35,30 +35,28 @@
import com.android.settingslib.fuelgauge.BatterySaverUtils;
/**
- * Responds to user actions in the Settings > Battery > Set a Schedule Screen for the seekbar.
- * Note that this seekbar is only visible when the radio button selected is "Percentage".
+ * Responds to user actions in the Settings > Battery > Set a Schedule Screen for the seekbar. Note
+ * that this seekbar is only visible when the radio button selected is "Percentage".
*
- * Note that this is not a preference controller since that screen does not inherit from
+ * <p>Note that this is not a preference controller since that screen does not inherit from
* DashboardFragment.
*
- * Will call the appropriate power manager APIs and modify the correct settings to enable
- * users to control their automatic battery saver toggling preferences.
- * See {@link Settings.Global#AUTOMATIC_POWER_SAVE_MODE} for more details.
+ * <p>Will call the appropriate power manager APIs and modify the correct settings to enable users
+ * to control their automatic battery saver toggling preferences. See {@link
+ * Settings.Global#AUTOMATIC_POWER_SAVE_MODE} for more details.
*/
-public class BatterySaverScheduleSeekBarController implements
- OnPreferenceChangeListener, OnSeekBarChangeListener {
+public class BatterySaverScheduleSeekBarController
+ implements OnPreferenceChangeListener, OnSeekBarChangeListener {
public static final int MAX_SEEKBAR_VALUE = 15;
public static final int MIN_SEEKBAR_VALUE = 2;
public static final String KEY_BATTERY_SAVER_SEEK_BAR = "battery_saver_seek_bar";
private static final int LEVEL_UNIT_SCALE = 5;
- @VisibleForTesting
- public SeekBarPreference mSeekBarPreference;
+ @VisibleForTesting public SeekBarPreference mSeekBarPreference;
private Context mContext;
- @VisibleForTesting
- int mPercentage;
+ @VisibleForTesting int mPercentage;
public BatterySaverScheduleSeekBarController(Context context) {
mContext = context;
@@ -93,7 +91,8 @@
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (mPercentage > 0) {
- Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
Global.LOW_POWER_MODE_TRIGGER_LEVEL,
mPercentage);
}
@@ -108,8 +107,7 @@
final int currentSeekbarValue = Math.max(threshold / 5, MIN_SEEKBAR_VALUE);
mSeekBarPreference.setVisible(true);
mSeekBarPreference.setProgress(currentSeekbarValue);
- final CharSequence stateDescription = formatStateDescription(
- currentSeekbarValue * 5);
+ final CharSequence stateDescription = formatStateDescription(currentSeekbarValue * 5);
mSeekBarPreference.setTitle(stateDescription);
mSeekBarPreference.overrideSeekBarStateDescription(stateDescription);
} else {
@@ -130,7 +128,7 @@
}
private CharSequence formatStateDescription(int percentage) {
- return mContext.getString(R.string.battery_saver_seekbar_title,
- Utils.formatPercentage(percentage));
+ return mContext.getString(
+ R.string.battery_saver_seekbar_title, Utils.formatPercentage(percentage));
}
}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java
index 2d841bd..cded470 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java
@@ -49,32 +49,32 @@
import java.util.List;
/**
- * Fragment that allows users to customize their automatic battery saver mode settings.
- *
- * Location: Settings > Battery > Battery Saver > Set a Schedule
+ * Fragment that allows users to customize their automatic battery saver mode settings. <br>
+ * <br>
+ * Location: Settings > Battery > Battery Saver > Set a Schedule <br>
* See {@link BatterySaverSchedulePreferenceController} for the controller that manages navigation
- * to this screen from "Settings > Battery > Battery Saver" and the summary.
- * See {@link BatterySaverScheduleRadioButtonsController} &
- * {@link BatterySaverScheduleSeekBarController} for the controller that manages user
- * interactions in this screen.
+ * to this screen from "Settings > Battery > Battery Saver" and the summary. <br>
+ * See {@link BatterySaverScheduleRadioButtonsController} & {@link
+ * BatterySaverScheduleSeekBarController} for the controller that manages user interactions in this
+ * screen.
*/
public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
public BatterySaverScheduleRadioButtonsController mRadioButtonController;
- @VisibleForTesting
- Context mContext;
+ @VisibleForTesting Context mContext;
private int mSaverPercentage;
private String mSaverScheduleKey;
private BatterySaverScheduleSeekBarController mSeekBarController;
@VisibleForTesting
- final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- getPreferenceScreen().removeAll();
- updateCandidates();
- }
- };
+ final ContentObserver mSettingsObserver =
+ new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ getPreferenceScreen().removeAll();
+ updateCandidates();
+ }
+ };
@Override
protected int getPreferenceScreenResId() {
@@ -85,18 +85,19 @@
public void onAttach(Context context) {
super.onAttach(context);
mSeekBarController = new BatterySaverScheduleSeekBarController(context);
- mRadioButtonController = new BatterySaverScheduleRadioButtonsController(
- context, mSeekBarController);
+ mRadioButtonController =
+ new BatterySaverScheduleRadioButtonsController(context, mSeekBarController);
mContext = context;
}
@Override
public void onResume() {
super.onResume();
- mContext.getContentResolver().registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
- false,
- mSettingsObserver);
+ mContext.getContentResolver()
+ .registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
+ false,
+ mSettingsObserver);
mSaverScheduleKey = BatterySaverUtils.getBatterySaverScheduleKey(mContext);
mSaverPercentage = getSaverPercentage();
}
@@ -124,24 +125,30 @@
protected List<? extends CandidateInfo> getCandidates() {
Context context = getContext();
List<CandidateInfo> candidates = Lists.newArrayList();
- candidates.add(new BatterySaverScheduleCandidateInfo(
- context.getText(R.string.battery_saver_auto_no_schedule),
- /* summary */ null,
- KEY_NO_SCHEDULE,
- /* enabled */ true));
+ candidates.add(
+ new BatterySaverScheduleCandidateInfo(
+ context.getText(R.string.battery_saver_auto_no_schedule),
+ /* summary */ null,
+ KEY_NO_SCHEDULE,
+ /* enabled */ true));
BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
- candidates.add(new BatterySaverScheduleCandidateInfo(
- context.getText(R.string.battery_saver_auto_percentage),
- /* summary */ null,
- KEY_PERCENTAGE,
- /* enabled */ true));
+ candidates.add(
+ new BatterySaverScheduleCandidateInfo(
+ context.getText(R.string.battery_saver_auto_percentage),
+ /* summary */ null,
+ KEY_PERCENTAGE,
+ /* enabled */ true));
return candidates;
}
@Override
- public void bindPreferenceExtra(SelectorWithWidgetPreference pref, String key,
- CandidateInfo info, String defaultKey, String systemDefaultKey) {
+ public void bindPreferenceExtra(
+ SelectorWithWidgetPreference pref,
+ String key,
+ CandidateInfo info,
+ String defaultKey,
+ String systemDefaultKey) {
final BatterySaverScheduleCandidateInfo candidateInfo =
(BatterySaverScheduleCandidateInfo) info;
final CharSequence summary = candidateInfo.getSummary();
@@ -174,14 +181,16 @@
private void logPowerSaver() {
final int currentSaverPercentage = getSaverPercentage();
- final String currentSaverScheduleKey = BatterySaverUtils.getBatterySaverScheduleKey(
- mContext);
+ final String currentSaverScheduleKey =
+ BatterySaverUtils.getBatterySaverScheduleKey(mContext);
if (mSaverScheduleKey.equals(currentSaverScheduleKey)
&& mSaverPercentage == currentSaverPercentage) {
return;
}
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
- .action(SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ FeatureFactory.getFeatureFactory()
+ .getMetricsFeatureProvider()
+ .action(
+ SettingsEnums.FUELGAUGE_BATTERY_SAVER,
SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
currentSaverScheduleKey,
@@ -189,8 +198,8 @@
}
private int getSaverPercentage() {
- return Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1);
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1);
}
static class BatterySaverScheduleCandidateInfo extends CandidateInfo {
@@ -199,8 +208,8 @@
private final CharSequence mSummary;
private final String mKey;
- BatterySaverScheduleCandidateInfo(CharSequence label, CharSequence summary, String key,
- boolean enabled) {
+ BatterySaverScheduleCandidateInfo(
+ CharSequence label, CharSequence summary, String key, boolean enabled) {
super(enabled);
mLabel = label;
mKey = key;
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
index c86775f..8e281de 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
@@ -28,9 +28,7 @@
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.FooterPreference;
-/**
- * Battery saver settings page
- */
+/** Battery saver settings page */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class BatterySaverSettings extends DashboardFragment {
private static final String TAG = "BatterySaverSettings";
@@ -63,9 +61,7 @@
return R.string.help_url_battery_saver_settings;
}
- /**
- * For Search.
- */
+ /** For Search. */
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.battery_saver_settings);
@@ -83,13 +79,17 @@
void addHelpLink() {
FooterPreference pref = getPreferenceScreen().findPreference(KEY_FOOTER_PREFERENCE);
if (pref != null) {
- pref.setLearnMoreAction(v -> {
- mMetricsFeatureProvider.action(getContext(),
- SettingsEnums.ACTION_APP_BATTERY_LEARN_MORE);
- startActivityForResult(HelpUtils.getHelpIntent(getContext(),
- getString(R.string.help_url_battery_saver_settings),
- /*backupContext=*/ ""), /*requestCode=*/ 0);
- });
+ pref.setLearnMoreAction(
+ v -> {
+ mMetricsFeatureProvider.action(
+ getContext(), SettingsEnums.ACTION_APP_BATTERY_LEARN_MORE);
+ startActivityForResult(
+ HelpUtils.getHelpIntent(
+ getContext(),
+ getString(R.string.help_url_battery_saver_settings),
+ /* backupContext= */ ""),
+ /* requestCode= */ 0);
+ });
pref.setLearnMoreText(getString(R.string.battery_saver_link_a11y));
}
}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
index 0a39909..dea4e4d 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
@@ -12,8 +12,8 @@
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
-public class BatterySaverStickyPreferenceController extends TogglePreferenceController implements
- PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
+public class BatterySaverStickyPreferenceController extends TogglePreferenceController
+ implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
private static final int DEFAULT_STICKY_SHUTOFF_LEVEL = 90;
private Context mContext;
@@ -25,34 +25,46 @@
@Override
public boolean isChecked() {
- return Settings.Global.getInt(mContext.getContentResolver(),
- Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED, 1) == 1;
+ return Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED,
+ 1)
+ == 1;
}
@Override
public boolean setChecked(boolean isChecked) {
- Settings.Global.putInt(mContext.getContentResolver(),
- Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED,
- isChecked ? 1 : 0);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED,
+ isChecked ? 1 : 0);
return true;
}
@Override
protected void refreshSummary(Preference preference) {
super.refreshSummary(preference);
- final int stickyShutoffLevel = Settings.Global.getInt(mContext.getContentResolver(),
- Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_LEVEL, DEFAULT_STICKY_SHUTOFF_LEVEL);
+ final int stickyShutoffLevel =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_LEVEL,
+ DEFAULT_STICKY_SHUTOFF_LEVEL);
final String formatPercentage = Utils.formatPercentage(stickyShutoffLevel);
- preference.setTitle(mContext.getString(R.string.battery_saver_sticky_title_percentage,
- formatPercentage));
- preference.setSummary(mContext.getString(R.string.battery_saver_sticky_description_new,
- formatPercentage));
+ preference.setTitle(
+ mContext.getString(
+ R.string.battery_saver_sticky_title_percentage, formatPercentage));
+ preference.setSummary(
+ mContext.getString(
+ R.string.battery_saver_sticky_description_new, formatPercentage));
}
@Override
public void updateState(Preference preference) {
- int setting = Settings.Global.getInt(mContext.getContentResolver(),
- Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED, 1);
+ int setting =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED,
+ 1);
((TwoStatePreference) preference).setChecked(setting == 1);
refreshSummary(preference);
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java
index bb73142..0eaed17 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java
@@ -35,8 +35,7 @@
public class AnomalyCleanupJobService extends JobService {
private static final String TAG = "AnomalyCleanUpJobService";
- @VisibleForTesting
- static final long CLEAN_UP_FREQUENCY_MS = TimeUnit.DAYS.toMillis(1);
+ @VisibleForTesting static final long CLEAN_UP_FREQUENCY_MS = TimeUnit.DAYS.toMillis(1);
public static void scheduleCleanUp(Context context) {
final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
@@ -52,23 +51,24 @@
// Don't schedule it if it already exists, to make sure it runs periodically even after
// reboot
- if (pending == null && jobScheduler.schedule(jobBuilder.build())
- != JobScheduler.RESULT_SUCCESS) {
+ if (pending == null
+ && jobScheduler.schedule(jobBuilder.build()) != JobScheduler.RESULT_SUCCESS) {
Log.i(TAG, "Anomaly clean up job service schedule failed.");
}
}
@Override
public boolean onStartJob(JobParameters params) {
- final BatteryDatabaseManager batteryDatabaseManager = BatteryDatabaseManager
- .getInstance(this);
+ final BatteryDatabaseManager batteryDatabaseManager =
+ BatteryDatabaseManager.getInstance(this);
final BatteryTipPolicy policy = new BatteryTipPolicy(this);
- ThreadUtils.postOnBackgroundThread(() -> {
- batteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(
- System.currentTimeMillis() - TimeUnit.DAYS.toMillis(
- policy.dataHistoryRetainDay));
- jobFinished(params, false /* wantsReschedule */);
- });
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ batteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(
+ System.currentTimeMillis()
+ - TimeUnit.DAYS.toMillis(policy.dataHistoryRetainDay));
+ jobFinished(params, false /* wantsReschedule */);
+ });
return true;
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobService.java
index ad02c3a..fe75c8e 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobService.java
@@ -44,8 +44,7 @@
public static final String KEY_ANOMALY_CONFIG_VERSION = "anomaly_config_version";
private static final int DEFAULT_VERSION = 0;
- @VisibleForTesting
- static final long CONFIG_UPDATE_FREQUENCY_MS = TimeUnit.DAYS.toMillis(1);
+ @VisibleForTesting static final long CONFIG_UPDATE_FREQUENCY_MS = TimeUnit.DAYS.toMillis(1);
public static void scheduleConfigUpdate(Context context) {
final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
@@ -61,24 +60,25 @@
// Don't schedule it if it already exists, to make sure it runs periodically even after
// reboot
- if (pending == null && jobScheduler.schedule(jobBuilder.build())
- != JobScheduler.RESULT_SUCCESS) {
+ if (pending == null
+ && jobScheduler.schedule(jobBuilder.build()) != JobScheduler.RESULT_SUCCESS) {
Log.i(TAG, "Anomaly config update job service schedule failed.");
}
}
@Override
public boolean onStartJob(JobParameters params) {
- ThreadUtils.postOnBackgroundThread(() -> {
- final StatsManager statsManager = getSystemService(StatsManager.class);
- checkAnomalyConfig(statsManager);
- try {
- BatteryTipUtils.uploadAnomalyPendingIntent(this, statsManager);
- } catch (StatsManager.StatsUnavailableException e) {
- Log.w(TAG, "Failed to uploadAnomalyPendingIntent.", e);
- }
- jobFinished(params, false /* wantsReschedule */);
- });
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ final StatsManager statsManager = getSystemService(StatsManager.class);
+ checkAnomalyConfig(statsManager);
+ try {
+ BatteryTipUtils.uploadAnomalyPendingIntent(this, statsManager);
+ } catch (StatsManager.StatsUnavailableException e) {
+ Log.w(TAG, "Failed to uploadAnomalyPendingIntent.", e);
+ }
+ jobFinished(params, false /* wantsReschedule */);
+ });
return true;
}
@@ -90,37 +90,48 @@
@VisibleForTesting
synchronized void checkAnomalyConfig(StatsManager statsManager) {
- final SharedPreferences sharedPreferences = getSharedPreferences(PREF_DB,
- Context.MODE_PRIVATE);
- final int currentVersion = sharedPreferences.getInt(KEY_ANOMALY_CONFIG_VERSION,
- DEFAULT_VERSION);
- final int newVersion = Settings.Global.getInt(getContentResolver(),
- Settings.Global.ANOMALY_CONFIG_VERSION, DEFAULT_VERSION);
- final String rawConfig = Settings.Global.getString(getContentResolver(),
- Settings.Global.ANOMALY_CONFIG);
+ final SharedPreferences sharedPreferences =
+ getSharedPreferences(PREF_DB, Context.MODE_PRIVATE);
+ final int currentVersion =
+ sharedPreferences.getInt(KEY_ANOMALY_CONFIG_VERSION, DEFAULT_VERSION);
+ final int newVersion =
+ Settings.Global.getInt(
+ getContentResolver(),
+ Settings.Global.ANOMALY_CONFIG_VERSION,
+ DEFAULT_VERSION);
+ final String rawConfig =
+ Settings.Global.getString(getContentResolver(), Settings.Global.ANOMALY_CONFIG);
Log.i(TAG, "CurrentVersion: " + currentVersion + " new version: " + newVersion);
if (newVersion > currentVersion) {
try {
statsManager.removeConfig(StatsManagerConfig.ANOMALY_CONFIG_KEY);
} catch (StatsManager.StatsUnavailableException e) {
- Log.i(TAG, "When updating anomaly config, failed to first remove the old config "
- + StatsManagerConfig.ANOMALY_CONFIG_KEY, e);
+ Log.i(
+ TAG,
+ "When updating anomaly config, failed to first remove the old config "
+ + StatsManagerConfig.ANOMALY_CONFIG_KEY,
+ e);
}
if (!TextUtils.isEmpty(rawConfig)) {
try {
final byte[] config = Base64.decode(rawConfig, Base64.DEFAULT);
statsManager.addConfig(StatsManagerConfig.ANOMALY_CONFIG_KEY, config);
- Log.i(TAG, "Upload the anomaly config. configKey: "
- + StatsManagerConfig.ANOMALY_CONFIG_KEY);
+ Log.i(
+ TAG,
+ "Upload the anomaly config. configKey: "
+ + StatsManagerConfig.ANOMALY_CONFIG_KEY);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(KEY_ANOMALY_CONFIG_VERSION, newVersion);
editor.commit();
} catch (IllegalArgumentException e) {
Log.e(TAG, "Anomaly raw config is in wrong format", e);
} catch (StatsManager.StatsUnavailableException e) {
- Log.i(TAG, "Upload of anomaly config failed for configKey "
- + StatsManagerConfig.ANOMALY_CONFIG_KEY, e);
+ Log.i(
+ TAG,
+ "Upload of anomaly config failed for configKey "
+ + StatsManagerConfig.ANOMALY_CONFIG_KEY,
+ e);
}
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
index 369e613..538b047 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
@@ -23,8 +23,8 @@
import android.util.Log;
/**
- * Receive broadcast when {@link StatsManager} restart, then check the anomaly config and
- * prepare info for {@link StatsManager}
+ * Receive broadcast when {@link StatsManager} restart, then check the anomaly config and prepare
+ * info for {@link StatsManager}
*/
public class AnomalyConfigReceiver extends BroadcastReceiver {
private static final String TAG = "AnomalyConfigReceiver";
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
index 349a419..6ec516e 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
@@ -26,9 +26,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-/**
- * Database controls the anomaly logging(e.g. packageName, anomalyType and time)
- */
+/** Database controls the anomaly logging(e.g. packageName, anomalyType and time) */
public class AnomalyDatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "BatteryDatabaseHelper";
@@ -36,9 +34,7 @@
private static final int DATABASE_VERSION = 5;
@Retention(RetentionPolicy.SOURCE)
- @IntDef({State.NEW,
- State.HANDLED,
- State.AUTO_HANDLED})
+ @IntDef({State.NEW, State.HANDLED, State.AUTO_HANDLED})
public @interface State {
int NEW = 0;
int HANDLED = 1;
@@ -57,81 +53,92 @@
}
public interface AnomalyColumns {
- /**
- * The package name of the anomaly app
- */
+ /** The package name of the anomaly app */
String PACKAGE_NAME = "package_name";
- /**
- * The uid of the anomaly app
- */
+
+ /** The uid of the anomaly app */
String UID = "uid";
+
/**
* The type of the anomaly app
+ *
* @see StatsManagerConfig.AnomalyType
*/
String ANOMALY_TYPE = "anomaly_type";
+
/**
* The state of the anomaly app
+ *
* @see State
*/
String ANOMALY_STATE = "anomaly_state";
- /**
- * The time when anomaly happens
- */
+
+ /** The time when anomaly happens */
String TIME_STAMP_MS = "time_stamp_ms";
}
private static final String CREATE_ANOMALY_TABLE =
- "CREATE TABLE " + Tables.TABLE_ANOMALY +
- "(" +
- AnomalyColumns.UID +
- " INTEGER NOT NULL, " +
- AnomalyColumns.PACKAGE_NAME +
- " TEXT, " +
- AnomalyColumns.ANOMALY_TYPE +
- " INTEGER NOT NULL, " +
- AnomalyColumns.ANOMALY_STATE +
- " INTEGER NOT NULL, " +
- AnomalyColumns.TIME_STAMP_MS +
- " INTEGER NOT NULL, " +
- " PRIMARY KEY (" + AnomalyColumns.UID + "," + AnomalyColumns.ANOMALY_TYPE + ","
- + AnomalyColumns.ANOMALY_STATE + "," + AnomalyColumns.TIME_STAMP_MS + ")"
+ "CREATE TABLE "
+ + Tables.TABLE_ANOMALY
+ + "("
+ + AnomalyColumns.UID
+ + " INTEGER NOT NULL, "
+ + AnomalyColumns.PACKAGE_NAME
+ + " TEXT, "
+ + AnomalyColumns.ANOMALY_TYPE
+ + " INTEGER NOT NULL, "
+ + AnomalyColumns.ANOMALY_STATE
+ + " INTEGER NOT NULL, "
+ + AnomalyColumns.TIME_STAMP_MS
+ + " INTEGER NOT NULL, "
+ + " PRIMARY KEY ("
+ + AnomalyColumns.UID
+ + ","
+ + AnomalyColumns.ANOMALY_TYPE
+ + ","
+ + AnomalyColumns.ANOMALY_STATE
+ + ","
+ + AnomalyColumns.TIME_STAMP_MS
+ + ")"
+ ")";
-
public interface ActionColumns {
- /**
- * The package name of an app been performed an action
- */
+ /** The package name of an app been performed an action */
String PACKAGE_NAME = "package_name";
- /**
- * The uid of an app been performed an action
- */
+
+ /** The uid of an app been performed an action */
String UID = "uid";
+
/**
* The type of user action
+ *
* @see ActionType
*/
String ACTION_TYPE = "action_type";
- /**
- * The time when action been performed
- */
+
+ /** The time when action been performed */
String TIME_STAMP_MS = "time_stamp_ms";
}
private static final String CREATE_ACTION_TABLE =
- "CREATE TABLE " + Tables.TABLE_ACTION +
- "(" +
- ActionColumns.UID +
- " INTEGER NOT NULL, " +
- ActionColumns.PACKAGE_NAME +
- " TEXT, " +
- ActionColumns.ACTION_TYPE +
- " INTEGER NOT NULL, " +
- ActionColumns.TIME_STAMP_MS +
- " INTEGER NOT NULL, " +
- " PRIMARY KEY (" + ActionColumns.ACTION_TYPE + "," + ActionColumns.UID + ","
- + ActionColumns.PACKAGE_NAME + ")"
+ "CREATE TABLE "
+ + Tables.TABLE_ACTION
+ + "("
+ + ActionColumns.UID
+ + " INTEGER NOT NULL, "
+ + ActionColumns.PACKAGE_NAME
+ + " TEXT, "
+ + ActionColumns.ACTION_TYPE
+ + " INTEGER NOT NULL, "
+ + ActionColumns.TIME_STAMP_MS
+ + " INTEGER NOT NULL, "
+ + " PRIMARY KEY ("
+ + ActionColumns.ACTION_TYPE
+ + ","
+ + ActionColumns.UID
+ + ","
+ + ActionColumns.PACKAGE_NAME
+ + ")"
+ ")";
private static AnomalyDatabaseHelper sSingleton;
@@ -155,8 +162,14 @@
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < DATABASE_VERSION) {
- Log.w(TAG, "Detected schema version '" + oldVersion + "'. " +
- "Index needs to be rebuilt for schema version '" + newVersion + "'.");
+ Log.w(
+ TAG,
+ "Detected schema version '"
+ + oldVersion
+ + "'. "
+ + "Index needs to be rebuilt for schema version '"
+ + newVersion
+ + "'.");
// We need to drop the tables and recreate them
reconstruct(db);
}
@@ -164,8 +177,14 @@
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- Log.w(TAG, "Detected schema version '" + oldVersion + "'. " +
- "Index needs to be rebuilt for schema version '" + newVersion + "'.");
+ Log.w(
+ TAG,
+ "Detected schema version '"
+ + oldVersion
+ + "'. "
+ + "Index needs to be rebuilt for schema version '"
+ + newVersion
+ + "'.");
// We need to drop the tables and recreate them
reconstruct(db);
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index 34fd72d..b1018ba 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -57,22 +57,20 @@
public class AnomalyDetectionJobService extends JobService {
private static final String TAG = "AnomalyDetectionService";
private static final int ON = 1;
- @VisibleForTesting
- static final int UID_NULL = -1;
- @VisibleForTesting
- static final int STATSD_UID_FILED = 1;
- @VisibleForTesting
- static final long MAX_DELAY_MS = TimeUnit.MINUTES.toMillis(30);
+ @VisibleForTesting static final int UID_NULL = -1;
+ @VisibleForTesting static final int STATSD_UID_FILED = 1;
+ @VisibleForTesting static final long MAX_DELAY_MS = TimeUnit.MINUTES.toMillis(30);
private final Object mLock = new Object();
+
@GuardedBy("mLock")
@VisibleForTesting
boolean mIsJobCanceled = false;
public static void scheduleAnomalyDetection(Context context, Intent intent) {
final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
- final ComponentName component = new ComponentName(context,
- AnomalyDetectionJobService.class);
+ final ComponentName component =
+ new ComponentName(context, AnomalyDetectionJobService.class);
final JobInfo.Builder jobBuilder =
new JobInfo.Builder(R.integer.job_anomaly_detection, component)
.setOverrideDeadline(MAX_DELAY_MS);
@@ -88,30 +86,40 @@
synchronized (mLock) {
mIsJobCanceled = false;
}
- ThreadUtils.postOnBackgroundThread(() -> {
- final Context context = AnomalyDetectionJobService.this;
- final BatteryDatabaseManager batteryDatabaseManager =
- BatteryDatabaseManager.getInstance(this);
- final BatteryTipPolicy policy = new BatteryTipPolicy(this);
- final BatteryUtils batteryUtils = BatteryUtils.getInstance(this);
- final ContentResolver contentResolver = getContentResolver();
- final UserManager userManager = getSystemService(UserManager.class);
- final PowerAllowlistBackend powerAllowlistBackend =
- PowerAllowlistBackend.getInstance(context);
- final PowerUsageFeatureProvider powerUsageFeatureProvider =
- FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
- final MetricsFeatureProvider metricsFeatureProvider =
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+ ThreadUtils.postOnBackgroundThread(
+ () -> {
+ final Context context = AnomalyDetectionJobService.this;
+ final BatteryDatabaseManager batteryDatabaseManager =
+ BatteryDatabaseManager.getInstance(this);
+ final BatteryTipPolicy policy = new BatteryTipPolicy(this);
+ final BatteryUtils batteryUtils = BatteryUtils.getInstance(this);
+ final ContentResolver contentResolver = getContentResolver();
+ final UserManager userManager = getSystemService(UserManager.class);
+ final PowerAllowlistBackend powerAllowlistBackend =
+ PowerAllowlistBackend.getInstance(context);
+ final PowerUsageFeatureProvider powerUsageFeatureProvider =
+ FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
+ final MetricsFeatureProvider metricsFeatureProvider =
+ FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
- for (JobWorkItem item = dequeueWork(params); item != null; item = dequeueWork(params)) {
- saveAnomalyToDatabase(context, userManager,
- batteryDatabaseManager, batteryUtils, policy, powerAllowlistBackend,
- contentResolver, powerUsageFeatureProvider, metricsFeatureProvider,
- item.getIntent().getExtras());
+ for (JobWorkItem item = dequeueWork(params);
+ item != null;
+ item = dequeueWork(params)) {
+ saveAnomalyToDatabase(
+ context,
+ userManager,
+ batteryDatabaseManager,
+ batteryUtils,
+ policy,
+ powerAllowlistBackend,
+ contentResolver,
+ powerUsageFeatureProvider,
+ metricsFeatureProvider,
+ item.getIntent().getExtras());
- completeWork(params, item);
- }
- });
+ completeWork(params, item);
+ }
+ });
return true;
}
@@ -125,34 +133,49 @@
}
@VisibleForTesting
- void saveAnomalyToDatabase(Context context, UserManager userManager,
- BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
- BatteryTipPolicy policy, PowerAllowlistBackend powerAllowlistBackend,
- ContentResolver contentResolver, PowerUsageFeatureProvider powerUsageFeatureProvider,
- MetricsFeatureProvider metricsFeatureProvider, Bundle bundle) {
+ void saveAnomalyToDatabase(
+ Context context,
+ UserManager userManager,
+ BatteryDatabaseManager databaseManager,
+ BatteryUtils batteryUtils,
+ BatteryTipPolicy policy,
+ PowerAllowlistBackend powerAllowlistBackend,
+ ContentResolver contentResolver,
+ PowerUsageFeatureProvider powerUsageFeatureProvider,
+ MetricsFeatureProvider metricsFeatureProvider,
+ Bundle bundle) {
// The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|}
final StatsDimensionsValue intentDimsValue =
bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE);
- final long timeMs = bundle.getLong(AnomalyDetectionReceiver.KEY_ANOMALY_TIMESTAMP,
- System.currentTimeMillis());
- final ArrayList<String> cookies = bundle.getStringArrayList(
- StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES);
- final AnomalyInfo anomalyInfo = new AnomalyInfo(
- !ArrayUtils.isEmpty(cookies) ? cookies.get(0) : "");
+ final long timeMs =
+ bundle.getLong(
+ AnomalyDetectionReceiver.KEY_ANOMALY_TIMESTAMP, System.currentTimeMillis());
+ final ArrayList<String> cookies =
+ bundle.getStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES);
+ final AnomalyInfo anomalyInfo =
+ new AnomalyInfo(!ArrayUtils.isEmpty(cookies) ? cookies.get(0) : "");
Log.i(TAG, "Extra stats value: " + intentDimsValue.toString());
try {
final int uid = extractUidFromStatsDimensionsValue(intentDimsValue);
- final boolean autoFeatureOn = powerUsageFeatureProvider.isSmartBatterySupported()
- ? Settings.Global.getInt(contentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON
- : Settings.Global.getInt(contentResolver,
- Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON;
+ final boolean autoFeatureOn =
+ powerUsageFeatureProvider.isSmartBatterySupported()
+ ? Settings.Global.getInt(
+ contentResolver,
+ Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED,
+ ON)
+ == ON
+ : Settings.Global.getInt(
+ contentResolver,
+ Settings.Global.APP_AUTO_RESTRICTION_ENABLED,
+ ON)
+ == ON;
final String packageName = batteryUtils.getPackageName(uid);
final long versionCode = batteryUtils.getAppLongVersionCode(packageName);
final String versionedPackage = packageName + "/" + versionCode;
if (batteryUtils.shouldHideAnomaly(powerAllowlistBackend, uid, anomalyInfo)) {
- metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+ metricsFeatureProvider.action(
+ SettingsEnums.PAGE_UNKNOWN,
SettingsEnums.ACTION_ANOMALY_IGNORED,
SettingsEnums.PAGE_UNKNOWN,
versionedPackage,
@@ -160,17 +183,23 @@
} else {
if (autoFeatureOn && anomalyInfo.autoRestriction) {
// Auto restrict this app
- batteryUtils.setForceAppStandby(uid, packageName,
- AppOpsManager.MODE_IGNORED);
- databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
+ batteryUtils.setForceAppStandby(uid, packageName, AppOpsManager.MODE_IGNORED);
+ databaseManager.insertAnomaly(
+ uid,
+ packageName,
+ anomalyInfo.anomalyType,
AnomalyDatabaseHelper.State.AUTO_HANDLED,
timeMs);
} else {
- databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
+ databaseManager.insertAnomaly(
+ uid,
+ packageName,
+ anomalyInfo.anomalyType,
AnomalyDatabaseHelper.State.NEW,
timeMs);
}
- metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+ metricsFeatureProvider.action(
+ SettingsEnums.PAGE_UNKNOWN,
SettingsEnums.ACTION_ANOMALY_TRIGGERED,
SettingsEnums.PAGE_UNKNOWN,
versionedPackage,
@@ -183,12 +212,12 @@
}
/**
- * Extract the uid from {@link StatsDimensionsValue}
- *
- * The uid dimension has the format: 1:<int> inside the tuple list. Here are some examples:
- * 1. Excessive bg anomaly: 27:{1:10089|}
- * 2. Wakeup alarm anomaly: 35:{1:{1:{1:10013|}|}|}
- * 3. Bluetooth anomaly: 3:{1:{1:{1:10140|}|}|}
+ * Extract the uid from {@link StatsDimensionsValue} <br>
+ * <br>
+ * The uid dimension has the format: {1:int} inside the tuple list. Here are some examples: <br>
+ * 1.Excessive bg anomaly: 27:{1:10089|} <br>
+ * 2.Wakeup alarm anomaly: 35:{1:{1:{1:10013|}|}|} <br>
+ * 3.Bluetooth anomaly: 3:{1:{1:{1:10140|}|}|}
*/
@VisibleForTesting
int extractUidFromStatsDimensionsValue(StatsDimensionsValue statsDimensionsValue) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java
index b1bb73a..0d43add 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java
@@ -23,9 +23,7 @@
import android.os.Bundle;
import android.util.Log;
-/**
- * Receive the anomaly info from {@link StatsManager}
- */
+/** Receive the anomaly info from {@link StatsManager} */
public class AnomalyDetectionReceiver extends BroadcastReceiver {
private static final String TAG = "SettingsAnomalyReceiver";
@@ -35,10 +33,16 @@
public void onReceive(Context context, Intent intent) {
final long configUid = intent.getLongExtra(StatsManager.EXTRA_STATS_CONFIG_UID, -1);
final long configKey = intent.getLongExtra(StatsManager.EXTRA_STATS_CONFIG_KEY, -1);
- final long subscriptionId = intent.getLongExtra(StatsManager.EXTRA_STATS_SUBSCRIPTION_ID,
- -1);
- Log.i(TAG, "Anomaly intent received. configUid = " + configUid + " configKey = "
- + configKey + " subscriptionId = " + subscriptionId);
+ final long subscriptionId =
+ intent.getLongExtra(StatsManager.EXTRA_STATS_SUBSCRIPTION_ID, -1);
+ Log.i(
+ TAG,
+ "Anomaly intent received. configUid = "
+ + configUid
+ + " configKey = "
+ + configKey
+ + " subscriptionId = "
+ + subscriptionId);
final Bundle bundle = intent.getExtras();
if (bundle == null) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyInfo.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyInfo.java
index fc15706..da277c6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyInfo.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyInfo.java
@@ -19,9 +19,7 @@
import android.util.KeyValueListParser;
import android.util.Log;
-/**
- * Model class to parse and store anomaly info from statsd.
- */
+/** Model class to parse and store anomaly info from statsd. */
public class AnomalyInfo {
private static final String TAG = "AnomalyInfo";
@@ -37,5 +35,4 @@
anomalyType = parser.getInt(KEY_ANOMALY_TYPE, -1);
autoRestriction = parser.getBoolean(KEY_AUTO_RESTRICTION, false);
}
-
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
index e79b874..8166a3d 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
@@ -25,16 +25,17 @@
import java.util.Objects;
-/**
- * Model class stores app info(e.g. package name, type..) that used in battery tip
- */
+/** Model class stores app info(e.g. package name, type..) that used in battery tip */
public class AppInfo implements Comparable<AppInfo>, Parcelable {
public final String packageName;
+
/**
* Anomaly type of the app
+ *
* @see StatsManagerConfig.AnomalyType
*/
public final ArraySet<Integer> anomalyTypes;
+
public final long screenOnTimeMs;
public final int uid;
@@ -73,7 +74,11 @@
@Override
public String toString() {
- return "packageName=" + packageName + ",anomalyTypes=" + anomalyTypes + ",screenTime="
+ return "packageName="
+ + packageName
+ + ",anomalyTypes="
+ + anomalyTypes
+ + ",screenTime="
+ screenOnTimeMs;
}
@@ -93,15 +98,16 @@
&& TextUtils.equals(packageName, other.packageName);
}
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- public AppInfo createFromParcel(Parcel in) {
- return new AppInfo(in);
- }
+ public static final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public AppInfo createFromParcel(Parcel in) {
+ return new AppInfo(in);
+ }
- public AppInfo[] newArray(int size) {
- return new AppInfo[size];
- }
- };
+ public AppInfo[] newArray(int size) {
+ return new AppInfo[size];
+ }
+ };
public static final class Builder {
private ArraySet<Integer> mAnomalyTypes = new ArraySet<>();
@@ -133,4 +139,4 @@
return new AppInfo(this);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index bb69999..2b0ba45 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -47,8 +47,8 @@
/**
* Database manager for battery data. Now it only contains anomaly data stored in {@link AppInfo}.
*
- * This manager may be accessed by multi-threads. All the database related methods are synchronized
- * so each operation won't be interfered by other threads.
+ * <p>This manager may be accessed by multi-threads. All the database related methods are
+ * synchronized so each operation won't be interfered by other threads.
*/
public class BatteryDatabaseManager {
private static BatteryDatabaseManager sSingleton;
@@ -74,16 +74,15 @@
/**
* Insert an anomaly log to database.
*
- * @param uid the uid of the app
- * @param packageName the package name of the app
- * @param type the type of the anomaly
+ * @param uid the uid of the app
+ * @param packageName the package name of the app
+ * @param type the type of the anomaly
* @param anomalyState the state of the anomaly
- * @param timestampMs the time when it is happened
+ * @param timestampMs the time when it is happened
* @return {@code true} if insert operation succeed
*/
- public synchronized boolean insertAnomaly(int uid, String packageName, int type,
- int anomalyState,
- long timestampMs) {
+ public synchronized boolean insertAnomaly(
+ int uid, String packageName, int type, int anomalyState, long timestampMs) {
final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(UID, uid);
@@ -105,22 +104,31 @@
final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
final Map<Integer, AppInfo.Builder> mAppInfoBuilders = new ArrayMap<>();
final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
- final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
- String.valueOf(state)};
+ final String[] selectionArgs =
+ new String[] {String.valueOf(timestampMsAfter), String.valueOf(state)};
- try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, orderBy)) {
+ try (Cursor cursor =
+ db.query(
+ TABLE_ANOMALY,
+ projection,
+ selection,
+ selectionArgs,
+ null /* groupBy */,
+ null /* having */,
+ orderBy)) {
while (cursor.moveToNext()) {
final int uid = cursor.getInt(cursor.getColumnIndex(UID));
if (!mAppInfoBuilders.containsKey(uid)) {
- final AppInfo.Builder builder = new AppInfo.Builder()
- .setUid(uid)
- .setPackageName(
- cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
+ final AppInfo.Builder builder =
+ new AppInfo.Builder()
+ .setUid(uid)
+ .setPackageName(
+ cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
mAppInfoBuilders.put(uid, builder);
}
- mAppInfoBuilders.get(uid).addAnomalyType(
- cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
+ mAppInfoBuilders
+ .get(uid)
+ .addAnomalyType(cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
}
}
@@ -133,15 +141,15 @@
public synchronized void deleteAllAnomaliesBeforeTimeStamp(long timestampMs) {
final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
- db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
- new String[]{String.valueOf(timestampMs)});
+ db.delete(
+ TABLE_ANOMALY, TIME_STAMP_MS + " < ?", new String[] {String.valueOf(timestampMs)});
}
/**
* Update the type of anomalies to {@code state}
*
* @param appInfos represents the anomalies
- * @param state which state to update to
+ * @param state which state to update to
*/
public synchronized void updateAnomalies(List<AppInfo> appInfos, int state) {
if (!appInfos.isEmpty()) {
@@ -154,8 +162,14 @@
final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
final ContentValues values = new ContentValues();
values.put(ANOMALY_STATE, state);
- db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
- Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
+ db.update(
+ TABLE_ANOMALY,
+ values,
+ PACKAGE_NAME
+ + " IN ("
+ + TextUtils.join(",", Collections.nCopies(appInfos.size(), "?"))
+ + ")",
+ whereArgs);
}
}
@@ -171,10 +185,17 @@
final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
final String selection = ActionColumns.ACTION_TYPE + " = ? ";
- final String[] selectionArgs = new String[]{String.valueOf(type)};
+ final String[] selectionArgs = new String[] {String.valueOf(type)};
- try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, null /* orderBy */)) {
+ try (Cursor cursor =
+ db.query(
+ TABLE_ACTION,
+ projection,
+ selection,
+ selectionArgs,
+ null /* groupBy */,
+ null /* having */,
+ null /* orderBy */)) {
final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
@@ -188,11 +209,12 @@
return timeStamps;
}
- /**
- * Insert an action, or update it if already existed
- */
- public synchronized boolean insertAction(@AnomalyDatabaseHelper.ActionType int type,
- int uid, String packageName, long timestampMs) {
+ /** Insert an action, or update it if already existed */
+ public synchronized boolean insertAction(
+ @AnomalyDatabaseHelper.ActionType int type,
+ int uid,
+ String packageName,
+ long timestampMs) {
final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
final ContentValues values = new ContentValues();
values.put(ActionColumns.UID, uid);
@@ -203,17 +225,21 @@
return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
}
- /**
- * Remove an action
- */
- public synchronized boolean deleteAction(@AnomalyDatabaseHelper.ActionType int type,
- int uid, String packageName) {
+ /** Remove an action */
+ public synchronized boolean deleteAction(
+ @AnomalyDatabaseHelper.ActionType int type, int uid, String packageName) {
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
final String where =
- ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
- + ActionColumns.PACKAGE_NAME + " = ? ";
- final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
- String.valueOf(packageName)};
+ ActionColumns.ACTION_TYPE
+ + " = ? AND "
+ + ActionColumns.UID
+ + " = ? AND "
+ + ActionColumns.PACKAGE_NAME
+ + " = ? ";
+ final String[] whereArgs =
+ new String[] {
+ String.valueOf(type), String.valueOf(uid), String.valueOf(packageName)
+ };
return db.delete(TABLE_ACTION, where, whereArgs) != 0;
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index 3989e89..73b7523 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -46,19 +46,15 @@
import java.util.List;
-/**
- * Dialog Fragment to show action dialog for each anomaly
- */
-public class BatteryTipDialogFragment extends InstrumentedDialogFragment implements
- DialogInterface.OnClickListener {
+/** Dialog Fragment to show action dialog for each anomaly */
+public class BatteryTipDialogFragment extends InstrumentedDialogFragment
+ implements DialogInterface.OnClickListener {
private static final String ARG_BATTERY_TIP = "battery_tip";
private static final String ARG_METRICS_KEY = "metrics_key";
- @VisibleForTesting
- BatteryTip mBatteryTip;
- @VisibleForTesting
- int mMetricsKey;
+ @VisibleForTesting BatteryTip mBatteryTip;
+ @VisibleForTesting int mMetricsKey;
public static BatteryTipDialogFragment newInstance(BatteryTip batteryTip, int metricsKey) {
BatteryTipDialogFragment dialogFragment = new BatteryTipDialogFragment();
@@ -87,16 +83,17 @@
.create();
case BatteryTip.TipType.HIGH_DEVICE_USAGE:
final HighUsageTip highUsageTip = (HighUsageTip) mBatteryTip;
- final RecyclerView view = (RecyclerView) LayoutInflater.from(context).inflate(
- R.layout.recycler_view,
- null);
+ final RecyclerView view =
+ (RecyclerView)
+ LayoutInflater.from(context).inflate(R.layout.recycler_view, null);
view.setLayoutManager(new LinearLayoutManager(context));
- view.setAdapter(new HighUsageAdapter(context,
- highUsageTip.getHighUsageAppList()));
+ view.setAdapter(new HighUsageAdapter(context, highUsageTip.getHighUsageAppList()));
return new AlertDialog.Builder(context)
- .setMessage(getString(R.string.battery_tip_dialog_message,
- highUsageTip.getHighUsageAppList().size()))
+ .setMessage(
+ getString(
+ R.string.battery_tip_dialog_message,
+ highUsageTip.getHighUsageAppList().size()))
.setView(view)
.setPositiveButton(android.R.string.ok, null)
.create();
@@ -104,14 +101,19 @@
final RestrictAppTip restrictAppTip = (RestrictAppTip) mBatteryTip;
final List<AppInfo> restrictedAppList = restrictAppTip.getRestrictAppList();
final int num = restrictedAppList.size();
- final CharSequence appLabel = Utils.getApplicationLabel(context,
- restrictedAppList.get(0).packageName);
+ final CharSequence appLabel =
+ Utils.getApplicationLabel(context, restrictedAppList.get(0).packageName);
- final AlertDialog.Builder builder = new AlertDialog.Builder(context)
- .setTitle(StringUtil.getIcuPluralsString(context, num,
- R.string.battery_tip_restrict_app_dialog_title))
- .setPositiveButton(R.string.battery_tip_restrict_app_dialog_ok, this)
- .setNegativeButton(android.R.string.cancel, null);
+ final AlertDialog.Builder builder =
+ new AlertDialog.Builder(context)
+ .setTitle(
+ StringUtil.getIcuPluralsString(
+ context,
+ num,
+ R.string.battery_tip_restrict_app_dialog_title))
+ .setPositiveButton(
+ R.string.battery_tip_restrict_app_dialog_ok, this)
+ .setNegativeButton(android.R.string.cancel, null);
if (num == 1) {
builder.setMessage(
getString(R.string.battery_tip_restrict_app_dialog_message, appLabel));
@@ -119,22 +121,25 @@
builder.setMessage(
getString(
R.string.battery_tip_restrict_apps_less_than_5_dialog_message));
- final RecyclerView restrictionView = (RecyclerView) LayoutInflater.from(
- context).inflate(R.layout.recycler_view, null);
+ final RecyclerView restrictionView =
+ (RecyclerView)
+ LayoutInflater.from(context)
+ .inflate(R.layout.recycler_view, null);
restrictionView.setLayoutManager(new LinearLayoutManager(context));
restrictionView.setAdapter(new HighUsageAdapter(context, restrictedAppList));
builder.setView(restrictionView);
} else {
- builder.setMessage(context.getString(
- R.string.battery_tip_restrict_apps_more_than_5_dialog_message,
- restrictAppTip.getRestrictAppsString(context)));
+ builder.setMessage(
+ context.getString(
+ R.string.battery_tip_restrict_apps_more_than_5_dialog_message,
+ restrictAppTip.getRestrictAppsString(context)));
}
return builder.create();
case BatteryTip.TipType.REMOVE_APP_RESTRICTION:
final UnrestrictAppTip unrestrictAppTip = (UnrestrictAppTip) mBatteryTip;
- final CharSequence name = Utils.getApplicationLabel(context,
- unrestrictAppTip.getPackageName());
+ final CharSequence name =
+ Utils.getApplicationLabel(context, unrestrictAppTip.getPackageName());
return new AlertDialog.Builder(context)
.setTitle(getString(R.string.battery_tip_unrestrict_app_dialog_title))
@@ -158,9 +163,11 @@
if (lsn == null) {
return;
}
- final BatteryTipAction action = BatteryTipUtils.getActionForBatteryTip(mBatteryTip,
- (SettingsActivity) getActivity(),
- (InstrumentedPreferenceFragment) getTargetFragment());
+ final BatteryTipAction action =
+ BatteryTipUtils.getActionForBatteryTip(
+ mBatteryTip,
+ (SettingsActivity) getActivity(),
+ (InstrumentedPreferenceFragment) getTargetFragment());
if (action != null) {
action.handlePositiveAction(mMetricsKey);
}
@@ -168,10 +175,12 @@
}
private boolean isPluggedIn() {
- final Intent batteryIntent = getContext().registerReceiver(null /* receiver */,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- return batteryIntent != null && batteryIntent.getIntExtra(
- BatteryManager.EXTRA_PLUGGED, 0) != 0;
+ final Intent batteryIntent =
+ getContext()
+ .registerReceiver(
+ null /* receiver */,
+ new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ return batteryIntent != null
+ && batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
}
-
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
index 34c431a..9fc0ce1 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
@@ -29,10 +29,7 @@
import com.android.settings.fuelgauge.batterytip.detectors.HighUsageDetector;
import com.android.settings.fuelgauge.batterytip.detectors.IncompatibleChargerDetector;
import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector;
-import com.android.settings.fuelgauge.batterytip.detectors.SmartBatteryDetector;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
-import com.android.settingslib.fuelgauge.EstimateKt;
import com.android.settingslib.utils.AsyncLoaderCompat;
import java.util.ArrayList;
@@ -47,8 +44,7 @@
private static final String TAG = "BatteryTipLoader";
private BatteryUsageStats mBatteryUsageStats;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
public BatteryTipLoader(Context context, BatteryUsageStats batteryUsageStats) {
super(context);
@@ -75,6 +71,5 @@
}
@Override
- protected void onDiscardResult(List<BatteryTip> result) {
- }
+ protected void onDiscardResult(List<BatteryTip> result) {}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
index 3fbbf5b..2feaad5 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
@@ -25,10 +25,7 @@
import java.time.Duration;
-/**
- * Class to store the policy for battery tips, which comes from
- * {@link Settings.Global}
- */
+/** Class to store the policy for battery tips, which comes from {@link Settings.Global} */
public class BatteryTipPolicy {
public static final String TAG = "BatteryTipPolicy";
@@ -102,9 +99,9 @@
public final long highUsagePeriodMs;
/**
- * The battery draining threshold to detect whether device is heavily used.
- * If battery drains more than {@link #highUsageBatteryDraining} in last {@link
- * #highUsagePeriodMs}, treat device as heavily used.
+ * The battery draining threshold to detect whether device is heavily used. If battery drains
+ * more than {@link #highUsageBatteryDraining} in last {@link #highUsagePeriodMs}, treat device
+ * as heavily used.
*
* @see Settings.Global#BATTERY_TIP_CONSTANTS
* @see #KEY_HIGH_USAGE_BATTERY_DRAINING
@@ -171,8 +168,8 @@
/**
* Battery drain percentage threshold for excessive background anomaly(i.e. 10%)
*
- * This is an additional check for excessive background, to check whether battery drain
- * for an app is larger than x%
+ * <p>This is an additional check for excessive background, to check whether battery drain for
+ * an app is larger than x%
*
* @see Settings.Global#BATTERY_TIP_CONSTANTS
* @see #KEY_EXCESSIVE_BG_DRAIN_PERCENTAGE
@@ -220,8 +217,9 @@
@VisibleForTesting
BatteryTipPolicy(Context context, KeyValueListParser parser) {
mParser = parser;
- final String value = Settings.Global.getString(context.getContentResolver(),
- Settings.Global.BATTERY_TIP_CONSTANTS);
+ final String value =
+ Settings.Global.getString(
+ context.getContentResolver(), Settings.Global.BATTERY_TIP_CONSTANTS);
try {
mParser.setString(value);
@@ -234,8 +232,8 @@
batterySaverTipEnabled = mParser.getBoolean(KEY_BATTERY_SAVER_TIP_ENABLED, true);
highUsageEnabled = mParser.getBoolean(KEY_HIGH_USAGE_ENABLED, true);
highUsageAppCount = mParser.getInt(KEY_HIGH_USAGE_APP_COUNT, 3);
- highUsagePeriodMs = mParser.getLong(KEY_HIGH_USAGE_PERIOD_MS,
- Duration.ofHours(2).toMillis());
+ highUsagePeriodMs =
+ mParser.getLong(KEY_HIGH_USAGE_PERIOD_MS, Duration.ofHours(2).toMillis());
highUsageBatteryDraining = mParser.getInt(KEY_HIGH_USAGE_BATTERY_DRAINING, 25);
appRestrictionEnabled = mParser.getBoolean(KEY_APP_RESTRICTION_ENABLED, true);
appRestrictionActiveHour = mParser.getInt(KEY_APP_RESTRICTION_ACTIVE_HOUR, 24);
@@ -251,5 +249,4 @@
testSmartBatteryTip = mParser.getBoolean(KEY_TEST_SMART_BATTERY_TIP, false);
testLowBatteryTip = mParser.getBoolean(KEY_TEST_LOW_BATTERY_TIP, false);
}
-
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
index 1a0ca4e..57dd578 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.os.BadParcelableException;
import android.os.Bundle;
+import android.util.ArrayMap;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -35,14 +36,11 @@
import com.android.settings.widget.CardPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-/**
- * Controller in charge of the battery tip group
- */
+/** Controller in charge of the battery tip group */
public class BatteryTipPreferenceController extends BasePreferenceController {
public static final String PREF_NAME = "battery_tip";
@@ -57,15 +55,13 @@
private SettingsActivity mSettingsActivity;
private MetricsFeatureProvider mMetricsFeatureProvider;
private boolean mNeedUpdate;
- @VisibleForTesting
- CardPreference mCardPreference;
- @VisibleForTesting
- Context mPrefContext;
+ @VisibleForTesting CardPreference mCardPreference;
+ @VisibleForTesting Context mPrefContext;
InstrumentedPreferenceFragment mFragment;
public BatteryTipPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
- mBatteryTipMap = new HashMap<>();
+ mBatteryTipMap = new ArrayMap<>();
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
mNeedUpdate = true;
}
@@ -122,13 +118,15 @@
final BatteryTip batteryTip = mBatteryTipMap.get(preference.getKey());
if (batteryTip != null) {
if (batteryTip.shouldShowDialog()) {
- BatteryTipDialogFragment dialogFragment = BatteryTipDialogFragment.newInstance(
- batteryTip, mFragment.getMetricsCategory());
+ BatteryTipDialogFragment dialogFragment =
+ BatteryTipDialogFragment.newInstance(
+ batteryTip, mFragment.getMetricsCategory());
dialogFragment.setTargetFragment(mFragment, REQUEST_ANOMALY_ACTION);
dialogFragment.show(mFragment.getFragmentManager(), TAG);
} else {
- final BatteryTipAction action = BatteryTipUtils.getActionForBatteryTip(batteryTip,
- mSettingsActivity, mFragment);
+ final BatteryTipAction action =
+ BatteryTipUtils.getActionForBatteryTip(
+ batteryTip, mSettingsActivity, mFragment);
if (action != null) {
action.handlePositiveAction(mFragment.getMetricsCategory());
}
@@ -183,13 +181,11 @@
return visibleBatteryTip.orElse(null);
}
- /**
- * Listener to give the control back to target fragment
- */
+ /** Listener to give the control back to target fragment */
public interface BatteryTipListener {
/**
- * This method is invoked once battery tip is handled, then target fragment could do
- * extra work.
+ * This method is invoked once battery tip is handled, then target fragment could do extra
+ * work.
*
* @param batteryTip that has been handled
*/
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
index 61e0fb1..d65bd26 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
@@ -48,15 +48,13 @@
public class BatteryTipUtils {
private static final int REQUEST_CODE = 0;
- /**
- * Get a list of restricted apps with {@link AppOpsManager#OP_RUN_ANY_IN_BACKGROUND}
- */
+ /** Get a list of restricted apps with {@link AppOpsManager#OP_RUN_ANY_IN_BACKGROUND} */
@NonNull
- public static List<AppInfo> getRestrictedAppsList(AppOpsManager appOpsManager,
- UserManager userManager) {
+ public static List<AppInfo> getRestrictedAppsList(
+ AppOpsManager appOpsManager, UserManager userManager) {
final List<UserHandle> userHandles = userManager.getUserProfiles();
- final List<AppOpsManager.PackageOps> packageOpsList = appOpsManager.getPackagesForOps(
- new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND});
+ final List<AppOpsManager.PackageOps> packageOpsList =
+ appOpsManager.getPackagesForOps(new int[] {AppOpsManager.OP_RUN_ANY_IN_BACKGROUND});
final List<AppInfo> appInfos = new ArrayList<>();
for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) {
@@ -69,11 +67,12 @@
}
if (entry.getMode() != AppOpsManager.MODE_ALLOWED
&& userHandles.contains(
- new UserHandle(UserHandle.getUserId(packageOps.getUid())))) {
- appInfos.add(new AppInfo.Builder()
- .setPackageName(packageOps.getPackageName())
- .setUid(packageOps.getUid())
- .build());
+ new UserHandle(UserHandle.getUserId(packageOps.getUid())))) {
+ appInfos.add(
+ new AppInfo.Builder()
+ .setPackageName(packageOps.getPackageName())
+ .setUid(packageOps.getUid())
+ .build());
}
}
}
@@ -89,8 +88,10 @@
* @param fragment used to populate {@link BatteryTipAction}
* @return an action for {@code batteryTip}
*/
- public static BatteryTipAction getActionForBatteryTip(BatteryTip batteryTip,
- SettingsActivity settingsActivity, InstrumentedPreferenceFragment fragment) {
+ public static BatteryTipAction getActionForBatteryTip(
+ BatteryTip batteryTip,
+ SettingsActivity settingsActivity,
+ InstrumentedPreferenceFragment fragment) {
switch (batteryTip.getType()) {
case BatteryTip.TipType.SMART_BATTERY_MANAGER:
return new SmartBatteryAction(settingsActivity, fragment);
@@ -112,26 +113,33 @@
/**
* Upload the {@link PendingIntent} to {@link StatsManager} for anomaly detection
+ *
* @throws StatsManager.StatsUnavailableException if failed to communicate with stats service
*/
public static void uploadAnomalyPendingIntent(Context context, StatsManager statsManager)
throws StatsManager.StatsUnavailableException {
final Intent extraIntent = new Intent(context, AnomalyDetectionReceiver.class);
- final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE,
- extraIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
- statsManager.setBroadcastSubscriber(pendingIntent,
- StatsManagerConfig.ANOMALY_CONFIG_KEY, StatsManagerConfig.SUBSCRIBER_ID);
+ final PendingIntent pendingIntent =
+ PendingIntent.getBroadcast(
+ context,
+ REQUEST_CODE,
+ extraIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
+ statsManager.setBroadcastSubscriber(
+ pendingIntent,
+ StatsManagerConfig.ANOMALY_CONFIG_KEY,
+ StatsManagerConfig.SUBSCRIBER_ID);
}
- /**
- * Detect and return anomaly apps after {@code timeAfterMs}
- */
+ /** Detect and return anomaly apps after {@code timeAfterMs} */
public static List<AppInfo> detectAnomalies(Context context, long timeAfterMs) {
- final List<AppInfo> highUsageApps = BatteryDatabaseManager.getInstance(context)
- .queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW);
+ final List<AppInfo> highUsageApps =
+ BatteryDatabaseManager.getInstance(context)
+ .queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW);
// Remove it if it doesn't have label or been restricted
- highUsageApps.removeIf(AppLabelPredicate.getInstance(context)
- .or(AppRestrictionPredicate.getInstance(context)));
+ highUsageApps.removeIf(
+ AppLabelPredicate.getInstance(context)
+ .or(AppRestrictionPredicate.getInstance(context)));
return highUsageApps;
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
index cb7b14e..3f8f8e1 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
@@ -33,9 +33,7 @@
import java.util.List;
-/**
- * Adapter for the high usage app list
- */
+/** Adapter for the high usage app list */
public class HighUsageAdapter extends RecyclerView.Adapter<HighUsageAdapter.ViewHolder> {
private final Context mContext;
private final IconDrawableFactory mIconDrawableFactory;
@@ -66,8 +64,8 @@
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- final View view = LayoutInflater.from(mContext).inflate(R.layout.app_high_usage_item,
- parent, false);
+ final View view =
+ LayoutInflater.from(mContext).inflate(R.layout.app_high_usage_item, parent, false);
return new ViewHolder(view);
}
@@ -75,7 +73,10 @@
public void onBindViewHolder(ViewHolder holder, int position) {
final AppInfo app = mHighUsageAppList.get(position);
holder.appIcon.setImageDrawable(
- Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager, app.packageName,
+ Utils.getBadgedIcon(
+ mIconDrawableFactory,
+ mPackageManager,
+ app.packageName,
UserHandle.getUserId(app.uid)));
CharSequence label = Utils.getApplicationLabel(mContext, app.packageName);
if (label == null) {
@@ -89,4 +90,4 @@
public int getItemCount() {
return mHighUsageAppList.size();
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java
index d5710c2..76f5abc 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java
@@ -20,20 +20,17 @@
import com.android.settings.fuelgauge.BatteryInfo;
-/**
- * DataParser used to go through battery data and detect whether battery is
- * heavily used.
- */
+/** DataParser used to go through battery data and detect whether battery is heavily used. */
public class HighUsageDataParser implements BatteryInfo.BatteryDataParser {
- /**
- * time period to check the battery usage
- */
+ /** Time period to check the battery usage */
private final long mTimePeriodMs;
+
/**
- * treat device as heavily used if battery usage is more than {@code threshold}. 1 means 1%
+ * Treat device as heavily used if battery usage is more than {@code threshold}. 1 means 1%
* battery usage.
*/
private int mThreshold;
+
private long mEndTimeMs;
private byte mEndBatteryLevel;
private byte mLastPeriodBatteryLevel;
@@ -69,11 +66,8 @@
mBatteryDrain = mLastPeriodBatteryLevel - mEndBatteryLevel;
}
- /**
- * Return {@code true} if the battery drain in {@link #mTimePeriodMs} is too much
- */
+ /** Return {@code true} if the battery drain in {@link #mTimePeriodMs} is too much */
public boolean isDeviceHeavilyUsed() {
return mBatteryDrain > mThreshold;
}
}
-
diff --git a/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java b/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java
index 153aa40..e18d11d 100644
--- a/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java
+++ b/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java
@@ -21,244 +21,197 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-/**
- * This class provides all the configs needed if we want to use {@link android.app.StatsManager}
- */
+/** This class provides all the configs needed if we want to use {@link android.app.StatsManager} */
public class StatsManagerConfig {
/**
- * The key that represents the anomaly config.
- * This value is used in {@link android.app.StatsManager#addConfig(long, byte[])}
+ * The key that represents the anomaly config. This value is used in {@link
+ * android.app.StatsManager#addConfig(long, byte[])}
*/
public static final long ANOMALY_CONFIG_KEY = 1;
- /**
- * The key that represents subscriber, which is settings app.
- */
+ /** The key that represents subscriber, which is settings app. */
public static final long SUBSCRIBER_ID = 1;
@Retention(RetentionPolicy.SOURCE)
- @IntDef({AnomalyType.NULL,
- AnomalyType.UNKNOWN_REASON,
- AnomalyType.EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF,
- AnomalyType.EXCESSIVE_WAKEUPS_IN_BACKGROUND,
- AnomalyType.EXCESSIVE_UNOPTIMIZED_BLE_SCAN,
- AnomalyType.EXCESSIVE_BACKGROUND_SERVICE,
- AnomalyType.EXCESSIVE_WIFI_SCAN,
- AnomalyType.EXCESSIVE_FLASH_WRITES,
- AnomalyType.EXCESSIVE_MEMORY_IN_BACKGROUND,
- AnomalyType.EXCESSIVE_DAVEY_RATE,
- AnomalyType.EXCESSIVE_JANKY_FRAMES,
- AnomalyType.SLOW_COLD_START_TIME,
- AnomalyType.SLOW_HOT_START_TIME,
- AnomalyType.SLOW_WARM_START_TIME,
- AnomalyType.EXCESSIVE_BACKGROUND_SYNCS,
- AnomalyType.EXCESSIVE_GPS_SCANS_IN_BACKGROUND,
- AnomalyType.EXCESSIVE_JOB_SCHEDULING,
- AnomalyType.EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND,
- AnomalyType.EXCESSIVE_WIFI_LOCK_TIME,
- AnomalyType.JOB_TIMED_OUT,
- AnomalyType.LONG_UNOPTIMIZED_BLE_SCAN,
- AnomalyType.BACKGROUND_ANR,
- AnomalyType.BACKGROUND_CRASH_RATE,
- AnomalyType.EXCESSIVE_ANR_LOOPING,
- AnomalyType.EXCESSIVE_ANRS,
- AnomalyType.EXCESSIVE_CRASH_RATE,
- AnomalyType.EXCESSIVE_CRASH_LOOPING,
- AnomalyType.NUMBER_OF_OPEN_FILES,
- AnomalyType.EXCESSIVE_CAMERA_USAGE_IN_BACKGROUND,
- AnomalyType.EXCESSIVE_CONTACT_ACCESS,
- AnomalyType.EXCESSIVE_AUDIO_IN_BACKGROUND,
- AnomalyType.EXCESSIVE_CRASH_ANR_IN_BACKGROUND,
- AnomalyType.BATTERY_DRAIN_FROM_UNUSED_APP,
+ @IntDef({
+ AnomalyType.NULL,
+ AnomalyType.UNKNOWN_REASON,
+ AnomalyType.EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF,
+ AnomalyType.EXCESSIVE_WAKEUPS_IN_BACKGROUND,
+ AnomalyType.EXCESSIVE_UNOPTIMIZED_BLE_SCAN,
+ AnomalyType.EXCESSIVE_BACKGROUND_SERVICE,
+ AnomalyType.EXCESSIVE_WIFI_SCAN,
+ AnomalyType.EXCESSIVE_FLASH_WRITES,
+ AnomalyType.EXCESSIVE_MEMORY_IN_BACKGROUND,
+ AnomalyType.EXCESSIVE_DAVEY_RATE,
+ AnomalyType.EXCESSIVE_JANKY_FRAMES,
+ AnomalyType.SLOW_COLD_START_TIME,
+ AnomalyType.SLOW_HOT_START_TIME,
+ AnomalyType.SLOW_WARM_START_TIME,
+ AnomalyType.EXCESSIVE_BACKGROUND_SYNCS,
+ AnomalyType.EXCESSIVE_GPS_SCANS_IN_BACKGROUND,
+ AnomalyType.EXCESSIVE_JOB_SCHEDULING,
+ AnomalyType.EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND,
+ AnomalyType.EXCESSIVE_WIFI_LOCK_TIME,
+ AnomalyType.JOB_TIMED_OUT,
+ AnomalyType.LONG_UNOPTIMIZED_BLE_SCAN,
+ AnomalyType.BACKGROUND_ANR,
+ AnomalyType.BACKGROUND_CRASH_RATE,
+ AnomalyType.EXCESSIVE_ANR_LOOPING,
+ AnomalyType.EXCESSIVE_ANRS,
+ AnomalyType.EXCESSIVE_CRASH_RATE,
+ AnomalyType.EXCESSIVE_CRASH_LOOPING,
+ AnomalyType.NUMBER_OF_OPEN_FILES,
+ AnomalyType.EXCESSIVE_CAMERA_USAGE_IN_BACKGROUND,
+ AnomalyType.EXCESSIVE_CONTACT_ACCESS,
+ AnomalyType.EXCESSIVE_AUDIO_IN_BACKGROUND,
+ AnomalyType.EXCESSIVE_CRASH_ANR_IN_BACKGROUND,
+ AnomalyType.BATTERY_DRAIN_FROM_UNUSED_APP,
})
public @interface AnomalyType {
- /**
- * This represents an error condition in the anomaly detection.
- */
+ /** This represents an error condition in the anomaly detection. */
int NULL = -1;
- /**
- * The anomaly type does not match any other defined type.
- */
+ /** The anomaly type does not match any other defined type. */
int UNKNOWN_REASON = 0;
/**
- * The application held a partial (screen off) wake lock for a period of time that
- * exceeded the threshold with the screen off when not charging.
+ * The application held a partial (screen off) wake lock for a period of time that exceeded
+ * the threshold with the screen off when not charging.
*/
int EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF = 1;
/**
- * The application exceeded the maximum number of wakeups while in the background
- * when not charging.
+ * The application exceeded the maximum number of wakeups while in the background when not
+ * charging.
*/
int EXCESSIVE_WAKEUPS_IN_BACKGROUND = 2;
- /**
- * The application did unoptimized Bluetooth scans too frequently when not charging.
- */
+ /** The application did unoptimized Bluetooth scans too frequently when not charging. */
int EXCESSIVE_UNOPTIMIZED_BLE_SCAN = 3;
/**
- * The application ran in the background for a period of time that exceeded the
- * threshold.
+ * The application ran in the background for a period of time that exceeded the threshold.
*/
int EXCESSIVE_BACKGROUND_SERVICE = 4;
- /**
- * The application exceeded the maximum number of wifi scans when not charging.
- */
+ /** The application exceeded the maximum number of wifi scans when not charging. */
int EXCESSIVE_WIFI_SCAN = 5;
- /**
- * The application exceed the maximum number of flash writes
- */
+ /** The application exceed the maximum number of flash writes */
int EXCESSIVE_FLASH_WRITES = 6;
/**
- * The application used more than the maximum memory, while not spending any time
- * in the foreground.
+ * The application used more than the maximum memory, while not spending any time in the
+ * foreground.
*/
int EXCESSIVE_MEMORY_IN_BACKGROUND = 7;
/**
- * The application exceeded the maximum percentage of frames with a render rate of
- * greater than 700ms.
+ * The application exceeded the maximum percentage of frames with a render rate of greater
+ * than 700ms.
*/
int EXCESSIVE_DAVEY_RATE = 8;
/**
- * The application exceeded the maximum percentage of frames with a render rate
- * greater than 16ms.
+ * The application exceeded the maximum percentage of frames with a render rate greater than
+ * 16ms.
*/
int EXCESSIVE_JANKY_FRAMES = 9;
/**
- * The application exceeded the maximum cold start time - the app has not been
- * launched since last system start, died or was killed.
+ * The application exceeded the maximum cold start time - the app has not been launched
+ * since last system start, died or was killed.
*/
int SLOW_COLD_START_TIME = 10;
/**
- * The application exceeded the maximum hot start time - the app and activity are
- * already in memory.
+ * The application exceeded the maximum hot start time - the app and activity are already in
+ * memory.
*/
int SLOW_HOT_START_TIME = 11;
/**
- * The application exceeded the maximum warm start time - the app was already in
- * memory but the activity wasn’t created yet or was removed from memory.
+ * The application exceeded the maximum warm start time - the app was already in memory but
+ * the activity wasn’t created yet or was removed from memory.
*/
int SLOW_WARM_START_TIME = 12;
- /**
- * The application exceeded the maximum number of syncs while in the background.
- */
+ /** The application exceeded the maximum number of syncs while in the background. */
int EXCESSIVE_BACKGROUND_SYNCS = 13;
- /**
- * The application exceeded the maximum number of gps scans while in the background.
- */
+ /** The application exceeded the maximum number of gps scans while in the background. */
int EXCESSIVE_GPS_SCANS_IN_BACKGROUND = 14;
- /**
- * The application scheduled more than the maximum number of jobs while not charging.
- */
+ /** The application scheduled more than the maximum number of jobs while not charging. */
int EXCESSIVE_JOB_SCHEDULING = 15;
/**
- * The application exceeded the maximum amount of mobile network traffic while in
- * the background.
+ * The application exceeded the maximum amount of mobile network traffic while in the
+ * background.
*/
int EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND = 16;
/**
- * The application held the WiFi lock for more than the maximum amount of time while
- * not charging.
+ * The application held the WiFi lock for more than the maximum amount of time while not
+ * charging.
*/
int EXCESSIVE_WIFI_LOCK_TIME = 17;
- /**
- * The application scheduled a job that ran longer than the maximum amount of time.
- */
+ /** The application scheduled a job that ran longer than the maximum amount of time. */
int JOB_TIMED_OUT = 18;
/**
- * The application did an unoptimized Bluetooth scan that exceeded the maximum
- * time while in the background.
+ * The application did an unoptimized Bluetooth scan that exceeded the maximum time while in
+ * the background.
*/
int LONG_UNOPTIMIZED_BLE_SCAN = 19;
- /**
- * The application exceeded the maximum ANR rate while in the background.
- */
+ /** The application exceeded the maximum ANR rate while in the background. */
int BACKGROUND_ANR = 20;
- /**
- * The application exceeded the maximum crash rate while in the background.
- */
+ /** The application exceeded the maximum crash rate while in the background. */
int BACKGROUND_CRASH_RATE = 21;
- /**
- * The application exceeded the maximum ANR-looping rate.
- */
+ /** The application exceeded the maximum ANR-looping rate. */
int EXCESSIVE_ANR_LOOPING = 22;
- /**
- * The application exceeded the maximum ANR rate.
- */
+ /** The application exceeded the maximum ANR rate. */
int EXCESSIVE_ANRS = 23;
- /**
- * The application exceeded the maximum crash rate.
- */
+ /** The application exceeded the maximum crash rate. */
int EXCESSIVE_CRASH_RATE = 24;
- /**
- * The application exceeded the maximum crash-looping rate.
- */
+ /** The application exceeded the maximum crash-looping rate. */
int EXCESSIVE_CRASH_LOOPING = 25;
- /**
- * The application crashed because no more file descriptors were available.
- */
+ /** The application crashed because no more file descriptors were available. */
int NUMBER_OF_OPEN_FILES = 26;
- /**
- * The application used an excessive amount of CPU while in a
- * background process state.
- */
+ /** The application used an excessive amount of CPU while in a background process state. */
int EXCESSIVE_CPU_USAGE_IN_BACKGROUND = 27;
/**
- * The application kept the camera open for an excessive amount
- * of time while in a bckground process state.
+ * The application kept the camera open for an excessive amount of time while in a bckground
+ * process state.
*/
int EXCESSIVE_CAMERA_USAGE_IN_BACKGROUND = 28;
- /**
- * The application has accessed the contacts content provider an
- * excessive amount.
- */
+ /** The application has accessed the contacts content provider an excessive amount. */
int EXCESSIVE_CONTACT_ACCESS = 29;
- /**
- * The application has played too much audio while in a background
- * process state.
- */
+ /** The application has played too much audio while in a background process state. */
int EXCESSIVE_AUDIO_IN_BACKGROUND = 30;
/**
- * The application has crashed or ANRed too many times while in a
- * background process state.
+ * The application has crashed or ANRed too many times while in a background process state.
*/
int EXCESSIVE_CRASH_ANR_IN_BACKGROUND = 31;
/**
- * An application which has not been used by the user recently
- * was detected to cause an excessive amount of battery drain.
+ * An application which has not been used by the user recently was detected to cause an
+ * excessive amount of battery drain.
*/
int BATTERY_DRAIN_FROM_UNUSED_APP = 32;
}
-
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java
index 6f823e9..42b1c2d 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java
@@ -28,14 +28,12 @@
super(context);
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
@Override
public void handlePositiveAction(int metricsKey) {
- BatterySaverUtils.setPowerSaveMode(mContext, true, /*needFirstTimeWarning*/ true,
- SAVER_ENABLED_UNKNOWN);
- mMetricsFeatureProvider.action(mContext,
- SettingsEnums.ACTION_TIP_TURN_ON_BATTERY_SAVER, metricsKey);
+ BatterySaverUtils.setPowerSaveMode(
+ mContext, true, /*needFirstTimeWarning*/ true, SAVER_ENABLED_UNKNOWN);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_TIP_TURN_ON_BATTERY_SAVER, metricsKey);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java
index 65aa076..66f9c44 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java
@@ -33,8 +33,6 @@
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
public abstract void handlePositiveAction(int metricsKey);
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/OpenBatterySaverAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/OpenBatterySaverAction.java
index 1bc2ebf..9073086 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/OpenBatterySaverAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/OpenBatterySaverAction.java
@@ -22,23 +22,18 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
-/**
- *
- * Action to open the {@link com.android.settings.fuelgauge.batterysaver.BatterySaverSettings}
- */
+/** Action to open the {@link com.android.settings.fuelgauge.batterysaver.BatterySaverSettings} */
public class OpenBatterySaverAction extends BatteryTipAction {
public OpenBatterySaverAction(Context context) {
super(context);
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
@Override
public void handlePositiveAction(int metricsKey) {
- mMetricsFeatureProvider.action(mContext,
- SettingsEnums.ACTION_TIP_OPEN_BATTERY_SAVER_PAGE, metricsKey);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_TIP_OPEN_BATTERY_SAVER_PAGE, metricsKey);
new SubSettingLauncher(mContext)
.setDestination(BatterySaverSettings.class.getName())
.setSourceMetricsCategory(metricsKey)
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java
index f0d9f28..30c318e 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java
@@ -30,35 +30,32 @@
import java.util.List;
-/**
- * Action to open the {@link com.android.settings.fuelgauge.RestrictedAppDetails}
- */
+/** Action to open the {@link com.android.settings.fuelgauge.RestrictedAppDetails} */
public class OpenRestrictAppFragmentAction extends BatteryTipAction {
private final RestrictAppTip mRestrictAppTip;
private final InstrumentedPreferenceFragment mFragment;
- @VisibleForTesting
- BatteryDatabaseManager mBatteryDatabaseManager;
+ @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager;
- public OpenRestrictAppFragmentAction(InstrumentedPreferenceFragment fragment,
- RestrictAppTip tip) {
+ public OpenRestrictAppFragmentAction(
+ InstrumentedPreferenceFragment fragment, RestrictAppTip tip) {
super(fragment.getContext());
mFragment = fragment;
mRestrictAppTip = tip;
mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(mContext);
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
@Override
public void handlePositiveAction(int metricsKey) {
- mMetricsFeatureProvider.action(mContext,
- SettingsEnums.ACTION_TIP_OPEN_APP_RESTRICTION_PAGE, metricsKey);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_TIP_OPEN_APP_RESTRICTION_PAGE, metricsKey);
final List<AppInfo> mAppInfos = mRestrictAppTip.getRestrictAppList();
RestrictedAppDetails.startRestrictedAppDetails(mFragment, mAppInfos);
// Mark all the anomalies as handled, so it won't show up again.
- ThreadUtils.postOnBackgroundThread(() -> mBatteryDatabaseManager.updateAnomalies(mAppInfos,
- AnomalyDatabaseHelper.State.HANDLED));
+ ThreadUtils.postOnBackgroundThread(
+ () ->
+ mBatteryDatabaseManager.updateAnomalies(
+ mAppInfos, AnomalyDatabaseHelper.State.HANDLED));
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
index 33ac5df..83abf49 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
@@ -31,15 +31,11 @@
import java.util.List;
-/**
- * Action to restrict the apps, then app is not allowed to run in the background.
- */
+/** Action to restrict the apps, then app is not allowed to run in the background. */
public class RestrictAppAction extends BatteryTipAction {
private RestrictAppTip mRestrictAppTip;
- @VisibleForTesting
- BatteryDatabaseManager mBatteryDatabaseManager;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
+ @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
public RestrictAppAction(Context context, RestrictAppTip tip) {
super(context);
@@ -48,9 +44,7 @@
mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
@Override
public void handlePositiveAction(int metricsKey) {
final List<AppInfo> appInfos = mRestrictAppTip.getRestrictAppList();
@@ -59,18 +53,19 @@
final AppInfo appInfo = appInfos.get(i);
final String packageName = appInfo.packageName;
// Force app standby, then app can't run in the background
- mBatteryUtils.setForceAppStandby(appInfo.uid, packageName,
- AppOpsManager.MODE_IGNORED);
+ mBatteryUtils.setForceAppStandby(appInfo.uid, packageName, AppOpsManager.MODE_IGNORED);
if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) {
// Only log context if there is no anomaly type
- mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+ mMetricsFeatureProvider.action(
+ SettingsEnums.PAGE_UNKNOWN,
SettingsEnums.ACTION_TIP_RESTRICT_APP,
metricsKey,
packageName,
0);
} else {
for (int type : appInfo.anomalyTypes) {
- mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+ mMetricsFeatureProvider.action(
+ SettingsEnums.PAGE_UNKNOWN,
SettingsEnums.ACTION_TIP_RESTRICT_APP,
metricsKey,
packageName,
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
index f6b9c94..55c0031 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
@@ -36,20 +36,18 @@
mFragment = fragment;
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
@Override
public void handlePositiveAction(int metricsKey) {
- mMetricsFeatureProvider.action(mContext,
- SettingsEnums.ACTION_TIP_OPEN_SMART_BATTERY, metricsKey);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_TIP_OPEN_SMART_BATTERY, metricsKey);
new SubSettingLauncher(mSettingsActivity)
- .setSourceMetricsCategory(mFragment instanceof Instrumentable
- ? ((Instrumentable) mFragment).getMetricsCategory()
- : Instrumentable.METRICS_CATEGORY_UNKNOWN)
+ .setSourceMetricsCategory(
+ mFragment instanceof Instrumentable
+ ? ((Instrumentable) mFragment).getMetricsCategory()
+ : Instrumentable.METRICS_CATEGORY_UNKNOWN)
.setDestination(SmartBatterySettings.class.getName())
.setTitleRes(R.string.smart_battery_manager_title)
.launch();
-
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
index 0ef2c0f..1d959bf 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
@@ -26,13 +26,10 @@
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
-/**
- * Action to clear the restriction to the app
- */
+/** Action to clear the restriction to the app */
public class UnrestrictAppAction extends BatteryTipAction {
private UnrestrictAppTip mUnRestrictAppTip;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
public UnrestrictAppAction(Context context, UnrestrictAppTip tip) {
super(context);
@@ -40,15 +37,13 @@
mBatteryUtils = BatteryUtils.getInstance(context);
}
- /**
- * Handle the action when user clicks positive button
- */
+ /** Handle the action when user clicks positive button */
@Override
public void handlePositiveAction(int metricsKey) {
final AppInfo appInfo = mUnRestrictAppTip.getUnrestrictAppInfo();
// Clear force app standby, then app can run in the background
- mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName,
- AppOpsManager.MODE_ALLOWED);
+ mBatteryUtils.setForceAppStandby(
+ appInfo.uid, appInfo.packageName, AppOpsManager.MODE_ALLOWED);
mMetricsFeatureProvider.action(
SettingsEnums.PAGE_UNKNOWN,
SettingsEnums.ACTION_TIP_UNRESTRICT_APP,
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java
index 55d2ee4..db572cd 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java
@@ -23,9 +23,7 @@
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.overlay.FeatureFactory;
-/**
- * Detect whether the battery is overheated
- */
+/** Detect whether the battery is overheated */
public class BatteryDefenderDetector implements BatteryTipDetector {
private final BatteryInfo mBatteryInfo;
private final Context mContext;
@@ -37,11 +35,13 @@
@Override
public BatteryTip detect() {
- final boolean isBasicBatteryDefend = mBatteryInfo.isBatteryDefender
- && !FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider()
- .isExtraDefend();
- final int state = isBasicBatteryDefend
- ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
+ final boolean isBasicBatteryDefend =
+ mBatteryInfo.isBatteryDefender
+ && !FeatureFactory.getFeatureFactory()
+ .getPowerUsageFeatureProvider()
+ .isExtraDefend();
+ final int state =
+ isBasicBatteryDefend ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
final boolean isPluggedIn = mBatteryInfo.pluggedStatus != 0;
return new BatteryDefenderTip(state, isPluggedIn);
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetector.java
index 8a839d3..14aeecd 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetector.java
@@ -23,9 +23,7 @@
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.DockDefenderTip;
-/**
- * Detect whether the dock defender mode is enabled.
- */
+/** Detect whether the dock defender mode is enabled. */
public class DockDefenderDetector implements BatteryTipDetector {
private final BatteryInfo mBatteryInfo;
private final Context mContext;
@@ -44,5 +42,4 @@
: BatteryTip.StateType.INVISIBLE,
mode);
}
-
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
index 8126dcc..8866346 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
@@ -38,8 +38,8 @@
import java.util.concurrent.TimeUnit;
/**
- * Detector whether to show summary tip. This detector should be executed as the last
- * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
+ * Detector whether to show summary tip. This detector should be executed as the last {@link
+ * BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
*/
public class HighUsageDetector implements BatteryTipDetector {
private static final String TAG = "HighUsageDetector";
@@ -48,29 +48,31 @@
private BatteryUsageStats mBatteryUsageStats;
private final BatteryInfo mBatteryInfo;
private List<AppInfo> mHighUsageAppList;
- @VisibleForTesting
- HighUsageDataParser mDataParser;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
- @VisibleForTesting
- boolean mDischarging;
+ @VisibleForTesting HighUsageDataParser mDataParser;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
+ @VisibleForTesting boolean mDischarging;
- public HighUsageDetector(Context context, BatteryTipPolicy policy,
- BatteryUsageStats batteryUsageStats, BatteryInfo batteryInfo) {
+ public HighUsageDetector(
+ Context context,
+ BatteryTipPolicy policy,
+ BatteryUsageStats batteryUsageStats,
+ BatteryInfo batteryInfo) {
mPolicy = policy;
mBatteryUsageStats = batteryUsageStats;
mBatteryInfo = batteryInfo;
mHighUsageAppList = new ArrayList<>();
mBatteryUtils = BatteryUtils.getInstance(context);
- mDataParser = new HighUsageDataParser(mPolicy.highUsagePeriodMs,
- mPolicy.highUsageBatteryDraining);
+ mDataParser =
+ new HighUsageDataParser(
+ mPolicy.highUsagePeriodMs, mPolicy.highUsageBatteryDraining);
mDischarging = batteryInfo.discharging;
}
@Override
public BatteryTip detect() {
- final long lastFullChargeTimeMs = mBatteryUtils.calculateLastFullChargeTime(
- mBatteryUsageStats, System.currentTimeMillis());
+ final long lastFullChargeTimeMs =
+ mBatteryUtils.calculateLastFullChargeTime(
+ mBatteryUsageStats, System.currentTimeMillis());
if (mPolicy.highUsageEnabled && mDischarging) {
parseBatteryData();
if (mDataParser.isDeviceHeavilyUsed() || mPolicy.testHighUsageTip) {
@@ -80,22 +82,25 @@
mBatteryUsageStats.getUidBatteryConsumers();
// Sort by descending power
uidBatteryConsumers.sort(
- (consumer1, consumer2) -> Double.compare(consumer2.getConsumedPower(),
- consumer1.getConsumedPower()));
+ (consumer1, consumer2) ->
+ Double.compare(
+ consumer2.getConsumedPower(),
+ consumer1.getConsumedPower()));
for (UidBatteryConsumer consumer : uidBatteryConsumers) {
- final double percent = mBatteryUtils.calculateBatteryPercent(
- consumer.getConsumedPower(), totalPower, dischargeAmount);
+ final double percent =
+ mBatteryUtils.calculateBatteryPercent(
+ consumer.getConsumedPower(), totalPower, dischargeAmount);
if ((percent + 0.5f < 1f)
|| mBatteryUtils.shouldHideUidBatteryConsumer(consumer)) {
// Don't show it if we should hide or usage percentage is lower than 1%
continue;
}
- mHighUsageAppList.add(new AppInfo.Builder()
- .setUid(consumer.getUid())
- .setPackageName(
- mBatteryUtils.getPackageName(consumer.getUid()))
- .build());
+ mHighUsageAppList.add(
+ new AppInfo.Builder()
+ .setUid(consumer.getUid())
+ .setPackageName(mBatteryUtils.getPackageName(consumer.getUid()))
+ .build());
if (mHighUsageAppList.size() >= mPolicy.highUsageAppCount) {
break;
}
@@ -103,10 +108,11 @@
// When in test mode, add an app if necessary
if (mPolicy.testHighUsageTip && mHighUsageAppList.isEmpty()) {
- mHighUsageAppList.add(new AppInfo.Builder()
- .setPackageName(SETTINGS_PACKAGE_NAME)
- .setScreenOnTimeMs(TimeUnit.HOURS.toMillis(3))
- .build());
+ mHighUsageAppList.add(
+ new AppInfo.Builder()
+ .setPackageName(SETTINGS_PACKAGE_NAME)
+ .setScreenOnTimeMs(TimeUnit.HOURS.toMillis(3))
+ .build());
}
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetector.java
index cfd9a2c..5a9e4f3 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetector.java
@@ -34,12 +34,12 @@
@Override
public BatteryTip detect() {
- final boolean isIncompatibleCharging =
- Utils.containsIncompatibleChargers(mContext, TAG);
- final int state = isIncompatibleCharging
- ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
- Log.d(TAG, "detect() state= " + state + " isIncompatibleCharging: "
- + isIncompatibleCharging);
+ final boolean isIncompatibleCharging = Utils.containsIncompatibleChargers(mContext, TAG);
+ final int state =
+ isIncompatibleCharging ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
+ Log.d(
+ TAG,
+ "detect() state= " + state + " isIncompatibleCharging: " + isIncompatibleCharging);
return new IncompatibleChargerTip(state);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java
index 9e970d2..1ce5a8e 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java
@@ -23,22 +23,23 @@
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
-/**
- * Detect whether the battery is too low
- */
+/** Detect whether the battery is too low */
public class LowBatteryDetector implements BatteryTipDetector {
private final BatteryInfo mBatteryInfo;
private final BatteryTipPolicy mPolicy;
private final boolean mIsPowerSaveMode;
private final int mWarningLevel;
-
- public LowBatteryDetector(Context context, BatteryTipPolicy policy, BatteryInfo batteryInfo,
+ public LowBatteryDetector(
+ Context context,
+ BatteryTipPolicy policy,
+ BatteryInfo batteryInfo,
boolean isPowerSaveMode) {
mPolicy = policy;
mBatteryInfo = batteryInfo;
- mWarningLevel = context.getResources().getInteger(
- com.android.internal.R.integer.config_lowBatteryWarningLevel);
+ mWarningLevel =
+ context.getResources()
+ .getInteger(com.android.internal.R.integer.config_lowBatteryWarningLevel);
mIsPowerSaveMode = isPowerSaveMode;
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java
index 0487ac3..7f9dcd6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java
@@ -25,9 +25,7 @@
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.SmartBatteryTip;
-/**
- * Detect whether to show smart battery tip.
- */
+/** Detect whether to show smart battery tip. */
public class SmartBatteryDetector implements BatteryTipDetector {
private static final int EXPECTED_BATTERY_LEVEL = 30;
@@ -36,8 +34,12 @@
private final ContentResolver mContentResolver;
private final boolean mIsPowerSaveMode;
- public SmartBatteryDetector(Context context, BatteryTipPolicy policy, BatteryInfo batteryInfo,
- ContentResolver contentResolver, boolean isPowerSaveMode) {
+ public SmartBatteryDetector(
+ Context context,
+ BatteryTipPolicy policy,
+ BatteryInfo batteryInfo,
+ ContentResolver contentResolver,
+ boolean isPowerSaveMode) {
mPolicy = policy;
mBatteryInfo = batteryInfo;
mContentResolver = contentResolver;
@@ -46,14 +48,18 @@
@Override
public BatteryTip detect() {
- final boolean smartBatteryOff = Settings.Global.getInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1) == 0;
+ final boolean smartBatteryOff =
+ Settings.Global.getInt(
+ mContentResolver,
+ Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED,
+ 1)
+ == 0;
final boolean isUnderExpectedBatteryLevel =
mBatteryInfo.batteryLevel <= EXPECTED_BATTERY_LEVEL;
// Show it if in test or smart battery is off.
final boolean enableSmartBatteryTip =
smartBatteryOff && !mIsPowerSaveMode && isUnderExpectedBatteryLevel
- || mPolicy.testSmartBatteryTip;
+ || mPolicy.testSmartBatteryTip;
final int state =
enableSmartBatteryTip ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
return new SmartBatteryTip(state);
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java
index 1444b12..5bd4dc0 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java
@@ -23,9 +23,7 @@
import java.util.function.Predicate;
-/**
- * {@link Predicate} for {@link AppInfo} to check whether it has label
- */
+/** {@link Predicate} for {@link AppInfo} to check whether it has label */
public class AppLabelPredicate implements Predicate<AppInfo> {
private static AppLabelPredicate sInstance;
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java
index 43a4d90..a08953c 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java
@@ -23,9 +23,7 @@
import java.util.function.Predicate;
-/**
- * {@link Predicate} for {@link AppInfo} to check whether it is restricted.
- */
+/** {@link Predicate} for {@link AppInfo} to check whether it is restricted. */
public class AppRestrictionPredicate implements Predicate<AppInfo> {
private static AppRestrictionPredicate sInstance;
@@ -46,7 +44,8 @@
@Override
public boolean test(AppInfo appInfo) {
// Return true if app already been restricted
- return mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
- appInfo.uid, appInfo.packageName) == AppOpsManager.MODE_IGNORED;
+ return mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, appInfo.uid, appInfo.packageName)
+ == AppOpsManager.MODE_IGNORED;
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
index 536e5f8..b5ec522 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
@@ -30,9 +30,7 @@
import com.android.settingslib.HelpUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-/**
- * Tip to show current battery is overheated
- */
+/** Tip to show current battery is overheated */
public class BatteryDefenderTip extends BatteryTip {
private static final String TAG = "BatteryDefenderTip";
@@ -70,8 +68,7 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_BATTERY_DEFENDER_TIP,
- mState);
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_BATTERY_DEFENDER_TIP, mState);
}
@Override
@@ -97,14 +94,17 @@
cardPreference.setSecondaryButtonText(context.getString(R.string.learn_more));
cardPreference.setSecondaryButtonClickListener(
- button -> button.startActivityForResult(
- HelpUtils.getHelpIntent(
- context,
- context.getString(R.string.help_url_battery_defender),
- /* backupContext */ ""), /* requestCode */ 0));
+ button ->
+ button.startActivityForResult(
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_battery_defender),
+ /* backupContext */ ""), /* requestCode */
+ 0));
cardPreference.setSecondaryButtonVisible(true);
- cardPreference.setSecondaryButtonContentDescription(context.getString(
- R.string.battery_tip_limited_temporarily_sec_button_content_description));
+ cardPreference.setSecondaryButtonContentDescription(
+ context.getString(
+ R.string.battery_tip_limited_temporarily_sec_button_content_description));
}
private void resumeCharging(Context context) {
@@ -119,13 +119,14 @@
Log.i(TAG, "send resume charging broadcast intent=" + intent);
}
- public static final Creator CREATOR = new Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new BatteryDefenderTip(in);
- }
+ public static final Creator CREATOR =
+ new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new BatteryDefenderTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new BatteryDefenderTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new BatteryDefenderTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
index fdafca6..1345032 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
@@ -35,32 +35,35 @@
/**
* Base model for a battery tip(e.g. suggest user to turn on battery saver)
*
- * Each {@link BatteryTip} contains basic data(e.g. title, summary, icon) as well as the
+ * <p>Each {@link BatteryTip} contains basic data(e.g. title, summary, icon) as well as the
* pre-defined action(e.g. turn on battery saver)
*/
public abstract class BatteryTip implements Comparable<BatteryTip>, Parcelable {
+
@Retention(RetentionPolicy.SOURCE)
- @IntDef({StateType.NEW,
- StateType.HANDLED,
- StateType.INVISIBLE})
+ @IntDef({StateType.NEW, StateType.HANDLED, StateType.INVISIBLE})
public @interface StateType {
+
int NEW = 0;
int HANDLED = 1;
int INVISIBLE = 2;
}
@Retention(RetentionPolicy.SOURCE)
- @IntDef({TipType.SUMMARY,
- TipType.BATTERY_SAVER,
- TipType.HIGH_DEVICE_USAGE,
- TipType.SMART_BATTERY_MANAGER,
- TipType.APP_RESTRICTION,
- TipType.REDUCED_BATTERY,
- TipType.LOW_BATTERY,
- TipType.REMOVE_APP_RESTRICTION,
- TipType.BATTERY_DEFENDER,
- TipType.DOCK_DEFENDER,
- TipType.INCOMPATIBLE_CHARGER})
+ @IntDef({
+ TipType.SUMMARY,
+ TipType.BATTERY_SAVER,
+ TipType.HIGH_DEVICE_USAGE,
+ TipType.SMART_BATTERY_MANAGER,
+ TipType.APP_RESTRICTION,
+ TipType.REDUCED_BATTERY,
+ TipType.LOW_BATTERY,
+ TipType.REMOVE_APP_RESTRICTION,
+ TipType.BATTERY_DEFENDER,
+ TipType.DOCK_DEFENDER,
+ TipType.INCOMPATIBLE_CHARGER,
+ TipType.BATTERY_WARNING
+ })
public @interface TipType {
int SMART_BATTERY_MANAGER = 0;
int APP_RESTRICTION = 1;
@@ -73,10 +76,11 @@
int BATTERY_DEFENDER = 8;
int DOCK_DEFENDER = 9;
int INCOMPATIBLE_CHARGER = 10;
+ int BATTERY_WARNING = 11;
}
- @VisibleForTesting
- static final SparseIntArray TIP_ORDER;
+ @VisibleForTesting static final SparseIntArray TIP_ORDER;
+
static {
TIP_ORDER = new SparseIntArray();
TIP_ORDER.append(TipType.BATTERY_SAVER, 0);
@@ -90,26 +94,26 @@
TIP_ORDER.append(TipType.SMART_BATTERY_MANAGER, 8);
TIP_ORDER.append(TipType.REDUCED_BATTERY, 9);
TIP_ORDER.append(TipType.REMOVE_APP_RESTRICTION, 10);
+ TIP_ORDER.append(TipType.BATTERY_WARNING, 11);
}
private static final String KEY_PREFIX = "key_battery_tip";
- protected int mType;
protected int mState;
+ protected int mType;
protected boolean mShowDialog;
- /**
- * Whether we need to update battery tip when configuration change
- */
+
+ /** Whether we need to update battery tip when configuration change */
protected boolean mNeedUpdate;
- BatteryTip(Parcel in) {
+ public BatteryTip(Parcel in) {
mType = in.readInt();
mState = in.readInt();
mShowDialog = in.readBoolean();
mNeedUpdate = in.readBoolean();
}
- BatteryTip(int type, int state, boolean showDialog) {
+ public BatteryTip(int type, int state, boolean showDialog) {
mType = type;
mState = state;
mShowDialog = showDialog;
@@ -146,15 +150,14 @@
/**
* Check whether data is still make sense. If not, try recover.
+ *
* @param context used to do validate check
*/
public void validateCheck(Context context) {
// do nothing
}
- /**
- * Log the battery tip
- */
+ /** Log the battery tip */
public abstract void log(Context context, MetricsFeatureProvider metricsFeatureProvider);
public void updatePreference(Preference preference) {
@@ -203,7 +206,7 @@
return "type=" + mType + " state=" + mState;
}
- CardPreference castToCardPreferenceSafely(Preference preference) {
+ public CardPreference castToCardPreferenceSafely(Preference preference) {
return preference instanceof CardPreference ? (CardPreference) preference : null;
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
index c8cb8f2..2458351 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
@@ -32,9 +32,7 @@
import com.android.settingslib.HelpUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-/**
- * Tip to show dock defender status
- */
+/** Tip to show dock defender status */
public class DockDefenderTip extends BatteryTip {
private static final String TAG = "DockDefenderTip";
private int mMode;
@@ -84,8 +82,9 @@
@Override
public int getIconId() {
- return mMode == DockDefenderMode.ACTIVE ? R.drawable.ic_battery_status_protected_24dp :
- R.drawable.ic_battery_dock_defender_untriggered_24dp;
+ return mMode == DockDefenderMode.ACTIVE
+ ? R.drawable.ic_battery_status_protected_24dp
+ : R.drawable.ic_battery_dock_defender_untriggered_24dp;
}
@Override
@@ -98,8 +97,7 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_DOCK_DEFENDER_TIP,
- mState);
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_DOCK_DEFENDER_TIP, mState);
}
@Override
@@ -119,15 +117,19 @@
case DockDefenderMode.ACTIVE:
cardPreference.setPrimaryButtonText(
context.getString(R.string.battery_tip_charge_to_full_button));
- cardPreference.setPrimaryButtonClickListener(unused -> {
- resumeCharging(context);
- mMode = DockDefenderMode.TEMPORARILY_BYPASSED;
- context.sendBroadcast(new Intent().setAction(
- BatteryUtils.BYPASS_DOCK_DEFENDER_ACTION).setPackage(
- context.getPackageName()).addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
- | Intent.FLAG_RECEIVER_FOREGROUND));
- updatePreference(preference);
- });
+ cardPreference.setPrimaryButtonClickListener(
+ unused -> {
+ resumeCharging(context);
+ mMode = DockDefenderMode.TEMPORARILY_BYPASSED;
+ context.sendBroadcast(
+ new Intent()
+ .setAction(BatteryUtils.BYPASS_DOCK_DEFENDER_ACTION)
+ .setPackage(context.getPackageName())
+ .addFlags(
+ Intent.FLAG_RECEIVER_REGISTERED_ONLY
+ | Intent.FLAG_RECEIVER_FOREGROUND));
+ updatePreference(preference);
+ });
cardPreference.setPrimaryButtonVisible(true);
break;
case DockDefenderMode.TEMPORARILY_BYPASSED:
@@ -140,15 +142,17 @@
cardPreference.setSecondaryButtonText(context.getString(R.string.learn_more));
cardPreference.setSecondaryButtonClickListener(
- button -> button.startActivityForResult(
- HelpUtils.getHelpIntent(
- context,
- context.getString(R.string.help_url_dock_defender),
- /* backupContext */ ""), /* requestCode */ 0));
+ button ->
+ button.startActivityForResult(
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_dock_defender),
+ /* backupContext */ ""), /* requestCode */
+ 0));
cardPreference.setSecondaryButtonVisible(true);
- cardPreference.setSecondaryButtonContentDescription(context.getString(
- R.string.battery_tip_limited_temporarily_sec_button_content_description));
-
+ cardPreference.setSecondaryButtonContentDescription(
+ context.getString(
+ R.string.battery_tip_limited_temporarily_sec_button_content_description));
}
private void resumeCharging(Context context) {
@@ -163,13 +167,14 @@
Log.i(TAG, "send resume charging broadcast intent=" + intent);
}
- public static final Creator CREATOR = new Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new DockDefenderTip(in);
- }
+ public static final Creator CREATOR =
+ new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new DockDefenderTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new DockDefenderTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new DockDefenderTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
index 47938fb..44e4f5c 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
@@ -29,17 +29,16 @@
import java.util.List;
-/**
- * Tip to show general summary about battery life
- */
+/** Tip to show general summary about battery life */
public class HighUsageTip extends BatteryTip {
private final long mLastFullChargeTimeMs;
- @VisibleForTesting
- final List<AppInfo> mHighUsageAppList;
+ @VisibleForTesting final List<AppInfo> mHighUsageAppList;
public HighUsageTip(long lastFullChargeTimeMs, List<AppInfo> appList) {
- super(TipType.HIGH_DEVICE_USAGE, appList.isEmpty() ? StateType.INVISIBLE : StateType.NEW,
+ super(
+ TipType.HIGH_DEVICE_USAGE,
+ appList.isEmpty() ? StateType.INVISIBLE : StateType.NEW,
true /* showDialog */);
mLastFullChargeTimeMs = lastFullChargeTimeMs;
mHighUsageAppList = appList;
@@ -81,13 +80,11 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_HIGH_USAGE_TIP,
- mState);
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_HIGH_USAGE_TIP, mState);
for (int i = 0, size = mHighUsageAppList.size(); i < size; i++) {
final AppInfo appInfo = mHighUsageAppList.get(i);
- metricsFeatureProvider.action(context,
- SettingsEnums.ACTION_HIGH_USAGE_TIP_LIST,
- appInfo.packageName);
+ metricsFeatureProvider.action(
+ context, SettingsEnums.ACTION_HIGH_USAGE_TIP_LIST, appInfo.packageName);
}
}
@@ -112,14 +109,14 @@
return stringBuilder.toString();
}
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new HighUsageTip(in);
- }
+ public static final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new HighUsageTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new HighUsageTip[size];
- }
- };
-
+ public BatteryTip[] newArray(int size) {
+ return new HighUsageTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
index 48cfb7a..ca42141 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
@@ -62,8 +62,8 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP,
- mState);
+ metricsFeatureProvider.action(
+ context, SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP, mState);
}
@Override
@@ -79,23 +79,26 @@
cardPreference.setSelectable(false);
cardPreference.setPrimaryButtonText(context.getString(R.string.learn_more));
cardPreference.setPrimaryButtonClickListener(
- button -> button.startActivityForResult(
- HelpUtils.getHelpIntent(
- context,
- context.getString(R.string.help_url_incompatible_charging),
- /* backupContext */ ""), /* requestCode */ 0));
+ button ->
+ button.startActivityForResult(
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_incompatible_charging),
+ /* backupContext */ ""), /* requestCode */
+ 0));
cardPreference.setPrimaryButtonVisible(true);
- cardPreference.setPrimaryButtonContentDescription(context.getString(
- R.string.battery_tip_incompatible_charging_content_description));
+ cardPreference.setPrimaryButtonContentDescription(
+ context.getString(R.string.battery_tip_incompatible_charging_content_description));
}
- public static final Creator CREATOR = new Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new IncompatibleChargerTip(in);
- }
+ public static final Creator CREATOR =
+ new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new IncompatibleChargerTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new IncompatibleChargerTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new IncompatibleChargerTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTip.java
index aeff7e9..3073d12 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTip.java
@@ -62,28 +62,27 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_LOW_BATTERY_TIP,
- mState);
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_LOW_BATTERY_TIP, mState);
}
@Override
public void updateState(BatteryTip tip) {
final LowBatteryTip lowBatteryTip = (LowBatteryTip) tip;
- mState = lowBatteryTip.mPowerSaveModeOn
- ? StateType.INVISIBLE : lowBatteryTip.getState();
+ mState = lowBatteryTip.mPowerSaveModeOn ? StateType.INVISIBLE : lowBatteryTip.getState();
}
boolean isPowerSaveModeOn() {
return mPowerSaveModeOn;
}
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new LowBatteryTip(in);
- }
+ public static final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new LowBatteryTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new LowBatteryTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new LowBatteryTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
index 55ac3fa..2b74dd2 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
@@ -18,9 +18,9 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.content.res.Resources;
import android.icu.text.ListFormatter;
import android.os.Parcel;
+import android.util.ArrayMap;
import androidx.annotation.VisibleForTesting;
@@ -31,13 +31,10 @@
import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
-/**
- * Tip to suggest user to restrict some bad apps
- */
+/** Tip to suggest user to restrict some bad apps */
public class RestrictAppTip extends BatteryTip {
private List<AppInfo> mRestrictAppList;
@@ -63,28 +60,33 @@
@Override
public CharSequence getTitle(Context context) {
final int num = mRestrictAppList.size();
- final CharSequence appLabel = num > 0 ? Utils.getApplicationLabel(context,
- mRestrictAppList.get(0).packageName) : "";
+ final CharSequence appLabel =
+ num > 0
+ ? Utils.getApplicationLabel(context, mRestrictAppList.get(0).packageName)
+ : "";
- Map<String, Object> arguments = new HashMap<>();
+ Map<String, Object> arguments = new ArrayMap<>();
arguments.put("count", num);
arguments.put("label", appLabel);
return mState == StateType.HANDLED
- ? StringUtil.getIcuPluralsString(context, arguments,
- R.string.battery_tip_restrict_handled_title)
- : StringUtil.getIcuPluralsString(context, arguments,
- R.string.battery_tip_restrict_title);
+ ? StringUtil.getIcuPluralsString(
+ context, arguments, R.string.battery_tip_restrict_handled_title)
+ : StringUtil.getIcuPluralsString(
+ context, arguments, R.string.battery_tip_restrict_title);
}
@Override
public CharSequence getSummary(Context context) {
final int num = mRestrictAppList.size();
- final CharSequence appLabel = num > 0 ? Utils.getApplicationLabel(context,
- mRestrictAppList.get(0).packageName) : "";
- final int resId = mState == StateType.HANDLED
- ? R.string.battery_tip_restrict_handled_summary
- : R.string.battery_tip_restrict_summary;
- Map<String, Object> arguments = new HashMap<>();
+ final CharSequence appLabel =
+ num > 0
+ ? Utils.getApplicationLabel(context, mRestrictAppList.get(0).packageName)
+ : "";
+ final int resId =
+ mState == StateType.HANDLED
+ ? R.string.battery_tip_restrict_handled_summary
+ : R.string.battery_tip_restrict_summary;
+ Map<String, Object> arguments = new ArrayMap<>();
arguments.put("count", num);
arguments.put("label", appLabel);
return StringUtil.getIcuPluralsString(context, arguments, resId);
@@ -128,13 +130,13 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_APP_RESTRICTION_TIP,
- mState);
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_APP_RESTRICTION_TIP, mState);
if (mState == StateType.NEW) {
for (int i = 0, size = mRestrictAppList.size(); i < size; i++) {
final AppInfo appInfo = mRestrictAppList.get(i);
for (Integer anomalyType : appInfo.anomalyTypes) {
- metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+ metricsFeatureProvider.action(
+ SettingsEnums.PAGE_UNKNOWN,
SettingsEnums.ACTION_APP_RESTRICTION_TIP_LIST,
SettingsEnums.PAGE_UNKNOWN,
appInfo.packageName,
@@ -148,14 +150,11 @@
return mRestrictAppList;
}
- /**
- * Construct the app list string(e.g. app1, app2, and app3)
- */
+ /** Construct the app list string(e.g. app1, app2, and app3) */
public CharSequence getRestrictAppsString(Context context) {
final List<CharSequence> appLabels = new ArrayList<>();
for (int i = 0, size = mRestrictAppList.size(); i < size; i++) {
- appLabels.add(Utils.getApplicationLabel(context,
- mRestrictAppList.get(i).packageName));
+ appLabels.add(Utils.getApplicationLabel(context, mRestrictAppList.get(i).packageName));
}
return ListFormatter.getInstance().format(appLabels);
@@ -180,13 +179,14 @@
dest.writeTypedList(mRestrictAppList);
}
- public static final Creator CREATOR = new Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new RestrictAppTip(in);
- }
+ public static final Creator CREATOR =
+ new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new RestrictAppTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new RestrictAppTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new RestrictAppTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTip.java
index 0593e88..c99653b 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTip.java
@@ -23,9 +23,7 @@
import com.android.settings.R;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-/**
- * Tip to suggest turn on smart battery if it is not on
- */
+/** Tip to suggest turn on smart battery if it is not on */
public class SmartBatteryTip extends BatteryTip {
public SmartBatteryTip(@StateType int state) {
@@ -58,18 +56,17 @@
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_SMART_BATTERY_TIP,
- mState);
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_SMART_BATTERY_TIP, mState);
}
- public static final Creator CREATOR = new Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new SmartBatteryTip(in);
- }
+ public static final Creator CREATOR =
+ new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new SmartBatteryTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new SmartBatteryTip[size];
- }
- };
-
+ public BatteryTip[] newArray(int size) {
+ return new SmartBatteryTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/UnrestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/UnrestrictAppTip.java
index 3c560f8..7b5caeb 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/UnrestrictAppTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/UnrestrictAppTip.java
@@ -84,13 +84,14 @@
dest.writeParcelable(mAppInfo, flags);
}
- public static final Creator CREATOR = new Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new UnrestrictAppTip(in);
- }
+ public static final Creator CREATOR =
+ new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new UnrestrictAppTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new UnrestrictAppTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new UnrestrictAppTip[size];
+ }
+ };
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java b/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java
index 5e30d7a..13c8a91 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java
@@ -48,7 +48,8 @@
mResourceIndex = mPowerAnomalyEvent.getKey().getNumber();
}
- private <T> T getInfo(Function<WarningBannerInfo, T> warningBannerInfoSupplier,
+ private <T> T getInfo(
+ Function<WarningBannerInfo, T> warningBannerInfoSupplier,
Function<WarningItemInfo, T> warningItemInfoSupplier) {
if (warningBannerInfoSupplier != null && mPowerAnomalyEvent.hasWarningBannerInfo()) {
return warningBannerInfoSupplier.apply(mPowerAnomalyEvent.getWarningBannerInfo());
@@ -60,15 +61,19 @@
private int getResourceId(int resourceId, int resourceIndex, String defType) {
final String key = getStringFromArrayResource(resourceId, resourceIndex);
- return TextUtils.isEmpty(key) ? 0
+ return TextUtils.isEmpty(key)
+ ? 0
: mContext.getResources().getIdentifier(key, defType, mContext.getPackageName());
}
- private String getString(Function<WarningBannerInfo, String> warningBannerInfoSupplier,
+ private String getString(
+ Function<WarningBannerInfo, String> warningBannerInfoSupplier,
Function<WarningItemInfo, String> warningItemInfoSupplier,
- int resourceId, int resourceIndex) {
+ int resourceId,
+ int resourceIndex) {
final String string = getInfo(warningBannerInfoSupplier, warningItemInfoSupplier);
- return (!TextUtils.isEmpty(string) || resourceId <= 0) ? string
+ return (!TextUtils.isEmpty(string) || resourceId <= 0)
+ ? string
: getStringFromArrayResource(resourceId, resourceIndex);
}
@@ -78,7 +83,8 @@
}
final String[] stringArray = mContext.getResources().getStringArray(resourceId);
return (resourceIndex >= 0 && resourceIndex < stringArray.length)
- ? stringArray[resourceIndex] : null;
+ ? stringArray[resourceIndex]
+ : null;
}
void setRelatedBatteryDiffEntry(BatteryDiffEntry batteryDiffEntry) {
@@ -98,13 +104,13 @@
}
String getTitleString() {
- final String titleStringFromProto = getInfo(WarningBannerInfo::getTitleString,
- WarningItemInfo::getTitleString);
+ final String titleStringFromProto =
+ getInfo(WarningBannerInfo::getTitleString, WarningItemInfo::getTitleString);
if (!TextUtils.isEmpty(titleStringFromProto)) {
return titleStringFromProto;
}
- final int titleFormatResId = getResourceId(R.array.power_anomaly_title_ids,
- mResourceIndex, "string");
+ final int titleFormatResId =
+ getResourceId(R.array.power_anomaly_title_ids, mResourceIndex, "string");
if (mPowerAnomalyEvent.hasWarningBannerInfo()) {
return mContext.getString(titleFormatResId);
} else if (mPowerAnomalyEvent.hasWarningItemInfo() && mRelatedBatteryDiffEntry != null) {
@@ -115,20 +121,24 @@
}
String getMainBtnString() {
- return getString(WarningBannerInfo::getMainButtonString,
+ return getString(
+ WarningBannerInfo::getMainButtonString,
WarningItemInfo::getMainButtonString,
- R.array.power_anomaly_main_btn_strings, mResourceIndex);
+ R.array.power_anomaly_main_btn_strings,
+ mResourceIndex);
}
String getDismissBtnString() {
- return getString(WarningBannerInfo::getCancelButtonString,
+ return getString(
+ WarningBannerInfo::getCancelButtonString,
WarningItemInfo::getCancelButtonString,
- R.array.power_anomaly_dismiss_btn_strings, mResourceIndex);
+ R.array.power_anomaly_dismiss_btn_strings,
+ mResourceIndex);
}
String getAnomalyHintString() {
- final String anomalyHintStringFromProto = getInfo(null,
- WarningItemInfo::getWarningInfoString);
+ final String anomalyHintStringFromProto =
+ getInfo(null, WarningItemInfo::getWarningInfoString);
return TextUtils.isEmpty(anomalyHintStringFromProto)
? getStringFromArrayResource(R.array.power_anomaly_hint_messages, mResourceIndex)
: anomalyHintStringFromProto;
@@ -148,8 +158,9 @@
String getAnomalyEntryKey() {
return mPowerAnomalyEvent.hasWarningItemInfo()
- && mPowerAnomalyEvent.getWarningItemInfo().hasItemKey()
- ? mPowerAnomalyEvent.getWarningItemInfo().getItemKey() : null;
+ && mPowerAnomalyEvent.getWarningItemInfo().hasItemKey()
+ ? mPowerAnomalyEvent.getWarningItemInfo().getItemKey()
+ : null;
}
boolean hasSubSettingLauncher() {
@@ -163,23 +174,24 @@
if (mSubSettingLauncher != null) {
return mSubSettingLauncher;
}
- final String destinationClassName = getInfo(
- WarningBannerInfo::getMainButtonDestination, null);
+ final String destinationClassName =
+ getInfo(WarningBannerInfo::getMainButtonDestination, null);
if (!TextUtils.isEmpty(destinationClassName)) {
- final Integer sourceMetricsCategory = getInfo(
- WarningBannerInfo::getMainButtonSourceMetricsCategory, null);
- final String preferenceHighlightKey = getInfo(
- WarningBannerInfo::getMainButtonSourceHighlightKey, null);
+ final Integer sourceMetricsCategory =
+ getInfo(WarningBannerInfo::getMainButtonSourceMetricsCategory, null);
+ final String preferenceHighlightKey =
+ getInfo(WarningBannerInfo::getMainButtonSourceHighlightKey, null);
Bundle arguments = Bundle.EMPTY;
if (!TextUtils.isEmpty(preferenceHighlightKey)) {
arguments = new Bundle(1);
- arguments.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
- preferenceHighlightKey);
+ arguments.putString(
+ SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, preferenceHighlightKey);
}
- mSubSettingLauncher = new SubSettingLauncher(mContext)
- .setDestination(destinationClassName)
- .setSourceMetricsCategory(sourceMetricsCategory)
- .setArguments(arguments);
+ mSubSettingLauncher =
+ new SubSettingLauncher(mContext)
+ .setDestination(destinationClassName)
+ .setSourceMetricsCategory(sourceMetricsCategory)
+ .setArguments(arguments);
}
return mSubSettingLauncher;
}
@@ -199,13 +211,13 @@
return null;
}
final WarningItemInfo warningItemInfo = mPowerAnomalyEvent.getWarningItemInfo();
- final Long startTimestamp = warningItemInfo.hasStartTimestamp()
- ? warningItemInfo.getStartTimestamp() : null;
- final Long endTimestamp = warningItemInfo.hasEndTimestamp()
- ? warningItemInfo.getEndTimestamp() : null;
+ final Long startTimestamp =
+ warningItemInfo.hasStartTimestamp() ? warningItemInfo.getStartTimestamp() : null;
+ final Long endTimestamp =
+ warningItemInfo.hasEndTimestamp() ? warningItemInfo.getEndTimestamp() : null;
if (startTimestamp != null && endTimestamp != null) {
- mHighlightSlotPair = batteryLevelData
- .getIndexByTimestamps(startTimestamp, endTimestamp);
+ mHighlightSlotPair =
+ batteryLevelData.getIndexByTimestamps(startTimestamp, endTimestamp);
if (mHighlightSlotPair.first == BatteryChartViewModel.SELECTED_INDEX_INVALID
|| mHighlightSlotPair.second == BatteryChartViewModel.SELECTED_INDEX_INVALID) {
// Drop invalid mHighlightSlotPair index
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index bb6593c..8ae8edd 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -55,8 +55,12 @@
/** Controls the update for chart graph and the list items. */
public class BatteryChartPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnCreate, OnDestroy,
- OnSaveInstanceState, OnResume {
+ implements PreferenceControllerMixin,
+ LifecycleObserver,
+ OnCreate,
+ OnDestroy,
+ OnSaveInstanceState,
+ OnResume {
private static final String TAG = "BatteryChartPreferenceController";
private static final String PREFERENCE_KEY = "battery_chart";
@@ -73,22 +77,14 @@
void onSelectedIndexUpdated();
}
- @VisibleForTesting
- Context mPrefContext;
- @VisibleForTesting
- TextView mChartSummaryTextView;
- @VisibleForTesting
- BatteryChartView mDailyChartView;
- @VisibleForTesting
- BatteryChartView mHourlyChartView;
- @VisibleForTesting
- int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
- @VisibleForTesting
- int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
- @VisibleForTesting
- int mDailyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
- @VisibleForTesting
- int mHourlyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
+ @VisibleForTesting Context mPrefContext;
+ @VisibleForTesting TextView mChartSummaryTextView;
+ @VisibleForTesting BatteryChartView mDailyChartView;
+ @VisibleForTesting BatteryChartView mHourlyChartView;
+ @VisibleForTesting int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+ @VisibleForTesting int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+ @VisibleForTesting int mDailyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
+ @VisibleForTesting int mHourlyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
private boolean mIs24HourFormat;
private View mBatteryChartViewGroup;
@@ -100,13 +96,14 @@
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final AnimatorListenerAdapter mHourlyChartFadeInAdapter =
- createHourlyChartAnimatorListenerAdapter(/*visible=*/ true);
+ createHourlyChartAnimatorListenerAdapter(/* visible= */ true);
private final AnimatorListenerAdapter mHourlyChartFadeOutAdapter =
- createHourlyChartAnimatorListenerAdapter(/*visible=*/ false);
+ createHourlyChartAnimatorListenerAdapter(/* visible= */ false);
@VisibleForTesting
final DailyChartLabelTextGenerator mDailyChartLabelTextGenerator =
new DailyChartLabelTextGenerator();
+
@VisibleForTesting
final HourlyChartLabelTextGenerator mHourlyChartLabelTextGenerator =
new HourlyChartLabelTextGenerator();
@@ -116,8 +113,7 @@
super(context);
mActivity = activity;
mIs24HourFormat = DateFormat.is24HourFormat(context);
- mMetricsFeatureProvider =
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
if (lifecycle != null) {
lifecycle.addObserver(this);
}
@@ -128,12 +124,13 @@
if (savedInstanceState == null) {
return;
}
- mDailyChartIndex =
- savedInstanceState.getInt(KEY_DAILY_CHART_INDEX, mDailyChartIndex);
- mHourlyChartIndex =
- savedInstanceState.getInt(KEY_HOURLY_CHART_INDEX, mHourlyChartIndex);
- Log.d(TAG, String.format("onCreate() dailyIndex=%d hourlyIndex=%d",
- mDailyChartIndex, mHourlyChartIndex));
+ mDailyChartIndex = savedInstanceState.getInt(KEY_DAILY_CHART_INDEX, mDailyChartIndex);
+ mHourlyChartIndex = savedInstanceState.getInt(KEY_HOURLY_CHART_INDEX, mHourlyChartIndex);
+ Log.d(
+ TAG,
+ String.format(
+ "onCreate() dailyIndex=%d hourlyIndex=%d",
+ mDailyChartIndex, mHourlyChartIndex));
}
@Override
@@ -149,8 +146,11 @@
}
savedInstance.putInt(KEY_DAILY_CHART_INDEX, mDailyChartIndex);
savedInstance.putInt(KEY_HOURLY_CHART_INDEX, mHourlyChartIndex);
- Log.d(TAG, String.format("onSaveInstanceState() dailyIndex=%d hourlyIndex=%d",
- mDailyChartIndex, mHourlyChartIndex));
+ Log.d(
+ TAG,
+ String.format(
+ "onSaveInstanceState() dailyIndex=%d hourlyIndex=%d",
+ mDailyChartIndex, mHourlyChartIndex));
}
@Override
@@ -158,7 +158,7 @@
if (mActivity == null || mActivity.isChangingConfigurations()) {
BatteryDiffEntry.clearCache();
}
- mHandler.removeCallbacksAndMessages(/*token=*/ null);
+ mHandler.removeCallbacksAndMessages(/* token= */ null);
}
@Override
@@ -204,19 +204,22 @@
refreshUi();
return;
}
- mDailyViewModel = new BatteryChartViewModel(
- batteryLevelData.getDailyBatteryLevels().getLevels(),
- batteryLevelData.getDailyBatteryLevels().getTimestamps(),
- BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
- mDailyChartLabelTextGenerator);
+ mDailyViewModel =
+ new BatteryChartViewModel(
+ batteryLevelData.getDailyBatteryLevels().getLevels(),
+ batteryLevelData.getDailyBatteryLevels().getTimestamps(),
+ BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
+ mDailyChartLabelTextGenerator);
mHourlyViewModels = new ArrayList<>();
for (BatteryLevelData.PeriodBatteryLevelData hourlyBatteryLevelsPerDay :
batteryLevelData.getHourlyBatteryLevelsPerDay()) {
- mHourlyViewModels.add(new BatteryChartViewModel(
- hourlyBatteryLevelsPerDay.getLevels(),
- hourlyBatteryLevelsPerDay.getTimestamps(),
- BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
- mHourlyChartLabelTextGenerator.updateSpecialCaseContext(batteryLevelData)));
+ mHourlyViewModels.add(
+ new BatteryChartViewModel(
+ hourlyBatteryLevelsPerDay.getLevels(),
+ hourlyBatteryLevelsPerDay.getTimestamps(),
+ BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
+ mHourlyChartLabelTextGenerator.updateSpecialCaseContext(
+ batteryLevelData)));
}
refreshUi();
}
@@ -248,17 +251,21 @@
}
mDailyChartIndex = mDailyHighlightSlotIndex;
mHourlyChartIndex = mHourlyHighlightSlotIndex;
- Log.d(TAG, String.format("onDailyChartSelect:%d, onHourlyChartSelect:%d",
- mDailyChartIndex, mHourlyChartIndex));
+ Log.d(
+ TAG,
+ String.format(
+ "onDailyChartSelect:%d, onHourlyChartSelect:%d",
+ mDailyChartIndex, mHourlyChartIndex));
refreshUi();
- mHandler.post(() -> mDailyChartView.announceForAccessibility(
- getAccessibilityAnnounceMessage()));
+ mHandler.post(
+ () -> mDailyChartView.announceForAccessibility(getAccessibilityAnnounceMessage()));
if (mOnSelectedIndexUpdatedListener != null) {
mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
}
}
- void setBatteryChartView(@NonNull final BatteryChartView dailyChartView,
+ void setBatteryChartView(
+ @NonNull final BatteryChartView dailyChartView,
@NonNull final BatteryChartView hourlyChartView) {
final View parentView = (View) dailyChartView.getParent();
if (parentView != null && parentView.getId() == R.id.battery_chart_group) {
@@ -270,58 +277,67 @@
}
if (mBatteryChartViewGroup != null) {
final View grandparentView = (View) mBatteryChartViewGroup.getParent();
- mChartSummaryTextView = grandparentView != null
- ? grandparentView.findViewById(R.id.chart_summary) : null;
+ mChartSummaryTextView =
+ grandparentView != null
+ ? grandparentView.findViewById(R.id.chart_summary)
+ : null;
}
}
- private void setBatteryChartViewInner(@NonNull final BatteryChartView dailyChartView,
+ private void setBatteryChartViewInner(
+ @NonNull final BatteryChartView dailyChartView,
@NonNull final BatteryChartView hourlyChartView) {
mDailyChartView = dailyChartView;
- mDailyChartView.setOnSelectListener(trapezoidIndex -> {
- if (mDailyChartIndex == trapezoidIndex) {
- return;
- }
- Log.d(TAG, "onDailyChartSelect:" + trapezoidIndex);
- mDailyChartIndex = trapezoidIndex;
- mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
- refreshUi();
- mHandler.post(() -> mDailyChartView.announceForAccessibility(
- getAccessibilityAnnounceMessage()));
- mMetricsFeatureProvider.action(
- mPrefContext,
- trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
- ? SettingsEnums.ACTION_BATTERY_USAGE_DAILY_SHOW_ALL
- : SettingsEnums.ACTION_BATTERY_USAGE_DAILY_TIME_SLOT,
- mDailyChartIndex);
- if (mOnSelectedIndexUpdatedListener != null) {
- mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
- }
- });
+ mDailyChartView.setOnSelectListener(
+ trapezoidIndex -> {
+ if (mDailyChartIndex == trapezoidIndex) {
+ return;
+ }
+ Log.d(TAG, "onDailyChartSelect:" + trapezoidIndex);
+ mDailyChartIndex = trapezoidIndex;
+ mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+ refreshUi();
+ mHandler.post(
+ () ->
+ mDailyChartView.announceForAccessibility(
+ getAccessibilityAnnounceMessage()));
+ mMetricsFeatureProvider.action(
+ mPrefContext,
+ trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
+ ? SettingsEnums.ACTION_BATTERY_USAGE_DAILY_SHOW_ALL
+ : SettingsEnums.ACTION_BATTERY_USAGE_DAILY_TIME_SLOT,
+ mDailyChartIndex);
+ if (mOnSelectedIndexUpdatedListener != null) {
+ mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
+ }
+ });
mHourlyChartView = hourlyChartView;
- mHourlyChartView.setOnSelectListener(trapezoidIndex -> {
- if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
- // This will happen when a daily slot and an hour slot are clicked together.
- return;
- }
- if (mHourlyChartIndex == trapezoidIndex) {
- return;
- }
- Log.d(TAG, "onHourlyChartSelect:" + trapezoidIndex);
- mHourlyChartIndex = trapezoidIndex;
- refreshUi();
- mHandler.post(() -> mHourlyChartView.announceForAccessibility(
- getAccessibilityAnnounceMessage()));
- mMetricsFeatureProvider.action(
- mPrefContext,
- trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
- ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL
- : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT,
- mHourlyChartIndex);
- if (mOnSelectedIndexUpdatedListener != null) {
- mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
- }
- });
+ mHourlyChartView.setOnSelectListener(
+ trapezoidIndex -> {
+ if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
+ // This will happen when a daily slot and an hour slot are clicked together.
+ return;
+ }
+ if (mHourlyChartIndex == trapezoidIndex) {
+ return;
+ }
+ Log.d(TAG, "onHourlyChartSelect:" + trapezoidIndex);
+ mHourlyChartIndex = trapezoidIndex;
+ refreshUi();
+ mHandler.post(
+ () ->
+ mHourlyChartView.announceForAccessibility(
+ getAccessibilityAnnounceMessage()));
+ mMetricsFeatureProvider.action(
+ mPrefContext,
+ trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
+ ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL
+ : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT,
+ mHourlyChartIndex);
+ if (mOnSelectedIndexUpdatedListener != null) {
+ mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
+ }
+ });
refreshUi();
}
@@ -371,18 +387,18 @@
if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
// Multiple days are selected, hide the hourly chart view.
- animateBatteryHourlyChartView(/*visible=*/ false);
+ animateBatteryHourlyChartView(/* visible= */ false);
} else {
- animateBatteryHourlyChartView(/*visible=*/ true);
- final BatteryChartViewModel hourlyViewModel =
- mHourlyViewModels.get(mDailyChartIndex);
+ animateBatteryHourlyChartView(/* visible= */ true);
+ final BatteryChartViewModel hourlyViewModel = mHourlyViewModels.get(mDailyChartIndex);
if (mHourlyChartIndex >= hourlyViewModel.size()) {
mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
}
hourlyViewModel.setSelectedIndex(mHourlyChartIndex);
- hourlyViewModel.setHighlightSlotIndex((mDailyChartIndex == mDailyHighlightSlotIndex)
- ? mHourlyHighlightSlotIndex
- : BatteryChartViewModel.SELECTED_INDEX_INVALID);
+ hourlyViewModel.setHighlightSlotIndex(
+ (mDailyChartIndex == mDailyHighlightSlotIndex)
+ ? mHourlyHighlightSlotIndex
+ : BatteryChartViewModel.SELECTED_INDEX_INVALID);
mHourlyChartView.setViewModel(hourlyViewModel);
}
}
@@ -401,8 +417,8 @@
return selectedDayText;
}
- final String selectedHourText = mHourlyViewModels.get(mDailyChartIndex).getFullText(
- mHourlyChartIndex);
+ final String selectedHourText =
+ mHourlyViewModels.get(mDailyChartIndex).getFullText(mHourlyChartIndex);
if (isBatteryLevelDataInOneDay()) {
return selectedHourText;
}
@@ -422,7 +438,10 @@
private void animateBatteryChartViewGroup() {
if (mBatteryChartViewGroup != null && mBatteryChartViewGroup.getAlpha() == 0) {
- mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_IN_ANIMATION_DURATION)
+ mBatteryChartViewGroup
+ .animate()
+ .alpha(1f)
+ .setDuration(FADE_IN_ANIMATION_DURATION)
.start();
}
}
@@ -435,13 +454,15 @@
if (visible) {
mHourlyChartView.setVisibility(View.VISIBLE);
- mHourlyChartView.animate()
+ mHourlyChartView
+ .animate()
.alpha(1f)
.setDuration(FADE_IN_ANIMATION_DURATION)
.setListener(mHourlyChartFadeInAdapter)
.start();
} else {
- mHourlyChartView.animate()
+ mHourlyChartView
+ .animate()
.alpha(0f)
.setDuration(FADE_OUT_ANIMATION_DURATION)
.setListener(mHourlyChartFadeOutAdapter)
@@ -467,6 +488,7 @@
mHourlyChartView.setVisibility(visibility);
}
}
+
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
@@ -483,7 +505,7 @@
private boolean isAllSelected() {
return (isBatteryLevelDataInOneDay()
- || mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL)
+ || mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL)
&& mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL;
}
@@ -493,8 +515,9 @@
return 0;
}
List<Long> dailyTimestamps = batteryLevelData.getDailyBatteryLevels().getTimestamps();
- return (int) ((dailyTimestamps.get(dailyTimestamps.size() - 1) - dailyTimestamps.get(0))
- / DateUtils.HOUR_IN_MILLIS);
+ return (int)
+ ((dailyTimestamps.get(dailyTimestamps.size() - 1) - dailyTimestamps.get(0))
+ / DateUtils.HOUR_IN_MILLIS);
}
/** Used for {@link AppBatteryPreferenceController}. */
@@ -505,17 +528,21 @@
if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
return null;
}
- Log.d(TAG, String.format("getBatterySinceLastFullChargeUsageData() size=%d time=%d/ms",
- batteryHistoryMap.size(), (System.currentTimeMillis() - start)));
+ Log.d(
+ TAG,
+ String.format(
+ "getBatterySinceLastFullChargeUsageData() size=%d time=%d/ms",
+ batteryHistoryMap.size(), (System.currentTimeMillis() - start)));
final Map<Integer, Map<Integer, BatteryDiffData>> batteryUsageData =
DataProcessor.getBatteryUsageData(context, batteryHistoryMap);
if (batteryUsageData == null) {
return null;
}
- BatteryDiffData allBatteryDiffData = batteryUsageData.get(
- BatteryChartViewModel.SELECTED_INDEX_ALL).get(
- BatteryChartViewModel.SELECTED_INDEX_ALL);
+ BatteryDiffData allBatteryDiffData =
+ batteryUsageData
+ .get(BatteryChartViewModel.SELECTED_INDEX_ALL)
+ .get(BatteryChartViewModel.SELECTED_INDEX_ALL);
return allBatteryDiffData == null ? null : allBatteryDiffData.getAppDiffEntryList();
}
@@ -546,23 +573,23 @@
return null;
}
- private final class DailyChartLabelTextGenerator implements
- BatteryChartViewModel.LabelTextGenerator {
+ private final class DailyChartLabelTextGenerator
+ implements BatteryChartViewModel.LabelTextGenerator {
@Override
public String generateText(List<Long> timestamps, int index) {
- return ConvertUtils.utcToLocalTimeDayOfWeek(mContext,
- timestamps.get(index), /* isAbbreviation= */ true);
+ return ConvertUtils.utcToLocalTimeDayOfWeek(
+ mContext, timestamps.get(index), /* isAbbreviation= */ true);
}
@Override
public String generateFullText(List<Long> timestamps, int index) {
- return ConvertUtils.utcToLocalTimeDayOfWeek(mContext,
- timestamps.get(index), /* isAbbreviation= */ false);
+ return ConvertUtils.utcToLocalTimeDayOfWeek(
+ mContext, timestamps.get(index), /* isAbbreviation= */ false);
}
}
- private final class HourlyChartLabelTextGenerator implements
- BatteryChartViewModel.LabelTextGenerator {
+ private final class HourlyChartLabelTextGenerator
+ implements BatteryChartViewModel.LabelTextGenerator {
private static final int FULL_CHARGE_BATTERY_LEVEL = 100;
private boolean mIsFromFullCharge;
@@ -593,8 +620,10 @@
public String generateFullText(List<Long> timestamps, int index) {
return index == timestamps.size() - 1
? generateText(timestamps, index)
- : mContext.getString(R.string.battery_usage_timestamps_hyphen,
- generateText(timestamps, index), generateText(timestamps, index + 1));
+ : mContext.getString(
+ R.string.battery_usage_timestamps_hyphen,
+ generateText(timestamps, index),
+ generateText(timestamps, index + 1));
}
HourlyChartLabelTextGenerator updateSpecialCaseContext(
@@ -604,8 +633,10 @@
this.mIsFromFullCharge =
firstDayLevelData.getLevels().get(0) == FULL_CHARGE_BATTERY_LEVEL;
this.mFistTimestamp = firstDayLevelData.getTimestamps().get(0);
- this.mLatestTimestamp = getLast(getLast(
- batteryLevelData.getHourlyBatteryLevelsPerDay()).getTimestamps());
+ this.mLatestTimestamp =
+ getLast(
+ getLast(batteryLevelData.getHourlyBatteryLevelsPerDay())
+ .getTimestamps());
return this;
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index bb468fe..ad5d420 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -74,7 +74,7 @@
private final String[] mPercentages = getPercentages();
private final Rect mIndent = new Rect();
- private final Rect[] mPercentageBounds = new Rect[]{new Rect(), new Rect(), new Rect()};
+ private final Rect[] mPercentageBounds = new Rect[] {new Rect(), new Rect(), new Rect()};
private final List<Rect> mAxisLabelsBounds = new ArrayList<>();
private final Set<Integer> mLabelDrawnIndexes = new ArraySet<>();
private final int mLayoutDirection =
@@ -106,11 +106,9 @@
private AccessibilityNodeProvider mAccessibilityNodeProvider;
private BatteryChartView.OnSelectListener mOnSelectListener;
- @VisibleForTesting
- TrapezoidSlot[] mTrapezoidSlots;
+ @VisibleForTesting TrapezoidSlot[] mTrapezoidSlots;
// Records the location to calculate selected index.
- @VisibleForTesting
- float mTouchUpEventX = Float.MIN_VALUE;
+ @VisibleForTesting float mTouchUpEventX = Float.MIN_VALUE;
public BatteryChartView(Context context) {
super(context, null);
@@ -133,9 +131,13 @@
return;
}
- Log.d(TAG, String.format(
- "setViewModel(): size: %d, selectedIndex: %d, getHighlightSlotIndex: %d",
- viewModel.size(), viewModel.selectedIndex(), viewModel.getHighlightSlotIndex()));
+ Log.d(
+ TAG,
+ String.format(
+ "setViewModel(): size: %d, selectedIndex: %d, getHighlightSlotIndex: %d",
+ viewModel.size(),
+ viewModel.selectedIndex(),
+ viewModel.getHighlightSlotIndex()));
mViewModel = viewModel;
initializeAxisLabelsBounds();
initializeTrapezoidSlots(viewModel.size() - 1);
@@ -169,7 +171,9 @@
mTextPaint.setTextAlign(Paint.Align.LEFT);
for (int index = 0; index < mPercentages.length; index++) {
mTextPaint.getTextBounds(
- mPercentages[index], 0, mPercentages[index].length(),
+ mPercentages[index],
+ 0,
+ mPercentages[index].length(),
mPercentageBounds[index]);
}
// Updates the indent configurations.
@@ -292,7 +296,8 @@
// Selects all if users click the same trapezoid item two times.
mOnSelectListener.onSelect(
index == mViewModel.selectedIndex()
- ? BatteryChartViewModel.SELECTED_INDEX_ALL : index);
+ ? BatteryChartViewModel.SELECTED_INDEX_ALL
+ : index);
}
view.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK);
}
@@ -327,8 +332,9 @@
setBackgroundColor(Color.TRANSPARENT);
mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context);
mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor);
- mTrapezoidHoverColor = Utils.getColorAttrDefaultColor(context,
- com.android.internal.R.attr.materialColorSecondaryContainer);
+ mTrapezoidHoverColor =
+ Utils.getColorAttrDefaultColor(
+ context, com.android.internal.R.attr.materialColorSecondaryContainer);
// Initializes the divider line paint.
final Resources resources = getContext().getResources();
mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width);
@@ -353,25 +359,26 @@
// Initializes for drawing text information.
mTextPadding = resources.getDimensionPixelSize(R.dimen.chartview_text_padding);
// Initializes the padding top for drawing text information.
- mTransomViewHeight = resources.getDimensionPixelSize(
- R.dimen.chartview_transom_layout_height);
+ mTransomViewHeight =
+ resources.getDimensionPixelSize(R.dimen.chartview_transom_layout_height);
}
private void initializeTransomPaint() {
- if (mTransomLinePaint != null && mTransomSelectedSlotPaint != null
+ if (mTransomLinePaint != null
+ && mTransomSelectedSlotPaint != null
&& mTransomIcon != null) {
return;
}
// Initializes the transom line paint.
final Resources resources = getContext().getResources();
- final int transomLineWidth = resources.getDimensionPixelSize(
- R.dimen.chartview_transom_width);
+ final int transomLineWidth =
+ resources.getDimensionPixelSize(R.dimen.chartview_transom_width);
final int transomRadius = resources.getDimensionPixelSize(R.dimen.chartview_transom_radius);
mTransomPadding = transomRadius * .5f;
mTransomTop = resources.getDimensionPixelSize(R.dimen.chartview_transom_padding_top);
mTransomLineDefaultColor = Utils.getDisabled(mContext, DIVIDER_COLOR);
- mTransomLineSelectedColor = resources.getColor(
- R.color.color_battery_anomaly_yellow_selector);
+ mTransomLineSelectedColor =
+ resources.getColor(R.color.color_battery_anomaly_yellow_selector);
final int slotHighlightColor = Utils.getDisabled(mContext, mTransomLineSelectedColor);
mTransomIconSize = resources.getDimensionPixelSize(R.dimen.chartview_transom_icon_size);
mTransomLinePaint = new Paint();
@@ -396,18 +403,16 @@
final float availableSpace = bottomOffsetY - topOffsetY;
mDividerPaint.setColor(DIVIDER_COLOR);
- final float dividerOffsetUnit =
- availableSpace / (float) (HORIZONTAL_DIVIDER_COUNT - 1);
+ final float dividerOffsetUnit = availableSpace / (float) (HORIZONTAL_DIVIDER_COUNT - 1);
// Draws 5 divider lines.
for (int index = 0; index < HORIZONTAL_DIVIDER_COUNT; index++) {
float offsetY = topOffsetY + dividerOffsetUnit * index;
- canvas.drawLine(mIndent.left, offsetY,
- mIndent.left + width, offsetY, mDividerPaint);
+ canvas.drawLine(mIndent.left, offsetY, mIndent.left + width, offsetY, mDividerPaint);
// Draws percentage text only for 100% / 50% / 0%
if (index % 2 == 0) {
- drawPercentage(canvas, /*index=*/ (index + 1) / 2, offsetY);
+ drawPercentage(canvas, /* index= */ (index + 1) / 2, offsetY);
}
}
}
@@ -438,21 +443,23 @@
Rect[] axisLabelDisplayAreas;
switch (mViewModel.axisLabelPosition()) {
case CENTER_OF_TRAPEZOIDS:
- axisLabelDisplayAreas = getAxisLabelDisplayAreas(
- /* size= */ mViewModel.size() - 1,
- /* baselineX= */ mIndent.left + mDividerWidth + unitWidth * .5f,
- /* offsetX= */ mDividerWidth + unitWidth,
- baselineY,
- /* shiftFirstAndLast= */ false);
+ axisLabelDisplayAreas =
+ getAxisLabelDisplayAreas(
+ /* size= */ mViewModel.size() - 1,
+ /* baselineX= */ mIndent.left + mDividerWidth + unitWidth * .5f,
+ /* offsetX= */ mDividerWidth + unitWidth,
+ baselineY,
+ /* shiftFirstAndLast= */ false);
break;
case BETWEEN_TRAPEZOIDS:
default:
- axisLabelDisplayAreas = getAxisLabelDisplayAreas(
- /* size= */ mViewModel.size(),
- /* baselineX= */ mIndent.left + mDividerWidth * .5f,
- /* offsetX= */ mDividerWidth + unitWidth,
- baselineY,
- /* shiftFirstAndLast= */ true);
+ axisLabelDisplayAreas =
+ getAxisLabelDisplayAreas(
+ /* size= */ mViewModel.size(),
+ /* baselineX= */ mIndent.left + mDividerWidth * .5f,
+ /* offsetX= */ mDividerWidth + unitWidth,
+ baselineY,
+ /* shiftFirstAndLast= */ true);
break;
}
drawAxisLabels(canvas, axisLabelDisplayAreas, baselineY);
@@ -481,8 +488,12 @@
}
/** Gets all the axis label texts displaying area positions if they are shown. */
- private Rect[] getAxisLabelDisplayAreas(final int size, final float baselineX,
- final float offsetX, final float baselineY, final boolean shiftFirstAndLast) {
+ private Rect[] getAxisLabelDisplayAreas(
+ final int size,
+ final float baselineX,
+ final float offsetX,
+ final float baselineY,
+ final boolean shiftFirstAndLast) {
final Rect[] result = new Rect[size];
for (int index = 0; index < result.length; index++) {
final float width = mAxisLabelsBounds.get(index).width();
@@ -522,8 +533,11 @@
* labels and then recursively draw the 3 parts. If there are any overlaps, skip drawing and go
* back to the uplevel of the recursion.
*/
- private void drawAxisLabelsBetweenStartIndexAndEndIndex(Canvas canvas,
- final Rect[] displayAreas, final int startIndex, final int endIndex,
+ private void drawAxisLabelsBetweenStartIndexAndEndIndex(
+ Canvas canvas,
+ final Rect[] displayAreas,
+ final int startIndex,
+ final int endIndex,
final float baselineY) {
if (endIndex - startIndex <= 1) {
return;
@@ -576,15 +590,12 @@
mTextPaint.setTextAlign(Paint.Align.CENTER);
// Reverse the sort of axis labels for RTL
if (isRTL()) {
- index = mViewModel.axisLabelPosition() == BETWEEN_TRAPEZOIDS
- ? mViewModel.size() - index - 1 // for hourly
- : mViewModel.size() - index - 2; // for daily
+ index =
+ mViewModel.axisLabelPosition() == BETWEEN_TRAPEZOIDS
+ ? mViewModel.size() - index - 1 // for hourly
+ : mViewModel.size() - index - 2; // for daily
}
- canvas.drawText(
- mViewModel.getText(index),
- displayArea.centerX(),
- baselineY,
- mTextPaint);
+ canvas.drawText(mViewModel.getText(index), displayArea.centerX(), baselineY, mTextPaint);
mLabelDrawnIndexes.add(index);
}
@@ -594,8 +605,7 @@
return;
}
final float trapezoidBottom =
- getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
- - mTrapezoidVOffset;
+ getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth - mTrapezoidVOffset;
final float availableSpace =
trapezoidBottom - mDividerWidth * .5f - mIndent.top - mTrapezoidVOffset;
final float unitHeight = availableSpace / 100f;
@@ -608,17 +618,24 @@
continue;
}
// Configures the trapezoid paint color.
- final int trapezoidColor = (mViewModel.selectedIndex() == index
- || mViewModel.selectedIndex() == BatteryChartViewModel.SELECTED_INDEX_ALL)
- ? mTrapezoidSolidColor : mTrapezoidColor;
- final boolean isHoverState = mHoveredIndex == index && isValidToDraw(mViewModel,
- mHoveredIndex);
+ final int trapezoidColor =
+ (mViewModel.selectedIndex() == index
+ || mViewModel.selectedIndex()
+ == BatteryChartViewModel.SELECTED_INDEX_ALL)
+ ? mTrapezoidSolidColor
+ : mTrapezoidColor;
+ final boolean isHoverState =
+ mHoveredIndex == index && isValidToDraw(mViewModel, mHoveredIndex);
mTrapezoidPaint.setColor(isHoverState ? mTrapezoidHoverColor : trapezoidColor);
- float leftTop = round(
- trapezoidBottom - requireNonNull(mViewModel.getLevel(index)) * unitHeight);
- float rightTop = round(trapezoidBottom
- - requireNonNull(mViewModel.getLevel(index + 1)) * unitHeight);
+ float leftTop =
+ round(
+ trapezoidBottom
+ - requireNonNull(mViewModel.getLevel(index)) * unitHeight);
+ float rightTop =
+ round(
+ trapezoidBottom
+ - requireNonNull(mViewModel.getLevel(index + 1)) * unitHeight);
// Mirror the shape of the trapezoid for RTL
if (isRTL()) {
float temp = leftTop;
@@ -639,8 +656,9 @@
}
private boolean isHighlightSlotValid() {
- return mViewModel != null && mViewModel.getHighlightSlotIndex()
- != BatteryChartViewModel.SELECTED_INDEX_INVALID;
+ return mViewModel != null
+ && mViewModel.getHighlightSlotIndex()
+ != BatteryChartViewModel.SELECTED_INDEX_INVALID;
}
private void drawTransomLine(Canvas canvas) {
@@ -652,10 +670,13 @@
mTransomLinePaint.setColor(mTransomLineDefaultColor);
final int width = getWidth() - abs(mIndent.width());
final float transomOffset = mTrapezoidHOffset + mDividerWidth * .5f + mTransomPadding;
- final float trapezoidBottom = getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
- - mTrapezoidVOffset;
- canvas.drawLine(mIndent.left + transomOffset, mTransomTop,
- mIndent.left + width - transomOffset, mTransomTop,
+ final float trapezoidBottom =
+ getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth - mTrapezoidVOffset;
+ canvas.drawLine(
+ mIndent.left + transomOffset,
+ mTransomTop,
+ mIndent.left + width - transomOffset,
+ mTransomTop,
mTransomLinePaint);
drawTransomIcon(canvas);
// Draw selected segment of transom line and a highlight slot
@@ -663,22 +684,28 @@
final int index = mViewModel.getHighlightSlotIndex();
final float startX = mTrapezoidSlots[index].mLeft;
final float endX = mTrapezoidSlots[index].mRight;
- canvas.drawLine(startX + mTransomPadding, mTransomTop,
- endX - mTransomPadding, mTransomTop,
+ canvas.drawLine(
+ startX + mTransomPadding,
+ mTransomTop,
+ endX - mTransomPadding,
+ mTransomTop,
mTransomLinePaint);
- canvas.drawRect(startX, mTransomTop, endX, trapezoidBottom,
- mTransomSelectedSlotPaint);
+ canvas.drawRect(startX, mTransomTop, endX, trapezoidBottom, mTransomSelectedSlotPaint);
}
private void drawTransomIcon(Canvas canvas) {
if (mTransomIcon == null) {
return;
}
- final int left = isRTL()
- ? mIndent.left - mTextPadding - mTransomIconSize
- : getWidth() - abs(mIndent.width()) + mTextPadding;
- mTransomIcon.setBounds(left, mTransomTop - mTransomIconSize / 2,
- left + mTransomIconSize, mTransomTop + mTransomIconSize / 2);
+ final int left =
+ isRTL()
+ ? mIndent.left - mTextPadding - mTransomIconSize
+ : getWidth() - abs(mIndent.width()) + mTextPadding;
+ mTransomIcon.setBounds(
+ left,
+ mTransomTop - mTransomIconSize / 2,
+ left + mTransomIconSize,
+ mTransomTop + mTransomIconSize / 2);
mTransomIcon.draw(canvas);
}
@@ -689,8 +716,7 @@
}
for (int index = 0; index < mTrapezoidSlots.length; index++) {
final TrapezoidSlot slot = mTrapezoidSlots[index];
- if (x >= slot.mLeft - mTrapezoidHOffset
- && x <= slot.mRight + mTrapezoidHOffset) {
+ if (x >= slot.mLeft - mTrapezoidHOffset && x <= slot.mRight + mTrapezoidHOffset) {
return index;
}
}
@@ -712,9 +738,7 @@
private static boolean isTrapezoidIndexValid(
@NonNull BatteryChartViewModel viewModel, int trapezoidIndex) {
- return viewModel != null
- && trapezoidIndex >= 0
- && trapezoidIndex < viewModel.size() - 1;
+ return viewModel != null && trapezoidIndex >= 0 && trapezoidIndex < viewModel.size() - 1;
}
private static boolean isValidToDraw(BatteryChartViewModel viewModel, int trapezoidIndex) {
@@ -733,10 +757,11 @@
}
private static String[] getPercentages() {
- return new String[]{
- formatPercentage(/*percentage=*/ 100, /*round=*/ true),
- formatPercentage(/*percentage=*/ 50, /*round=*/ true),
- formatPercentage(/*percentage=*/ 0, /*round=*/ true)};
+ return new String[] {
+ formatPercentage(/* percentage= */ 100, /* round= */ true),
+ formatPercentage(/* percentage= */ 50, /* round= */ true),
+ formatPercentage(/* percentage= */ 0, /* round= */ true)
+ };
}
private class BatteryChartAccessibilityNodeProvider extends AccessibilityNodeProvider {
@@ -772,8 +797,7 @@
}
@Override
- public boolean performAction(int virtualViewId, int action,
- @Nullable Bundle arguments) {
+ public boolean performAction(int virtualViewId, int action, @Nullable Bundle arguments) {
if (virtualViewId == AccessibilityNodeProvider.HOST_VIEW_ID) {
return performAccessibilityAction(action, arguments);
}
@@ -783,11 +807,12 @@
return true;
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
- return sendAccessibilityEvent(virtualViewId,
- AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
+ return sendAccessibilityEvent(
+ virtualViewId, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
- return sendAccessibilityEvent(virtualViewId,
+ return sendAccessibilityEvent(
+ virtualViewId,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
default:
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
index bf8a771..6ec01a4 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
@@ -57,14 +57,18 @@
private int mSelectedIndex = SELECTED_INDEX_ALL;
private int mHighlightSlotIndex = SELECTED_INDEX_INVALID;
- BatteryChartViewModel(@NonNull List<Integer> levels, @NonNull List<Long> timestamps,
+ BatteryChartViewModel(
+ @NonNull List<Integer> levels,
+ @NonNull List<Long> timestamps,
@NonNull AxisLabelPosition axisLabelPosition,
@NonNull LabelTextGenerator labelTextGenerator) {
Preconditions.checkArgument(
levels.size() == timestamps.size() && levels.size() >= MIN_LEVELS_DATA_SIZE,
- String.format(Locale.ENGLISH,
+ String.format(
+ Locale.ENGLISH,
"Invalid BatteryChartViewModel levels.size: %d, timestamps.size: %d.",
- levels.size(), timestamps.size()));
+ levels.size(),
+ timestamps.size()));
mLevels = levels;
mTimestamps = timestamps;
mAxisLabelPosition = axisLabelPosition;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
index 9d7b629..a8be398 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
@@ -23,6 +23,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
@@ -33,7 +34,6 @@
import com.android.settingslib.utils.StringUtil;
import java.util.Comparator;
-import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
@@ -43,11 +43,14 @@
static Locale sCurrentLocale = null;
// Caches app label and icon to improve loading performance.
- static final Map<String, BatteryEntry.NameAndIcon> sResourceCache = new HashMap<>();
+ static final Map<String, BatteryEntry.NameAndIcon> sResourceCache = new ArrayMap<>();
+
+ // Caches package name and uid to improve loading performance.
+ static final Map<String, Integer> sPackageNameAndUidCache = new ArrayMap<>();
// Whether a specific item is valid to launch restriction page?
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
- static final Map<String, Boolean> sValidForRestriction = new HashMap<>();
+ static final Map<String, Boolean> sValidForRestriction = new ArrayMap<>();
/** A comparator for {@link BatteryDiffEntry} based on the sorting key. */
static final Comparator<BatteryDiffEntry> COMPARATOR =
@@ -61,8 +64,7 @@
private static final Map<String, Pair<Integer, Integer>> SPECIAL_ENTRY_MAP =
Map.of(
SYSTEM_APPS_KEY,
- Pair.create(
- R.string.battery_usage_system_apps, R.drawable.ic_power_system),
+ Pair.create(R.string.battery_usage_system_apps, R.drawable.ic_power_system),
UNINSTALLED_APPS_KEY,
Pair.create(
R.string.battery_usage_uninstalled_apps,
@@ -97,16 +99,11 @@
private UserManager mUserManager;
private String mDefaultPackageName = null;
- @VisibleForTesting
- int mAppIconId;
- @VisibleForTesting
- String mAppLabel = null;
- @VisibleForTesting
- Drawable mAppIcon = null;
- @VisibleForTesting
- boolean mIsLoaded = false;
- @VisibleForTesting
- boolean mValidForRestriction = true;
+ @VisibleForTesting int mAppIconId;
+ @VisibleForTesting String mAppLabel = null;
+ @VisibleForTesting Drawable mAppIcon = null;
+ @VisibleForTesting boolean mIsLoaded = false;
+ @VisibleForTesting boolean mValidForRestriction = true;
public BatteryDiffEntry(
Context context,
@@ -147,12 +144,24 @@
}
public BatteryDiffEntry(Context context, String key, String legacyLabel, int consumerType) {
- this(context, /*uid=*/ 0, /*userId=*/ 0, key, /*isHidden=*/ false, /*componentId=*/ -1,
- /*legacyPackageName=*/ null, legacyLabel, consumerType,
- /*foregroundUsageTimeInMs=*/ 0, /*backgroundUsageTimeInMs=*/ 0,
- /*screenOnTimeInMs=*/ 0, /*consumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0,
- /*foregroundServiceUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0,
- /*cachedUsageConsumePower=*/ 0);
+ this(
+ context,
+ /* uid= */ 0,
+ /* userId= */ 0,
+ key,
+ /* isHidden= */ false,
+ /* componentId= */ -1,
+ /* legacyPackageName= */ null,
+ legacyLabel,
+ consumerType,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ 0,
+ /* screenOnTimeInMs= */ 0,
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0);
}
/** Sets the total consumed power in a specific time slot. */
@@ -283,16 +292,27 @@
/** Whether the current BatteryDiffEntry is uninstalled app or not. */
public boolean isUninstalledEntry() {
final String packageName = getPackageName();
- if (TextUtils.isEmpty(packageName) || isSystemEntry()
+ if (TextUtils.isEmpty(packageName)
+ || isSystemEntry()
// Some special package UIDs could be 0. Those packages are not installed by users.
|| mUid == BatteryUtils.UID_ZERO) {
return false;
}
- final int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName);
+ final int uid = getPackageUid(packageName);
return uid == BatteryUtils.UID_REMOVED_APPS || uid == BatteryUtils.UID_NULL;
}
+ private int getPackageUid(String packageName) {
+ if (sPackageNameAndUidCache.containsKey(packageName)) {
+ return sPackageNameAndUidCache.get(packageName);
+ }
+
+ int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName);
+ sPackageNameAndUidCache.put(packageName, uid);
+ return uid;
+ }
+
void loadLabelAndIcon() {
if (mIsLoaded) {
return;
@@ -455,8 +475,9 @@
mAppIcon = nameAndIcon.mIcon;
}
- final BatteryEntry.NameAndIcon nameAndIcon = BatteryEntry.loadNameAndIcon(
- mContext, uid, /*batteryEntry=*/ null, packageName, mAppLabel, mAppIcon);
+ final BatteryEntry.NameAndIcon nameAndIcon =
+ BatteryEntry.loadNameAndIcon(
+ mContext, uid, /* batteryEntry= */ null, packageName, mAppLabel, mAppIcon);
// Clears BatteryEntry internal cache since we will have another one.
BatteryEntry.clearUidCache();
if (nameAndIcon != null) {
@@ -476,32 +497,56 @@
@Override
public String toString() {
- final StringBuilder builder = new StringBuilder()
- .append("BatteryDiffEntry{")
- .append(String.format("\n\tname=%s restrictable=%b",
- mAppLabel, mValidForRestriction))
- .append(String.format("\n\tconsume=%.2f%% %f/%f",
- mPercentage, mConsumePower, mTotalConsumePower))
- .append(String.format("\n\tconsume power= foreground:%f foregroundService:%f",
- mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
- .append(String.format("\n\tconsume power= background:%f cached:%f",
- mBackgroundUsageConsumePower, mCachedUsageConsumePower))
- .append(String.format("\n\ttime= foreground:%s background:%s screen-on:%s",
- StringUtil.formatElapsedTime(mContext, (double) mForegroundUsageTimeInMs,
- /*withSeconds=*/ true, /*collapseTimeUnit=*/ false),
- StringUtil.formatElapsedTime(mContext, (double) mBackgroundUsageTimeInMs,
- /*withSeconds=*/ true, /*collapseTimeUnit=*/ false),
- StringUtil.formatElapsedTime(mContext, (double) mScreenOnTimeInMs,
- /*withSeconds=*/ true, /*collapseTimeUnit=*/ false)))
- .append(String.format("\n\tpackage:%s|%s uid:%d userId:%d",
- mLegacyPackageName, getPackageName(), mUid, mUserId));
+ final StringBuilder builder =
+ new StringBuilder()
+ .append("BatteryDiffEntry{")
+ .append(
+ String.format(
+ "\n\tname=%s restrictable=%b",
+ mAppLabel, mValidForRestriction))
+ .append(
+ String.format(
+ "\n\tconsume=%.2f%% %f/%f",
+ mPercentage, mConsumePower, mTotalConsumePower))
+ .append(
+ String.format(
+ "\n\tconsume power= foreground:%f foregroundService:%f",
+ mForegroundUsageConsumePower,
+ mForegroundServiceUsageConsumePower))
+ .append(
+ String.format(
+ "\n\tconsume power= background:%f cached:%f",
+ mBackgroundUsageConsumePower, mCachedUsageConsumePower))
+ .append(
+ String.format(
+ "\n\ttime= foreground:%s background:%s screen-on:%s",
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mForegroundUsageTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false),
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mBackgroundUsageTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false),
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mScreenOnTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false)))
+ .append(
+ String.format(
+ "\n\tpackage:%s|%s uid:%d userId:%d",
+ mLegacyPackageName, getPackageName(), mUid, mUserId));
return builder.toString();
}
- /** Clears app icon and label cache data. */
+ /** Clears all cache data. */
public static void clearCache() {
sResourceCache.clear();
sValidForRestriction.clear();
+ sPackageNameAndUidCache.clear();
}
private Drawable getBadgeIconForUser(Drawable icon) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
index 506607c..751e7ad 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
@@ -33,6 +33,7 @@
import android.os.UserBatteryConsumer;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.ArrayMap;
import android.util.DebugUtils;
import android.util.Log;
@@ -41,12 +42,10 @@
import com.android.settingslib.Utils;
import java.util.Comparator;
-import java.util.HashMap;
import java.util.Locale;
/**
- * Wraps the power usage data of a BatterySipper with information about package name
- * and icon image.
+ * Wraps the power usage data of a BatterySipper with information about package name and icon image.
*/
public class BatteryEntry {
@@ -58,11 +57,10 @@
public final int mIconId;
public NameAndIcon(String name, Drawable icon, int iconId) {
- this(name, /*packageName=*/ null, icon, iconId);
+ this(name, /* packageName= */ null, icon, iconId);
}
- public NameAndIcon(
- String name, String packageName, Drawable icon, int iconId) {
+ public NameAndIcon(String name, String packageName, Drawable icon, int iconId) {
this.mName = name;
this.mIcon = icon;
this.mIconId = iconId;
@@ -78,19 +76,22 @@
static final int BATTERY_USAGE_INDEX_BACKGROUND = 2;
static final int BATTERY_USAGE_INDEX_CACHED = 3;
- static final Dimensions[] BATTERY_DIMENSIONS = new Dimensions[] {
- new Dimensions(
- BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_FOREGROUND),
- new Dimensions(
- BatteryConsumer.POWER_COMPONENT_ANY,
- BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE),
- new Dimensions(
- BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_BACKGROUND),
- new Dimensions(
- BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_CACHED),
- };
+ static final Dimensions[] BATTERY_DIMENSIONS =
+ new Dimensions[] {
+ new Dimensions(
+ BatteryConsumer.POWER_COMPONENT_ANY,
+ BatteryConsumer.PROCESS_STATE_FOREGROUND),
+ new Dimensions(
+ BatteryConsumer.POWER_COMPONENT_ANY,
+ BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE),
+ new Dimensions(
+ BatteryConsumer.POWER_COMPONENT_ANY,
+ BatteryConsumer.PROCESS_STATE_BACKGROUND),
+ new Dimensions(
+ BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_CACHED),
+ };
- static final HashMap<String, UidToDetail> sUidCache = new HashMap<>();
+ static final ArrayMap<String, UidToDetail> sUidCache = new ArrayMap<>();
static Locale sCurrentLocale = null;
@@ -106,10 +107,8 @@
private final BatteryConsumer mBatteryConsumer;
private final int mUid;
private final boolean mIsHidden;
- @ConvertUtils.ConsumerType
- private final int mConsumerType;
- @BatteryConsumer.PowerComponent
- private final int mPowerComponentId;
+ @ConvertUtils.ConsumerType private final int mConsumerType;
+ @BatteryConsumer.PowerComponent private final int mPowerComponentId;
private long mUsageDurationMs;
private long mTimeInForegroundMs;
private long mTimeInBackgroundMs;
@@ -131,13 +130,25 @@
Drawable mIcon;
}
- public BatteryEntry(Context context, UserManager um, BatteryConsumer batteryConsumer,
- boolean isHidden, int uid, String[] packages, String packageName) {
+ public BatteryEntry(
+ Context context,
+ UserManager um,
+ BatteryConsumer batteryConsumer,
+ boolean isHidden,
+ int uid,
+ String[] packages,
+ String packageName) {
this(context, um, batteryConsumer, isHidden, uid, packages, packageName, true);
}
- public BatteryEntry(Context context, UserManager um, BatteryConsumer batteryConsumer,
- boolean isHidden, int uid, String[] packages, String packageName,
+ public BatteryEntry(
+ Context context,
+ UserManager um,
+ BatteryConsumer batteryConsumer,
+ boolean isHidden,
+ int uid,
+ String[] packages,
+ String packageName,
boolean loadDataInBackground) {
mContext = context;
mBatteryConsumer = batteryConsumer;
@@ -156,8 +167,10 @@
if (packages != null && packages.length == 1) {
mDefaultPackageName = packages[0];
} else {
- mDefaultPackageName = isSystemUid(uid)
- ? PACKAGE_SYSTEM : uidBatteryConsumer.getPackageWithHighestDrain();
+ mDefaultPackageName =
+ isSystemUid(uid)
+ ? PACKAGE_SYSTEM
+ : uidBatteryConsumer.getPackageWithHighestDrain();
}
}
if (mDefaultPackageName != null) {
@@ -167,8 +180,10 @@
pm.getApplicationInfo(mDefaultPackageName, 0 /* no flags */);
mName = pm.getApplicationLabel(appInfo).toString();
} catch (NameNotFoundException e) {
- Log.d(TAG, "PackageManager failed to retrieve ApplicationInfo for: "
- + mDefaultPackageName);
+ Log.d(
+ TAG,
+ "PackageManager failed to retrieve ApplicationInfo for: "
+ + mDefaultPackageName);
mName = mDefaultPackageName;
}
}
@@ -176,20 +191,26 @@
uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
mTimeInBackgroundMs =
uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND);
- mConsumedPowerInForeground = safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
- mConsumedPowerInForegroundService = safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
- mConsumedPowerInBackground = safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_BACKGROUND]);
- mConsumedPowerInCached = safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_CACHED]);
+ mConsumedPowerInForeground =
+ safeGetConsumedPower(
+ uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
+ mConsumedPowerInForegroundService =
+ safeGetConsumedPower(
+ uidBatteryConsumer,
+ BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
+ mConsumedPowerInBackground =
+ safeGetConsumedPower(
+ uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_BACKGROUND]);
+ mConsumedPowerInCached =
+ safeGetConsumedPower(
+ uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_CACHED]);
} else if (batteryConsumer instanceof UserBatteryConsumer) {
mUid = Process.INVALID_UID;
mConsumerType = ConvertUtils.CONSUMER_TYPE_USER_BATTERY;
mConsumedPower = batteryConsumer.getConsumedPower();
- final NameAndIcon nameAndIcon = getNameAndIconFromUserId(
- context, ((UserBatteryConsumer) batteryConsumer).getUserId());
+ final NameAndIcon nameAndIcon =
+ getNameAndIconFromUserId(
+ context, ((UserBatteryConsumer) batteryConsumer).getUserId());
mIcon = nameAndIcon.mIcon;
mName = nameAndIcon.mName;
} else {
@@ -198,8 +219,12 @@
}
/** Battery entry for a power component of AggregateBatteryConsumer */
- public BatteryEntry(Context context, int powerComponentId, double devicePowerMah,
- long usageDurationMs, boolean isHidden) {
+ public BatteryEntry(
+ Context context,
+ int powerComponentId,
+ double devicePowerMah,
+ long usageDurationMs,
+ boolean isHidden) {
mContext = context;
mBatteryConsumer = null;
mUid = Process.INVALID_UID;
@@ -209,8 +234,7 @@
mUsageDurationMs = usageDurationMs;
mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY;
- final NameAndIcon nameAndIcon =
- getNameAndIconFromPowerComponent(context, powerComponentId);
+ final NameAndIcon nameAndIcon = getNameAndIconFromPowerComponent(context, powerComponentId);
mIconId = nameAndIcon.mIconId;
mName = nameAndIcon.mName;
if (mIconId != 0) {
@@ -219,7 +243,10 @@
}
/** Battery entry for a custom power component of AggregateBatteryConsumer */
- public BatteryEntry(Context context, int powerComponentId, String powerComponentName,
+ public BatteryEntry(
+ Context context,
+ int powerComponentId,
+ String powerComponentName,
double devicePowerMah) {
mContext = context;
mBatteryConsumer = null;
@@ -266,8 +293,8 @@
}
final PackageManager pm = context.getPackageManager();
- final String[] packages = isSystemUid(uid)
- ? new String[]{PACKAGE_SYSTEM} : pm.getPackagesForUid(uid);
+ final String[] packages =
+ isSystemUid(uid) ? new String[] {PACKAGE_SYSTEM} : pm.getPackagesForUid(uid);
if (packages != null) {
final String[] packageLabels = new String[packages.length];
System.arraycopy(packages, 0, packageLabels, 0, packages.length);
@@ -277,11 +304,15 @@
final int userId = UserHandle.getUserId(uid);
for (int i = 0; i < packageLabels.length; i++) {
try {
- final ApplicationInfo ai = ipm.getApplicationInfo(packageLabels[i],
- 0 /* no flags */, userId);
+ final ApplicationInfo ai =
+ ipm.getApplicationInfo(packageLabels[i], 0 /* no flags */, userId);
if (ai == null) {
- Log.d(TAG, "Retrieving null app info for package "
- + packageLabels[i] + ", user " + userId);
+ Log.d(
+ TAG,
+ "Retrieving null app info for package "
+ + packageLabels[i]
+ + ", user "
+ + userId);
continue;
}
final CharSequence label = ai.loadLabel(pm);
@@ -294,8 +325,13 @@
break;
}
} catch (RemoteException e) {
- Log.d(TAG, "Error while retrieving app info for package "
- + packageLabels[i] + ", user " + userId, e);
+ Log.d(
+ TAG,
+ "Error while retrieving app info for package "
+ + packageLabels[i]
+ + ", user "
+ + userId,
+ e);
}
}
@@ -307,13 +343,17 @@
try {
final PackageInfo pi = ipm.getPackageInfo(pkgName, 0, userId);
if (pi == null) {
- Log.d(TAG, "Retrieving null package info for package "
- + pkgName + ", user " + userId);
+ Log.d(
+ TAG,
+ "Retrieving null package info for package "
+ + pkgName
+ + ", user "
+ + userId);
continue;
}
if (pi.sharedUserLabel != 0) {
- final CharSequence nm = pm.getText(pkgName,
- pi.sharedUserLabel, pi.applicationInfo);
+ final CharSequence nm =
+ pm.getText(pkgName, pi.sharedUserLabel, pi.applicationInfo);
if (nm != null) {
name = nm.toString();
if (pi.applicationInfo.icon != 0) {
@@ -324,8 +364,13 @@
}
}
} catch (RemoteException e) {
- Log.d(TAG, "Error while retrieving package info for package "
- + pkgName + ", user " + userId, e);
+ Log.d(
+ TAG,
+ "Error while retrieving package info for package "
+ + pkgName
+ + ", user "
+ + userId,
+ e);
}
}
}
@@ -342,7 +387,7 @@
utd.mPackageName = defaultPackageName;
sUidCache.put(uidString, utd);
- return new NameAndIcon(name, defaultPackageName, icon, /*iconId=*/ 0);
+ return new NameAndIcon(name, defaultPackageName, icon, /* iconId= */ 0);
}
/** Returns a string that uniquely identifies this battery consumer. */
@@ -375,16 +420,13 @@
}
/**
- * Returns the package name that should be used to represent the UID described
- * by this entry.
+ * Returns the package name that should be used to represent the UID described by this entry.
*/
public String getDefaultPackageName() {
return mDefaultPackageName;
}
- /**
- * Returns the UID of the app described by this entry.
- */
+ /** Returns the UID of the app described by this entry. */
public int getUid() {
return mUid;
}
@@ -407,9 +449,7 @@
}
}
- /**
- * Returns total amount of power (in milli-amp-hours) that is attributed to this entry.
- */
+ /** Returns total amount of power (in milli-amp-hours) that is attributed to this entry. */
public double getConsumedPower() {
return mConsumedPower;
}
@@ -462,25 +502,30 @@
}
/**
- * Adds the consumed power of the supplied BatteryConsumer to this entry. Also
- * uses its package with highest drain, if necessary.
+ * Adds the consumed power of the supplied BatteryConsumer to this entry. Also uses its package
+ * with highest drain, if necessary.
*/
public void add(BatteryConsumer batteryConsumer) {
mConsumedPower += batteryConsumer.getConsumedPower();
if (batteryConsumer instanceof UidBatteryConsumer) {
UidBatteryConsumer uidBatteryConsumer = (UidBatteryConsumer) batteryConsumer;
- mTimeInForegroundMs += uidBatteryConsumer.getTimeInStateMs(
- UidBatteryConsumer.STATE_FOREGROUND);
- mTimeInBackgroundMs += uidBatteryConsumer.getTimeInStateMs(
- UidBatteryConsumer.STATE_BACKGROUND);
- mConsumedPowerInForeground += safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
- mConsumedPowerInForegroundService += safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
- mConsumedPowerInBackground += safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_BACKGROUND]);
- mConsumedPowerInCached += safeGetConsumedPower(
- uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_CACHED]);
+ mTimeInForegroundMs +=
+ uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
+ mTimeInBackgroundMs +=
+ uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND);
+ mConsumedPowerInForeground +=
+ safeGetConsumedPower(
+ uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
+ mConsumedPowerInForegroundService +=
+ safeGetConsumedPower(
+ uidBatteryConsumer,
+ BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
+ mConsumedPowerInBackground +=
+ safeGetConsumedPower(
+ uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_BACKGROUND]);
+ mConsumedPowerInCached +=
+ safeGetConsumedPower(
+ uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_CACHED]);
if (mDefaultPackageName == null) {
mDefaultPackageName = uidBatteryConsumer.getPackageWithHighestDrain();
}
@@ -488,8 +533,7 @@
}
/** Gets name and icon resource from UserBatteryConsumer userId. */
- public static NameAndIcon getNameAndIconFromUserId(
- Context context, final int userId) {
+ public static NameAndIcon getNameAndIconFromUserId(Context context, final int userId) {
UserManager um = context.getSystemService(UserManager.class);
UserInfo info = um.getUserInfo(userId);
@@ -499,27 +543,27 @@
icon = Utils.getUserIcon(context, um, info);
name = Utils.getUserLabel(context, info);
} else {
- name = context.getResources().getString(
- R.string.running_process_item_removed_user_label);
+ name =
+ context.getResources()
+ .getString(R.string.running_process_item_removed_user_label);
}
return new NameAndIcon(name, icon, 0 /* iconId */);
}
/** Gets name and icon resource from UidBatteryConsumer uid. */
- public static NameAndIcon getNameAndIconFromUid(
- Context context, String name, final int uid) {
+ public static NameAndIcon getNameAndIconFromUid(Context context, String name, final int uid) {
Drawable icon = context.getDrawable(R.drawable.ic_power_system);
if (uid == 0) {
- name = context.getResources()
- .getString(com.android.settingslib.R.string.process_kernel_label);
+ name =
+ context.getResources()
+ .getString(com.android.settingslib.R.string.process_kernel_label);
} else if (uid == BatteryUtils.UID_REMOVED_APPS) {
name = context.getResources().getString(R.string.process_removed_apps);
} else if (uid == BatteryUtils.UID_TETHERING) {
name = context.getResources().getString(R.string.process_network_tethering);
} else if ("mediaserver".equals(name)) {
name = context.getResources().getString(R.string.process_mediaserver_label);
- } else if ("dex2oat".equals(name) || "dex2oat32".equals(name)
- || "dex2oat64".equals(name)) {
+ } else if ("dex2oat".equals(name) || "dex2oat32".equals(name) || "dex2oat64".equals(name)) {
name = context.getResources().getString(R.string.process_dex2oat_label);
}
return new NameAndIcon(name, icon, 0 /* iconId */);
@@ -531,12 +575,12 @@
String name;
int iconId;
switch (powerComponentId) {
- // Please see go/battery-usage-system-component-map
- case BatteryConsumer.POWER_COMPONENT_SCREEN: // id: 0
+ // Please see go/battery-usage-system-component-map
+ case BatteryConsumer.POWER_COMPONENT_SCREEN: // id: 0
name = context.getResources().getString(R.string.power_screen);
iconId = R.drawable.ic_settings_display;
break;
- case BatteryConsumer.POWER_COMPONENT_CPU: // id: 1
+ case BatteryConsumer.POWER_COMPONENT_CPU: // id: 1
name = context.getResources().getString(R.string.power_cpu);
iconId = R.drawable.ic_settings_cpu;
break;
@@ -544,11 +588,11 @@
name = context.getResources().getString(R.string.power_bluetooth);
iconId = R.drawable.ic_settings_bluetooth;
break;
- case BatteryConsumer.POWER_COMPONENT_CAMERA: // id: 3
+ case BatteryConsumer.POWER_COMPONENT_CAMERA: // id: 3
name = context.getResources().getString(R.string.power_camera);
iconId = R.drawable.ic_settings_camera;
break;
- case BatteryConsumer.POWER_COMPONENT_FLASHLIGHT: // id: 6
+ case BatteryConsumer.POWER_COMPONENT_FLASHLIGHT: // id: 6
name = context.getResources().getString(R.string.power_flashlight);
iconId = R.drawable.ic_settings_flashlight;
break;
@@ -556,25 +600,30 @@
name = context.getResources().getString(R.string.power_cell);
iconId = R.drawable.ic_settings_cellular;
break;
- case BatteryConsumer.POWER_COMPONENT_GNSS: // id: 10
+ case BatteryConsumer.POWER_COMPONENT_GNSS: // id: 10
name = context.getResources().getString(R.string.power_gps);
iconId = R.drawable.ic_settings_gps;
break;
- case BatteryConsumer.POWER_COMPONENT_WIFI: // id: 11
+ case BatteryConsumer.POWER_COMPONENT_WIFI: // id: 11
name = context.getResources().getString(R.string.power_wifi);
iconId = R.drawable.ic_settings_wireless_no_theme;
break;
- case BatteryConsumer.POWER_COMPONENT_PHONE: // id: 14
+ case BatteryConsumer.POWER_COMPONENT_PHONE: // id: 14
name = context.getResources().getString(R.string.power_phone);
iconId = R.drawable.ic_settings_voice_calls;
break;
- case BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY: // id :15
+ case BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY: // id :15
name = context.getResources().getString(R.string.ambient_display_screen_title);
iconId = R.drawable.ic_settings_aod;
break;
default:
- Log.w(TAG, "unknown attribute:" + DebugUtils.constantToString(
- BatteryConsumer.class, "POWER_COMPONENT_", powerComponentId));
+ Log.w(
+ TAG,
+ "unknown attribute:"
+ + DebugUtils.constantToString(
+ BatteryConsumer.class,
+ "POWER_COMPONENT_",
+ powerComponentId));
name = null;
iconId = R.drawable.ic_power_system;
break;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
index 6f78566..97cdc34 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
@@ -29,6 +29,7 @@
/** Keys for accessing {@link ContentValues} or {@link Cursor}. */
public static final String KEY_UID = "uid";
+
public static final String KEY_USER_ID = "userId";
public static final String KEY_PACKAGE_NAME = "packageName";
public static final String KEY_TIMESTAMP = "timestamp";
@@ -57,10 +58,8 @@
public final double mPercentOfTotal;
public final long mForegroundUsageTimeInMs;
public final long mBackgroundUsageTimeInMs;
- @BatteryConsumer.PowerComponent
- public final int mDrainType;
- @ConvertUtils.ConsumerType
- public final int mConsumerType;
+ @BatteryConsumer.PowerComponent public final int mDrainType;
+ @ConvertUtils.ConsumerType public final int mConsumerType;
// Records the battery intent relative information.
public final int mBatteryLevel;
public final int mBatteryStatus;
@@ -190,25 +189,45 @@
@Override
public String toString() {
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(mTimestamp);
- final StringBuilder builder = new StringBuilder()
- .append("\nBatteryHistEntry{")
- .append(String.format("\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
- mPackageName, mAppLabel, mUid, mUserId, mIsHidden))
- .append(String.format("\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d",
- recordAtDateTime, mZoneId, Duration.ofMillis(mBootTimestamp).getSeconds()))
- .append(String.format("\n\tusage=%f|total=%f|consume=%f",
- mPercentOfTotal, mTotalPower, mConsumePower))
- .append(String.format("\n\tforeground=%f|foregroundService=%f",
- mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
- .append(String.format("\n\tbackground=%f|cached=%f",
- mBackgroundUsageConsumePower, mCachedUsageConsumePower))
- .append(String.format("\n\telapsedTime=%d|%d",
- Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(),
- Duration.ofMillis(mBackgroundUsageTimeInMs).getSeconds()))
- .append(String.format("\n\tdrainType=%d|consumerType=%d",
- mDrainType, mConsumerType))
- .append(String.format("\n\tbattery=%d|status=%d|health=%d\n}",
- mBatteryLevel, mBatteryStatus, mBatteryHealth));
+ final StringBuilder builder =
+ new StringBuilder()
+ .append("\nBatteryHistEntry{")
+ .append(
+ String.format(
+ "\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
+ mPackageName, mAppLabel, mUid, mUserId, mIsHidden))
+ .append(
+ String.format(
+ "\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d",
+ recordAtDateTime,
+ mZoneId,
+ Duration.ofMillis(mBootTimestamp).getSeconds()))
+ .append(
+ String.format(
+ "\n\tusage=%f|total=%f|consume=%f",
+ mPercentOfTotal, mTotalPower, mConsumePower))
+ .append(
+ String.format(
+ "\n\tforeground=%f|foregroundService=%f",
+ mForegroundUsageConsumePower,
+ mForegroundServiceUsageConsumePower))
+ .append(
+ String.format(
+ "\n\tbackground=%f|cached=%f",
+ mBackgroundUsageConsumePower, mCachedUsageConsumePower))
+ .append(
+ String.format(
+ "\n\telapsedTime=%d|%d",
+ Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(),
+ Duration.ofMillis(mBackgroundUsageTimeInMs).getSeconds()))
+ .append(
+ String.format(
+ "\n\tdrainType=%d|consumerType=%d",
+ mDrainType, mConsumerType))
+ .append(
+ String.format(
+ "\n\tbattery=%d|status=%d|health=%d\n}",
+ mBatteryLevel, mBatteryStatus, mBatteryHealth));
return builder.toString();
}
@@ -270,65 +289,81 @@
double ratio,
BatteryHistEntry lowerHistEntry,
BatteryHistEntry upperHistEntry) {
- final double totalPower = interpolate(
- lowerHistEntry == null ? 0 : lowerHistEntry.mTotalPower,
- upperHistEntry.mTotalPower,
- ratio);
- final double consumePower = interpolate(
- lowerHistEntry == null ? 0 : lowerHistEntry.mConsumePower,
- upperHistEntry.mConsumePower,
- ratio);
- final double foregroundUsageConsumePower = interpolate(
- lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageConsumePower,
- upperHistEntry.mForegroundUsageConsumePower,
- ratio);
- final double foregroundServiceUsageConsumePower = interpolate(
- lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundServiceUsageConsumePower,
- upperHistEntry.mForegroundServiceUsageConsumePower,
- ratio);
- final double backgroundUsageConsumePower = interpolate(
- lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageConsumePower,
- upperHistEntry.mBackgroundUsageConsumePower,
- ratio);
- final double cachedUsageConsumePower = interpolate(
- lowerHistEntry == null ? 0 : lowerHistEntry.mCachedUsageConsumePower,
- upperHistEntry.mCachedUsageConsumePower,
- ratio);
- final double foregroundUsageTimeInMs = interpolate(
- (double) (lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageTimeInMs),
- (double) upperHistEntry.mForegroundUsageTimeInMs,
- ratio);
- final double backgroundUsageTimeInMs = interpolate(
- (double) (lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs),
- (double) upperHistEntry.mBackgroundUsageTimeInMs,
- ratio);
+ final double totalPower =
+ interpolate(
+ lowerHistEntry == null ? 0 : lowerHistEntry.mTotalPower,
+ upperHistEntry.mTotalPower,
+ ratio);
+ final double consumePower =
+ interpolate(
+ lowerHistEntry == null ? 0 : lowerHistEntry.mConsumePower,
+ upperHistEntry.mConsumePower,
+ ratio);
+ final double foregroundUsageConsumePower =
+ interpolate(
+ lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageConsumePower,
+ upperHistEntry.mForegroundUsageConsumePower,
+ ratio);
+ final double foregroundServiceUsageConsumePower =
+ interpolate(
+ lowerHistEntry == null
+ ? 0
+ : lowerHistEntry.mForegroundServiceUsageConsumePower,
+ upperHistEntry.mForegroundServiceUsageConsumePower,
+ ratio);
+ final double backgroundUsageConsumePower =
+ interpolate(
+ lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageConsumePower,
+ upperHistEntry.mBackgroundUsageConsumePower,
+ ratio);
+ final double cachedUsageConsumePower =
+ interpolate(
+ lowerHistEntry == null ? 0 : lowerHistEntry.mCachedUsageConsumePower,
+ upperHistEntry.mCachedUsageConsumePower,
+ ratio);
+ final double foregroundUsageTimeInMs =
+ interpolate(
+ (double)
+ (lowerHistEntry == null
+ ? 0
+ : lowerHistEntry.mForegroundUsageTimeInMs),
+ (double) upperHistEntry.mForegroundUsageTimeInMs,
+ ratio);
+ final double backgroundUsageTimeInMs =
+ interpolate(
+ (double)
+ (lowerHistEntry == null
+ ? 0
+ : lowerHistEntry.mBackgroundUsageTimeInMs),
+ (double) upperHistEntry.mBackgroundUsageTimeInMs,
+ ratio);
// Checks whether there is any abnormal cases!
if (upperHistEntry.mConsumePower < consumePower
|| upperHistEntry.mForegroundUsageConsumePower < foregroundUsageConsumePower
|| upperHistEntry.mForegroundServiceUsageConsumePower
- < foregroundServiceUsageConsumePower
+ < foregroundServiceUsageConsumePower
|| upperHistEntry.mBackgroundUsageConsumePower < backgroundUsageConsumePower
|| upperHistEntry.mCachedUsageConsumePower < cachedUsageConsumePower
|| upperHistEntry.mForegroundUsageTimeInMs < foregroundUsageTimeInMs
|| upperHistEntry.mBackgroundUsageTimeInMs < backgroundUsageTimeInMs) {
if (DEBUG) {
- Log.w(TAG, String.format(
- "abnormal interpolation:\nupper:%s\nlower:%s",
- upperHistEntry, lowerHistEntry));
+ Log.w(
+ TAG,
+ String.format(
+ "abnormal interpolation:\nupper:%s\nlower:%s",
+ upperHistEntry, lowerHistEntry));
}
}
final double batteryLevel =
lowerHistEntry == null
? upperHistEntry.mBatteryLevel
: interpolate(
- lowerHistEntry.mBatteryLevel,
- upperHistEntry.mBatteryLevel,
- ratio);
+ lowerHistEntry.mBatteryLevel, upperHistEntry.mBatteryLevel, ratio);
return new BatteryHistEntry(
upperHistEntry,
- /*bootTimestamp=*/ upperHistEntry.mBootTimestamp
- - (upperTimestamp - slotTimestamp),
- /*timestamp=*/ slotTimestamp,
+ /* bootTimestamp= */ upperHistEntry.mBootTimestamp
+ - (upperTimestamp - slotTimestamp),
+ /* timestamp= */ slotTimestamp,
totalPower,
consumePower,
foregroundUsageConsumePower,
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java
index d64bf34..2063f2d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java
@@ -26,9 +26,7 @@
import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryUtils;
-/**
- * Custom preference for displaying the battery level as chart graph.
- */
+/** Custom preference for displaying the battery level as chart graph. */
public class BatteryHistoryPreference extends Preference {
private static final String TAG = "BatteryHistoryPreference";
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
index 09d66c7..231c730 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
@@ -47,13 +47,14 @@
private final List<Integer> mLevels;
public PeriodBatteryLevelData(
- @NonNull Map<Long, Integer> batteryLevelMap,
- @NonNull List<Long> timestamps) {
+ @NonNull Map<Long, Integer> batteryLevelMap, @NonNull List<Long> timestamps) {
mTimestamps = timestamps;
mLevels = new ArrayList<>(timestamps.size());
for (Long timestamp : timestamps) {
- mLevels.add(batteryLevelMap.containsKey(timestamp)
- ? batteryLevelMap.get(timestamp) : BATTERY_LEVEL_UNKNOWN);
+ mLevels.add(
+ batteryLevelMap.containsKey(timestamp)
+ ? batteryLevelMap.get(timestamp)
+ : BATTERY_LEVEL_UNKNOWN);
}
}
@@ -67,8 +68,11 @@
@Override
public String toString() {
- return String.format(Locale.ENGLISH, "timestamps: %s; levels: %s",
- Objects.toString(mTimestamps), Objects.toString(mLevels));
+ return String.format(
+ Locale.ENGLISH,
+ "timestamps: %s; levels: %s",
+ Objects.toString(mTimestamps),
+ Objects.toString(mLevels));
}
private int getIndexByTimestamps(long startTimestamp, long endTimestamp) {
@@ -83,14 +87,15 @@
}
/**
- * There could be 2 cases for the daily battery levels:
+ * There could be 2 cases for the daily battery levels: <br>
* 1) length is 2: The usage data is within 1 day. Only contains start and end data, such as
- * data of 2022-01-01 06:00 and 2022-01-01 16:00.
+ * data of 2022-01-01 06:00 and 2022-01-01 16:00. <br>
* 2) length > 2: The usage data is more than 1 days. The data should be the start, end and 0am
- * data of every day between the start and end, such as data of 2022-01-01 06:00,
- * 2022-01-02 00:00, 2022-01-03 00:00 and 2022-01-03 08:00.
+ * data of every day between the start and end, such as data of 2022-01-01 06:00, 2022-01-02
+ * 00:00, 2022-01-03 00:00 and 2022-01-03 08:00.
*/
private final PeriodBatteryLevelData mDailyBatteryLevels;
+
// The size of hourly data must be the size of daily data - 1.
private final List<PeriodBatteryLevelData> mHourlyBatteryLevelsPerDay;
@@ -118,8 +123,9 @@
final int hourlyHighlightIndex =
(dailyHighlightIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID)
? BatteryChartViewModel.SELECTED_INDEX_INVALID
- : mHourlyBatteryLevelsPerDay.get(dailyHighlightIndex)
- .getIndexByTimestamps(startTimestamp, endTimestamp);
+ : mHourlyBatteryLevelsPerDay
+ .get(dailyHighlightIndex)
+ .getIndexByTimestamps(startTimestamp, endTimestamp);
return Pair.create(dailyHighlightIndex, hourlyHighlightIndex);
}
@@ -133,14 +139,16 @@
@Override
public String toString() {
- return String.format(Locale.ENGLISH,
+ return String.format(
+ Locale.ENGLISH,
"dailyBatteryLevels: %s; hourlyBatteryLevelsPerDay: %s",
Objects.toString(mDailyBatteryLevels),
Objects.toString(mHourlyBatteryLevelsPerDay));
}
@Nullable
- static BatteryLevelData combine(@Nullable BatteryLevelData existingBatteryLevelData,
+ static BatteryLevelData combine(
+ @Nullable BatteryLevelData existingBatteryLevelData,
List<BatteryEvent> batteryLevelRecordEvents) {
final Map<Long, Integer> batteryLevelMap = new ArrayMap<>(batteryLevelRecordEvents.size());
for (BatteryEvent event : batteryLevelRecordEvents) {
@@ -152,7 +160,8 @@
for (int dayIndex = 0; dayIndex < multiDaysData.size(); dayIndex++) {
PeriodBatteryLevelData oneDayData = multiDaysData.get(dayIndex);
for (int hourIndex = 0; hourIndex < oneDayData.getLevels().size(); hourIndex++) {
- batteryLevelMap.put(oneDayData.getTimestamps().get(hourIndex),
+ batteryLevelMap.put(
+ oneDayData.getTimestamps().get(hourIndex),
oneDayData.getLevels().get(hourIndex));
}
}
@@ -163,11 +172,10 @@
/**
* Computes expected daily timestamp slots.
*
- * The valid result should be composed of 3 parts:
- * 1) start timestamp
- * 2) every 00:00 timestamp (default timezone) between the start and end
- * 3) end timestamp
- * Otherwise, returns an empty list.
+ * <p>The valid result should be composed of 3 parts: <br>
+ * 1) start timestamp <br>
+ * 2) every 00:00 timestamp (default timezone) between the start and end <br>
+ * 3) end timestamp Otherwise, returns an empty list.
*/
@VisibleForTesting
static List<Long> getDailyTimestamps(final List<Long> timestampList) {
@@ -176,7 +184,8 @@
final List<Long> dailyTimestampList = new ArrayList<>();
final long startTimestamp = timestampList.get(0);
final long endTimestamp = timestampList.get(timestampList.size() - 1);
- for (long timestamp = startTimestamp; timestamp < endTimestamp;
+ for (long timestamp = startTimestamp;
+ timestamp < endTimestamp;
timestamp = TimestampUtils.getNextDayTimestamp(timestamp)) {
dailyTimestampList.add(timestamp);
}
@@ -193,7 +202,8 @@
hourlyTimestampsPerDay.add(startTime);
for (long timestamp = TimestampUtils.getNextEvenHourTimestamp(startTime);
- timestamp < endTime; timestamp += TIME_SLOT) {
+ timestamp < endTime;
+ timestamp += TIME_SLOT) {
hourlyTimestampsPerDay.add(timestamp);
}
hourlyTimestampsPerDay.add(endTime);
@@ -203,4 +213,3 @@
return hourlyTimestamps;
}
}
-
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
index 2c799fa..7eec816 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
@@ -34,9 +34,7 @@
import com.google.android.material.button.MaterialButton;
-/**
- * A preference for displaying the battery tips card view.
- */
+/** A preference for displaying the battery tips card view. */
public class BatteryTipsCardPreference extends Preference implements View.OnClickListener {
private static final String TAG = "BatteryTipsCardPreference";
@@ -55,10 +53,8 @@
private int mIconResourceId = 0;
private int mMainButtonStrokeColorResourceId = 0;
- @VisibleForTesting
- CharSequence mMainButtonLabel;
- @VisibleForTesting
- CharSequence mDismissButtonLabel;
+ @VisibleForTesting CharSequence mMainButtonLabel;
+ @VisibleForTesting CharSequence mDismissButtonLabel;
public BatteryTipsCardPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -76,9 +72,7 @@
mOnRejectListener = listener;
}
- /**
- * Sets the icon in tips card.
- */
+ /** Sets the icon in tips card. */
public void setIconResourceId(int resourceId) {
if (mIconResourceId != resourceId) {
mIconResourceId = resourceId;
@@ -86,9 +80,7 @@
}
}
- /**
- * Sets the stroke color of main button in tips card.
- */
+ /** Sets the stroke color of main button in tips card. */
public void setMainButtonStrokeColorResourceId(int resourceId) {
if (mMainButtonStrokeColorResourceId != resourceId) {
mMainButtonStrokeColorResourceId = resourceId;
@@ -96,9 +88,7 @@
}
}
- /**
- * Sets the label of main button in tips card.
- */
+ /** Sets the label of main button in tips card. */
public void setMainButtonLabel(CharSequence label) {
if (!TextUtils.equals(mMainButtonLabel, label)) {
mMainButtonLabel = label;
@@ -106,9 +96,7 @@
}
}
- /**
- * Sets the label of dismiss button in tips card.
- */
+ /** Sets the label of dismiss button in tips card. */
public void setDismissButtonLabel(CharSequence label) {
if (!TextUtils.equals(mDismissButtonLabel, label)) {
mDismissButtonLabel = label;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
index 44b2421..5a1fb26 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
@@ -51,12 +51,9 @@
private OnAnomalyConfirmListener mOnAnomalyConfirmListener;
private OnAnomalyRejectListener mOnAnomalyRejectListener;
- @VisibleForTesting
- BatteryTipsCardPreference mCardPreference;
- @VisibleForTesting
- AnomalyEventWrapper mAnomalyEventWrapper = null;
- @VisibleForTesting
- Boolean mIsAcceptable = false;
+ @VisibleForTesting BatteryTipsCardPreference mCardPreference;
+ @VisibleForTesting AnomalyEventWrapper mAnomalyEventWrapper = null;
+ @VisibleForTesting Boolean mIsAcceptable = false;
public BatteryTipsController(Context context) {
super(context, ROOT_PREFERENCE_KEY);
@@ -94,7 +91,8 @@
}
mCardPreference.setVisible(false);
mMetricsFeatureProvider.action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
+ mContext,
+ SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
mAnomalyEventWrapper.getEventId());
}
@@ -117,28 +115,31 @@
}
// Set battery tips card listener
- mCardPreference.setOnConfirmListener(() -> {
- mCardPreference.setVisible(false);
- if (mOnAnomalyConfirmListener != null) {
- mOnAnomalyConfirmListener.onAnomalyConfirm();
- } else if (mAnomalyEventWrapper.launchSubSetting()) {
- mMetricsFeatureProvider.action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, eventId);
- }
- });
- mCardPreference.setOnRejectListener(() -> {
- mCardPreference.setVisible(false);
- if (mOnAnomalyRejectListener != null) {
- mOnAnomalyRejectListener.onAnomalyReject();
- }
- // For anomaly events with same record key, dismissed until next time full charged.
- final String dismissRecordKey = mAnomalyEventWrapper.getDismissRecordKey();
- if (!TextUtils.isEmpty(dismissRecordKey)) {
- DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, dismissRecordKey);
- }
- mMetricsFeatureProvider.action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, eventId);
- });
+ mCardPreference.setOnConfirmListener(
+ () -> {
+ mCardPreference.setVisible(false);
+ if (mOnAnomalyConfirmListener != null) {
+ mOnAnomalyConfirmListener.onAnomalyConfirm();
+ } else if (mAnomalyEventWrapper.launchSubSetting()) {
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, eventId);
+ }
+ });
+ mCardPreference.setOnRejectListener(
+ () -> {
+ mCardPreference.setVisible(false);
+ if (mOnAnomalyRejectListener != null) {
+ mOnAnomalyRejectListener.onAnomalyReject();
+ }
+ // For anomaly events with same record key, dismissed until next time full
+ // charged.
+ final String dismissRecordKey = mAnomalyEventWrapper.getDismissRecordKey();
+ if (!TextUtils.isEmpty(dismissRecordKey)) {
+ DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, dismissRecordKey);
+ }
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, eventId);
+ });
mCardPreference.setVisible(true);
mMetricsFeatureProvider.action(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
index 7fedec7..d6f8709 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
@@ -23,6 +23,7 @@
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.view.View;
@@ -50,7 +51,6 @@
import com.android.settingslib.widget.FooterPreference;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -58,7 +58,7 @@
/** Controller for battery usage breakdown preference group. */
public class BatteryUsageBreakdownController extends BasePreferenceController
- implements LifecycleObserver, OnResume, OnDestroy {
+ implements LifecycleObserver, OnResume, OnDestroy {
private static final String TAG = "BatteryUsageBreakdownController";
private static final String ROOT_PREFERENCE_KEY = "battery_usage_breakdown";
private static final String FOOTER_PREFERENCE_KEY = "battery_usage_footer";
@@ -74,45 +74,33 @@
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final Handler mHandler = new Handler(Looper.getMainLooper());
- @VisibleForTesting
- final Map<String, Preference> mPreferenceCache = new HashMap<>();
+ @VisibleForTesting final Map<String, Preference> mPreferenceCache = new ArrayMap<>();
private int mSpinnerPosition;
private String mSlotTimestamp;
- @VisibleForTesting
- Context mPrefContext;
- @VisibleForTesting
- PreferenceCategory mRootPreference;
- @VisibleForTesting
- SpinnerPreference mSpinnerPreference;
- @VisibleForTesting
- PreferenceGroup mAppListPreferenceGroup;
- @VisibleForTesting
- FooterPreference mFooterPreference;
- @VisibleForTesting
- BatteryDiffData mBatteryDiffData;
- @VisibleForTesting
- String mPercentLessThanThresholdText;
- @VisibleForTesting
- boolean mIsHighlightSlot;
- @VisibleForTesting
- String mAnomalyEventId;
- @VisibleForTesting
- String mAnomalyEntryKey;
- @VisibleForTesting
- String mAnomalyHintString;
- @VisibleForTesting
- String mAnomalyHintPrefKey;
+ @VisibleForTesting Context mPrefContext;
+ @VisibleForTesting PreferenceCategory mRootPreference;
+ @VisibleForTesting SpinnerPreference mSpinnerPreference;
+ @VisibleForTesting PreferenceGroup mAppListPreferenceGroup;
+ @VisibleForTesting FooterPreference mFooterPreference;
+ @VisibleForTesting BatteryDiffData mBatteryDiffData;
+ @VisibleForTesting String mPercentLessThanThresholdText;
+ @VisibleForTesting boolean mIsHighlightSlot;
+ @VisibleForTesting String mAnomalyEventId;
+ @VisibleForTesting String mAnomalyEntryKey;
+ @VisibleForTesting String mAnomalyHintString;
+ @VisibleForTesting String mAnomalyHintPrefKey;
public BatteryUsageBreakdownController(
- Context context, Lifecycle lifecycle, SettingsActivity activity,
+ Context context,
+ Lifecycle lifecycle,
+ SettingsActivity activity,
InstrumentedPreferenceFragment fragment) {
super(context, ROOT_PREFERENCE_KEY);
mActivity = activity;
mFragment = fragment;
- mMetricsFeatureProvider =
- FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
if (lifecycle != null) {
lifecycle.addObserver(this);
}
@@ -133,7 +121,7 @@
@Override
public void onDestroy() {
- mHandler.removeCallbacksAndMessages(/*token=*/ null);
+ mHandler.removeCallbacksAndMessages(/* token= */ null);
mPreferenceCache.clear();
mAppListPreferenceGroup.removeAll();
}
@@ -149,14 +137,17 @@
}
private boolean isAnomalyBatteryDiffEntry(BatteryDiffEntry entry) {
- return mIsHighlightSlot && mAnomalyEntryKey != null
+ return mIsHighlightSlot
+ && mAnomalyEntryKey != null
&& mAnomalyEntryKey.equals(entry.getKey());
}
private String getActionKey(BatteryDiffEntry entry) {
- final String actionKey = TextUtils.isEmpty(entry.getPackageName())
- ? PACKAGE_NAME_NONE : entry.getPackageName();
- return !isAnomalyBatteryDiffEntry(entry) ? actionKey : actionKey + "|" + mAnomalyEventId;
+ final String actionKey =
+ TextUtils.isEmpty(entry.getPackageName())
+ ? PACKAGE_NAME_NONE
+ : entry.getPackageName();
+ return !isAnomalyBatteryDiffEntry(entry) ? actionKey : actionKey + "|" + mAnomalyEventId;
}
@Override
@@ -174,15 +165,24 @@
/* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
getActionKey(diffEntry),
(int) Math.round(diffEntry.getPercentage()));
- Log.d(TAG, String.format("handleClick() label=%s key=%s package=%s",
- diffEntry.getAppLabel(), diffEntry.getKey(), diffEntry.getPackageName()));
- final String anomalyHintPrefKey = isAnomalyBatteryDiffEntry(diffEntry)
- ? mAnomalyHintPrefKey : null;
- final String anomalyHintText = isAnomalyBatteryDiffEntry(diffEntry)
- ? mAnomalyHintString : null;
- AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment.getMetricsCategory(),
- diffEntry, powerPref.getPercentage(), mSlotTimestamp,
- /*showTimeInformation=*/ true, anomalyHintPrefKey, anomalyHintText);
+ Log.d(
+ TAG,
+ String.format(
+ "handleClick() label=%s key=%s package=%s",
+ diffEntry.getAppLabel(), diffEntry.getKey(), diffEntry.getPackageName()));
+ final String anomalyHintPrefKey =
+ isAnomalyBatteryDiffEntry(diffEntry) ? mAnomalyHintPrefKey : null;
+ final String anomalyHintText =
+ isAnomalyBatteryDiffEntry(diffEntry) ? mAnomalyHintString : null;
+ AdvancedPowerUsageDetail.startBatteryDetailPage(
+ mActivity,
+ mFragment.getMetricsCategory(),
+ diffEntry,
+ powerPref.getPercentage(),
+ mSlotTimestamp,
+ /* showTimeInformation= */ true,
+ anomalyHintPrefKey,
+ anomalyHintText);
return true;
}
@@ -194,15 +194,16 @@
mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY);
mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY);
mFooterPreference = screen.findPreference(FOOTER_PREFERENCE_KEY);
- mPercentLessThanThresholdText = mPrefContext.getString(
- R.string.battery_usage_less_than_percent,
- Utils.formatPercentage(BatteryDiffData.SMALL_PERCENTAGE_THRESHOLD, false));
+ mPercentLessThanThresholdText =
+ mPrefContext.getString(
+ R.string.battery_usage_less_than_percent,
+ Utils.formatPercentage(BatteryDiffData.SMALL_PERCENTAGE_THRESHOLD, false));
mAppListPreferenceGroup.setOrderingAsAdded(false);
mSpinnerPreference.initializeSpinner(
- new String[]{
- mPrefContext.getString(R.string.battery_usage_spinner_view_by_apps),
- mPrefContext.getString(R.string.battery_usage_spinner_view_by_systems)
+ new String[] {
+ mPrefContext.getString(R.string.battery_usage_spinner_view_by_apps),
+ mPrefContext.getString(R.string.battery_usage_spinner_view_by_systems)
},
new AdapterView.OnItemSelectedListener() {
@Override
@@ -210,35 +211,38 @@
AdapterView<?> parent, View view, int position, long id) {
if (mSpinnerPosition != position) {
mSpinnerPosition = position;
- mHandler.post(() -> {
- removeAndCacheAllUnusedPreferences();
- addAllPreferences();
- mMetricsFeatureProvider.action(
- mPrefContext,
- SettingsEnums.ACTION_BATTERY_USAGE_SPINNER,
- mSpinnerPosition);
- });
+ mHandler.post(
+ () -> {
+ removeAndCacheAllUnusedPreferences();
+ addAllPreferences();
+ mMetricsFeatureProvider.action(
+ mPrefContext,
+ SettingsEnums.ACTION_BATTERY_USAGE_SPINNER,
+ mSpinnerPosition);
+ });
}
}
@Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
+ public void onNothingSelected(AdapterView<?> parent) {}
});
}
/**
* Updates UI when the battery usage is updated.
- * @param slotUsageData The battery usage diff data for the selected slot. This is used in
- * the app list.
+ *
+ * @param slotUsageData The battery usage diff data for the selected slot. This is used in the
+ * app list.
* @param slotTimestamp The selected slot timestamp information. This is used in the battery
- * usage breakdown category.
- * @param isAllUsageDataEmpty Whether all the battery usage data is null or empty. This is
- * used when showing the footer.
+ * usage breakdown category.
+ * @param isAllUsageDataEmpty Whether all the battery usage data is null or empty. This is used
+ * when showing the footer.
*/
void handleBatteryUsageUpdated(
- BatteryDiffData slotUsageData, String slotTimestamp,
- boolean isAllUsageDataEmpty, boolean isHighlightSlot,
+ BatteryDiffData slotUsageData,
+ String slotTimestamp,
+ boolean isAllUsageDataEmpty,
+ boolean isHighlightSlot,
Optional<AnomalyEventWrapper> optionalAnomalyEventWrapper) {
mBatteryDiffData = slotUsageData;
mSlotTimestamp = slotTimestamp;
@@ -247,14 +251,15 @@
if (optionalAnomalyEventWrapper != null) {
final AnomalyEventWrapper anomalyEventWrapper =
optionalAnomalyEventWrapper.orElse(null);
- mAnomalyEventId = anomalyEventWrapper != null
- ? anomalyEventWrapper.getEventId() : null;
- mAnomalyEntryKey = anomalyEventWrapper != null
- ? anomalyEventWrapper.getAnomalyEntryKey() : null;
- mAnomalyHintString = anomalyEventWrapper != null
- ? anomalyEventWrapper.getAnomalyHintString() : null;
- mAnomalyHintPrefKey = anomalyEventWrapper != null
- ? anomalyEventWrapper.getAnomalyHintPrefKey() : null;
+ mAnomalyEventId = anomalyEventWrapper != null ? anomalyEventWrapper.getEventId() : null;
+ mAnomalyEntryKey =
+ anomalyEventWrapper != null ? anomalyEventWrapper.getAnomalyEntryKey() : null;
+ mAnomalyHintString =
+ anomalyEventWrapper != null ? anomalyEventWrapper.getAnomalyHintString() : null;
+ mAnomalyHintPrefKey =
+ anomalyEventWrapper != null
+ ? anomalyEventWrapper.getAnomalyHintPrefKey()
+ : null;
}
showCategoryTitle(slotTimestamp);
@@ -263,35 +268,39 @@
}
private void showCategoryTitle(String slotTimestamp) {
- mRootPreference.setTitle(slotTimestamp == null
- ? mPrefContext.getString(
- R.string.battery_usage_breakdown_title_since_last_full_charge)
- : mPrefContext.getString(
- R.string.battery_usage_breakdown_title_for_slot, slotTimestamp));
+ mRootPreference.setTitle(
+ slotTimestamp == null
+ ? mPrefContext.getString(
+ R.string.battery_usage_breakdown_title_since_last_full_charge)
+ : mPrefContext.getString(
+ R.string.battery_usage_breakdown_title_for_slot, slotTimestamp));
mRootPreference.setVisible(true);
}
private void showFooterPreference(boolean isAllBatteryUsageEmpty) {
- mFooterPreference.setTitle(mPrefContext.getString(
- isAllBatteryUsageEmpty
- ? R.string.battery_usage_screen_footer_empty
- : R.string.battery_usage_screen_footer));
+ mFooterPreference.setTitle(
+ mPrefContext.getString(
+ isAllBatteryUsageEmpty
+ ? R.string.battery_usage_screen_footer_empty
+ : R.string.battery_usage_screen_footer));
mFooterPreference.setVisible(true);
}
private void showSpinnerAndAppList() {
if (mBatteryDiffData == null) {
- mHandler.post(() -> {
- removeAndCacheAllUnusedPreferences();
- });
+ mHandler.post(
+ () -> {
+ removeAndCacheAllUnusedPreferences();
+ });
return;
}
mSpinnerPreference.setVisible(true);
mAppListPreferenceGroup.setVisible(true);
- mHandler.post(() -> {
- removeAndCacheAllUnusedPreferences();
- addAllPreferences();
- });
+ mHandler.post(
+ () -> {
+ removeAndCacheAllUnusedPreferences();
+ addAllPreferences();
+ });
}
private List<BatteryDiffEntry> getBatteryDiffEntries() {
@@ -348,8 +357,11 @@
}
prefIndex++;
}
- Log.d(TAG, String.format("addAllPreferences() is finished in %d/ms",
- (System.currentTimeMillis() - start)));
+ Log.d(
+ TAG,
+ String.format(
+ "addAllPreferences() is finished in %d/ms",
+ (System.currentTimeMillis() - start)));
}
@VisibleForTesting
@@ -372,8 +384,7 @@
}
@VisibleForTesting
- void setPreferencePercentage(
- PowerGaugePreference preference, BatteryDiffEntry entry) {
+ void setPreferencePercentage(PowerGaugePreference preference, BatteryDiffEntry entry) {
preference.setPercentage(
entry.getPercentage() < BatteryDiffData.SMALL_PERCENTAGE_THRESHOLD
? mPercentLessThanThresholdText
@@ -383,11 +394,13 @@
}
@VisibleForTesting
- void setPreferenceSummary(
- PowerGaugePreference preference, BatteryDiffEntry entry) {
+ void setPreferenceSummary(PowerGaugePreference preference, BatteryDiffEntry entry) {
preference.setSummary(
- BatteryUtils.buildBatteryUsageTimeSummary(mPrefContext, entry.isSystemEntry(),
- entry.mForegroundUsageTimeInMs, entry.mBackgroundUsageTimeInMs,
+ BatteryUtils.buildBatteryUsageTimeSummary(
+ mPrefContext,
+ entry.isSystemEntry(),
+ entry.mForegroundUsageTimeInMs,
+ entry.mBackgroundUsageTimeInMs,
entry.mScreenOnTimeInMs));
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
index 006928a..9fb70fa 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
@@ -36,23 +36,23 @@
/** A {@link BatteryUsageBroadcastReceiver} for battery usage data requesting. */
public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "BatteryUsageBroadcastReceiver";
+
/** An intent action to request Settings to clear cache data. */
public static final String ACTION_CLEAR_BATTERY_CACHE_DATA =
"com.android.settings.battery.action.CLEAR_BATTERY_CACHE_DATA";
+
/** An intent action for power is plugging. */
public static final String ACTION_BATTERY_PLUGGING =
"com.android.settings.battery.action.ACTION_BATTERY_PLUGGING";
+
/** An intent action for power is unplugging. */
public static final String ACTION_BATTERY_UNPLUGGING =
"com.android.settings.battery.action.ACTION_BATTERY_UNPLUGGING";
- @VisibleForTesting
- static long sBroadcastDelayFromBoot = Duration.ofMinutes(40).toMillis();
- @VisibleForTesting
- static boolean sIsDebugMode = Build.TYPE.equals("userdebug");
+ @VisibleForTesting static long sBroadcastDelayFromBoot = Duration.ofMinutes(40).toMillis();
+ @VisibleForTesting static boolean sIsDebugMode = Build.TYPE.equals("userdebug");
- @VisibleForTesting
- boolean mFetchBatteryUsageData = false;
+ @VisibleForTesting boolean mFetchBatteryUsageData = false;
private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
@@ -68,9 +68,10 @@
return;
}
DatabaseUtils.recordDateTime(context, action);
- final String fullChargeIntentAction = FeatureFactory.getFeatureFactory()
- .getPowerUsageFeatureProvider()
- .getFullChargeIntentAction();
+ final String fullChargeIntentAction =
+ FeatureFactory.getFeatureFactory()
+ .getPowerUsageFeatureProvider()
+ .getFullChargeIntentAction();
switch (action) {
case Intent.ACTION_BATTERY_LEVEL_CHANGED:
// Only when fullChargeIntentAction is ACTION_BATTERY_LEVEL_CHANGED,
@@ -117,13 +118,16 @@
final long broadcastDelay = sBroadcastDelayFromBoot - SystemClock.elapsedRealtime();
// If current boot time is smaller than expected delay, cancel sending the broadcast.
if (delayHourlyJobWhenBooting && broadcastDelay > 0) {
- Log.d(TAG, "cancel sendBroadcastToFetchUsageData when broadcastDelay is "
- + broadcastDelay + "ms.");
+ Log.d(
+ TAG,
+ "cancel sendBroadcastToFetchUsageData when broadcastDelay is "
+ + broadcastDelay
+ + "ms.");
return;
}
mFetchBatteryUsageData = true;
- BatteryUsageDataLoader.enqueueWork(context, /*isFullChargeStart=*/ true);
+ BatteryUsageDataLoader.enqueueWork(context, /* isFullChargeStart= */ true);
BootBroadcastReceiver.invokeJobRecheck(context);
}
@@ -131,7 +135,11 @@
final long timestamp = System.currentTimeMillis();
final Intent intent = BatteryUtils.getBatteryIntent(context);
final int batteryLevel = BatteryStatus.getBatteryLevel(intent);
- mExecutor.execute(() -> DatabaseUtils.sendBatteryEventData(context,
- ConvertUtils.convertToBatteryEvent(timestamp, batteryEventType, batteryLevel)));
+ mExecutor.execute(
+ () ->
+ DatabaseUtils.sendBatteryEventData(
+ context,
+ ConvertUtils.convertToBatteryEvent(
+ timestamp, batteryEventType, batteryLevel)));
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java
index edba7c4..4f2ee79 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProvider.java
@@ -53,6 +53,7 @@
/** Codes */
private static final int BATTERY_STATE_CODE = 1;
+
private static final int APP_USAGE_LATEST_TIMESTAMP_CODE = 2;
private static final int APP_USAGE_EVENT_CODE = 3;
private static final int BATTERY_EVENT_CODE = 4;
@@ -67,32 +68,32 @@
static {
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.BATTERY_STATE_TABLE,
- /*code=*/ BATTERY_STATE_CODE);
+ /* path= */ DatabaseUtils.BATTERY_STATE_TABLE,
+ /* code= */ BATTERY_STATE_CODE);
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.APP_USAGE_LATEST_TIMESTAMP_PATH,
- /*code=*/ APP_USAGE_LATEST_TIMESTAMP_CODE);
+ /* path= */ DatabaseUtils.APP_USAGE_LATEST_TIMESTAMP_PATH,
+ /* code= */ APP_USAGE_LATEST_TIMESTAMP_CODE);
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.APP_USAGE_EVENT_TABLE,
- /*code=*/ APP_USAGE_EVENT_CODE);
+ /* path= */ DatabaseUtils.APP_USAGE_EVENT_TABLE,
+ /* code= */ APP_USAGE_EVENT_CODE);
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.BATTERY_EVENT_TABLE,
- /*code=*/ BATTERY_EVENT_CODE);
+ /* path= */ DatabaseUtils.BATTERY_EVENT_TABLE,
+ /* code= */ BATTERY_EVENT_CODE);
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.LAST_FULL_CHARGE_TIMESTAMP_PATH,
- /*code=*/ LAST_FULL_CHARGE_TIMESTAMP_CODE);
+ /* path= */ DatabaseUtils.LAST_FULL_CHARGE_TIMESTAMP_PATH,
+ /* code= */ LAST_FULL_CHARGE_TIMESTAMP_CODE);
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.BATTERY_STATE_LATEST_TIMESTAMP_PATH,
- /*code=*/ BATTERY_STATE_LATEST_TIMESTAMP_CODE);
+ /* path= */ DatabaseUtils.BATTERY_STATE_LATEST_TIMESTAMP_PATH,
+ /* code= */ BATTERY_STATE_LATEST_TIMESTAMP_CODE);
sUriMatcher.addURI(
DatabaseUtils.AUTHORITY,
- /*path=*/ DatabaseUtils.BATTERY_USAGE_SLOT_TABLE,
- /*code=*/ BATTERY_USAGE_SLOT_CODE);
+ /* path= */ DatabaseUtils.BATTERY_USAGE_SLOT_TABLE,
+ /* code= */ BATTERY_USAGE_SLOT_CODE);
}
private Clock mClock;
@@ -177,7 +178,7 @@
throw new IllegalArgumentException("unknown URI: " + uri);
}
} catch (RuntimeException e) {
- if (e instanceof IllegalArgumentException) {
+ if (e instanceof IllegalArgumentException) {
throw e;
}
Log.e(TAG, "insert() from:" + uri + " error:", e);
@@ -208,8 +209,10 @@
} catch (RuntimeException e) {
Log.e(TAG, "query() from:" + uri + " error:", e);
}
- Log.d(TAG, String.format("getLastFullChargeTimestamp() in %d/ms",
- mClock.millis() - timestamp));
+ Log.d(
+ TAG,
+ String.format(
+ "getLastFullChargeTimestamp() in %d/ms", mClock.millis() - timestamp));
return cursor;
}
@@ -222,8 +225,11 @@
} catch (RuntimeException e) {
Log.e(TAG, "query() from:" + uri + " error:", e);
}
- Log.d(TAG, String.format("getBatteryStateLatestTimestamp() no later than %d in %d/ms",
- queryTimestamp, mClock.millis() - timestamp));
+ Log.d(
+ TAG,
+ String.format(
+ "getBatteryStateLatestTimestamp() no later than %d in %d/ms",
+ queryTimestamp, mClock.millis() - timestamp));
return cursor;
}
@@ -236,8 +242,11 @@
} catch (RuntimeException e) {
Log.e(TAG, "query() from:" + uri + " error:", e);
}
- Log.d(TAG, String.format("getBatteryStates() after %d in %d/ms",
- queryTimestamp, mClock.millis() - timestamp));
+ Log.d(
+ TAG,
+ String.format(
+ "getBatteryStates() after %d in %d/ms",
+ queryTimestamp, mClock.millis() - timestamp));
return cursor;
}
@@ -270,8 +279,11 @@
} catch (RuntimeException e) {
Log.e(TAG, "query() from:" + uri + " error:", e);
}
- Log.d(TAG, String.format("getAppUsageLatestTimestamp() for user %d in %d/ms",
- queryUserId, (mClock.millis() - timestamp)));
+ Log.d(
+ TAG,
+ String.format(
+ "getAppUsageLatestTimestamp() for user %d in %d/ms",
+ queryUserId, (mClock.millis() - timestamp)));
return cursor;
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
index 4a336eb..ead580b 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
@@ -39,21 +39,18 @@
private static final String TAG = "BatteryUsageDataLoader";
// For testing only.
- @VisibleForTesting
- static Supplier<List<BatteryEntry>> sFakeBatteryEntryListSupplier;
- @VisibleForTesting
- static Supplier<Map<Long, UsageEvents>> sFakeAppUsageEventsSupplier;
- @VisibleForTesting
- static Supplier<List<AppUsageEvent>> sFakeUsageEventsListSupplier;
+ @VisibleForTesting static Supplier<List<BatteryEntry>> sFakeBatteryEntryListSupplier;
+ @VisibleForTesting static Supplier<Map<Long, UsageEvents>> sFakeAppUsageEventsSupplier;
+ @VisibleForTesting static Supplier<List<AppUsageEvent>> sFakeUsageEventsListSupplier;
- private BatteryUsageDataLoader() {
- }
+ private BatteryUsageDataLoader() {}
static void enqueueWork(final Context context, final boolean isFullChargeStart) {
- AsyncTask.execute(() -> {
- Log.d(TAG, "loadUsageDataSafely() in the AsyncTask");
- loadUsageDataSafely(context.getApplicationContext(), isFullChargeStart);
- });
+ AsyncTask.execute(
+ () -> {
+ Log.d(TAG, "loadUsageDataSafely() in the AsyncTask");
+ loadUsageDataSafely(context.getApplicationContext(), isFullChargeStart);
+ });
}
@VisibleForTesting
@@ -62,19 +59,21 @@
final long currentTime = System.currentTimeMillis();
final BatteryUsageStats batteryUsageStats = DataProcessor.getBatteryUsageStats(context);
final List<BatteryEntry> batteryEntryList =
- sFakeBatteryEntryListSupplier != null ? sFakeBatteryEntryListSupplier.get()
- : DataProcessor.generateBatteryEntryListFromBatteryUsageStats(context,
- batteryUsageStats);
+ sFakeBatteryEntryListSupplier != null
+ ? sFakeBatteryEntryListSupplier.get()
+ : DataProcessor.generateBatteryEntryListFromBatteryUsageStats(
+ context, batteryUsageStats);
if (batteryEntryList == null || batteryEntryList.isEmpty()) {
Log.w(TAG, "getBatteryEntryList() returns null or empty content");
}
final long elapsedTime = System.currentTimeMillis() - currentTime;
Log.d(TAG, String.format("getBatteryUsageStats() in %d/ms", elapsedTime));
if (isFullChargeStart) {
- DatabaseUtils.recordDateTime(
- context, DatabaseUtils.KEY_LAST_LOAD_FULL_CHARGE_TIME);
- DatabaseUtils.sendBatteryEventData(context, ConvertUtils.convertToBatteryEvent(
- currentTime, BatteryEventType.FULL_CHARGED, 100));
+ DatabaseUtils.recordDateTime(context, DatabaseUtils.KEY_LAST_LOAD_FULL_CHARGE_TIME);
+ DatabaseUtils.sendBatteryEventData(
+ context,
+ ConvertUtils.convertToBatteryEvent(
+ currentTime, BatteryEventType.FULL_CHARGED, 100));
DatabaseUtils.removeDismissedPowerAnomalyKeys(context);
}
@@ -105,8 +104,11 @@
return;
}
final long elapsedTime = System.currentTimeMillis() - start;
- Log.d(TAG, String.format("loadAppUsageData() size=%d in %d/ms", appUsageEventList.size(),
- elapsedTime));
+ Log.d(
+ TAG,
+ String.format(
+ "loadAppUsageData() size=%d in %d/ms",
+ appUsageEventList.size(), elapsedTime));
// Uploads the AppUsageEvent data into database.
DatabaseUtils.sendAppUsageEventData(context, appUsageEventList);
}
@@ -114,18 +116,28 @@
private static void preprocessBatteryUsageSlots(final Context context) {
final long start = System.currentTimeMillis();
final Handler handler = new Handler(Looper.getMainLooper());
- final BatteryLevelData batteryLevelData = DataProcessManager.getBatteryLevelData(
- context, handler, /*isFromPeriodJob=*/ true,
- batteryDiffDataMap -> {
- DatabaseUtils.sendBatteryUsageSlotData(context,
- ConvertUtils.convertToBatteryUsageSlotList(batteryDiffDataMap));
- if (batteryDiffDataMap.values().stream().anyMatch(data ->
- data != null && (!data.getAppDiffEntryList().isEmpty()
- || !data.getSystemDiffEntryList().isEmpty()))) {
- FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider()
- .detectSettingsAnomaly(context, /* displayDrain= */ 0);
- }
- });
+ final BatteryLevelData batteryLevelData =
+ DataProcessManager.getBatteryLevelData(
+ context,
+ handler,
+ /* isFromPeriodJob= */ true,
+ batteryDiffDataMap -> {
+ DatabaseUtils.sendBatteryUsageSlotData(
+ context,
+ ConvertUtils.convertToBatteryUsageSlotList(batteryDiffDataMap));
+ if (batteryDiffDataMap.values().stream()
+ .anyMatch(
+ data ->
+ data != null
+ && (!data.getSystemDiffEntryList()
+ .isEmpty()
+ || !data.getAppDiffEntryList()
+ .isEmpty()))) {
+ FeatureFactory.getFeatureFactory()
+ .getPowerUsageFeatureProvider()
+ .detectSettingsAnomaly(context, /* displayDrain= */ 0);
+ }
+ });
if (batteryLevelData == null) {
Log.d(TAG, "preprocessBatteryUsageSlots() no new battery usage data.");
return;
@@ -133,9 +145,11 @@
DatabaseUtils.sendBatteryEventData(
context, ConvertUtils.convertToBatteryEventList(batteryLevelData));
- Log.d(TAG, String.format(
- "preprocessBatteryUsageSlots() batteryLevelData=%s in %d/ms",
- batteryLevelData, System.currentTimeMillis() - start));
+ Log.d(
+ TAG,
+ String.format(
+ "preprocessBatteryUsageSlots() batteryLevelData=%s in %d/ms",
+ batteryLevelData, System.currentTimeMillis() - start));
}
private static void loadUsageDataSafely(
@@ -148,8 +162,10 @@
loadAppUsageData(context);
preprocessBatteryUsageSlots(context);
}
- Log.d(TAG, String.format(
- "loadUsageDataSafely() in %d/ms", System.currentTimeMillis() - start));
+ Log.d(
+ TAG,
+ String.format(
+ "loadUsageDataSafely() in %d/ms", System.currentTimeMillis() - start));
} catch (RuntimeException e) {
Log.e(TAG, "loadUsageData:", e);
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoader.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoader.java
index 7f112ae..26cd096 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoader.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoader.java
@@ -24,9 +24,7 @@
import com.android.settingslib.utils.AsyncLoaderCompat;
-/**
- * Loader to get new {@link BatteryUsageStats} in the background
- */
+/** Loader to get new {@link BatteryUsageStats} in the background */
public class BatteryUsageStatsLoader extends AsyncLoaderCompat<BatteryUsageStats> {
private static final String TAG = "BatteryUsageStatsLoader";
private final BatteryStatsManager mBatteryStatsManager;
@@ -55,6 +53,5 @@
}
@Override
- protected void onDiscardResult(BatteryUsageStats result) {
- }
+ protected void onDiscardResult(BatteryUsageStats result) {}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java
index ebf1543..94f9dc3 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiver.java
@@ -70,8 +70,7 @@
break;
case Intent.ACTION_TIME_CHANGED:
Log.d(TAG, "refresh job and clear all data from action=" + action);
- DatabaseUtils.clearAll(context);
- PeriodicJobManager.getInstance(context).refreshJob(/*fromBoot=*/ false);
+ DatabaseUtils.clearDataAfterTimeChangedIfNeeded(context);
break;
default:
Log.w(TAG, "receive unsupported action=" + action);
@@ -104,6 +103,6 @@
}
private static void refreshJobs(Context context) {
- PeriodicJobManager.getInstance(context).refreshJob(/*fromBoot=*/ true);
+ PeriodicJobManager.getInstance(context).refreshJob(/* fromBoot= */ true);
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index 4eef3a0..ae93734 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -57,15 +57,16 @@
/** A fake package name to represent no BatteryEntry data. */
public static final String FAKE_PACKAGE_NAME = "fake_package";
- @IntDef(prefix = {"CONSUMER_TYPE"}, value = {
- CONSUMER_TYPE_UNKNOWN,
- CONSUMER_TYPE_UID_BATTERY,
- CONSUMER_TYPE_USER_BATTERY,
- CONSUMER_TYPE_SYSTEM_BATTERY,
- })
+ @IntDef(
+ prefix = {"CONSUMER_TYPE"},
+ value = {
+ CONSUMER_TYPE_UNKNOWN,
+ CONSUMER_TYPE_UID_BATTERY,
+ CONSUMER_TYPE_USER_BATTERY,
+ CONSUMER_TYPE_SYSTEM_BATTERY,
+ })
@Retention(RetentionPolicy.SOURCE)
- public @interface ConsumerType {
- }
+ public @interface ConsumerType {}
public static final int CONSUMER_TYPE_UNKNOWN = 0;
public static final int CONSUMER_TYPE_UID_BATTERY = 1;
@@ -75,11 +76,9 @@
public static final int DEFAULT_USAGE_SOURCE = UsageStatsManager.USAGE_SOURCE_CURRENT_ACTIVITY;
public static final int EMPTY_USAGE_SOURCE = -1;
- @VisibleForTesting
- static int sUsageSource = EMPTY_USAGE_SOURCE;
+ @VisibleForTesting static int sUsageSource = EMPTY_USAGE_SOURCE;
- private ConvertUtils() {
- }
+ private ConvertUtils() {}
/** Whether {@code consumerType} is app consumer or not. */
public static boolean isUidConsumer(final int consumerType) {
@@ -109,17 +108,19 @@
final ContentValues values = new ContentValues();
if (entry != null && batteryUsageStats != null) {
values.put(BatteryHistEntry.KEY_UID, Long.valueOf(entry.getUid()));
- values.put(BatteryHistEntry.KEY_USER_ID,
+ values.put(
+ BatteryHistEntry.KEY_USER_ID,
Long.valueOf(UserHandle.getUserId(entry.getUid())));
final String packageName = entry.getDefaultPackageName();
values.put(BatteryHistEntry.KEY_PACKAGE_NAME, packageName != null ? packageName : "");
- values.put(BatteryHistEntry.KEY_CONSUMER_TYPE,
- Integer.valueOf(entry.getConsumerType()));
+ values.put(
+ BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(entry.getConsumerType()));
} else {
values.put(BatteryHistEntry.KEY_PACKAGE_NAME, FAKE_PACKAGE_NAME);
}
values.put(BatteryHistEntry.KEY_TIMESTAMP, Long.valueOf(timestamp));
- values.put(BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START,
+ values.put(
+ BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START,
Boolean.valueOf(isFullChargeStart));
final BatteryInformation batteryInformation =
constructBatteryInformation(
@@ -129,7 +130,8 @@
batteryStatus,
batteryHealth,
bootTimestamp);
- values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+ values.put(
+ BatteryHistEntry.KEY_BATTERY_INFORMATION,
convertBatteryInformationToString(batteryInformation));
// Save the BatteryInformation unencoded string into database for debugging.
if (Build.TYPE.equals("userdebug")) {
@@ -166,7 +168,8 @@
final BatteryUsageSlot batteryUsageSlot) {
final ContentValues values = new ContentValues(2);
values.put(BatteryUsageSlotEntity.KEY_TIMESTAMP, batteryUsageSlot.getStartTimestamp());
- values.put(BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT,
+ values.put(
+ BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT,
Base64.encodeToString(batteryUsageSlot.toByteArray(), Base64.DEFAULT));
return values;
}
@@ -200,33 +203,36 @@
/** Converts to {@link BatteryHistEntry} */
public static BatteryHistEntry convertToBatteryHistEntry(
- BatteryEntry entry,
- BatteryUsageStats batteryUsageStats) {
+ BatteryEntry entry, BatteryUsageStats batteryUsageStats) {
return new BatteryHistEntry(
convertBatteryEntryToContentValues(
entry,
batteryUsageStats,
- /*batteryLevel=*/ 0,
- /*batteryStatus=*/ 0,
- /*batteryHealth=*/ 0,
- /*bootTimestamp=*/ 0,
- /*timestamp=*/ 0,
- /*isFullChargeStart=*/ false));
+ /* batteryLevel= */ 0,
+ /* batteryStatus= */ 0,
+ /* batteryHealth= */ 0,
+ /* bootTimestamp= */ 0,
+ /* timestamp= */ 0,
+ /* isFullChargeStart= */ false));
}
/** Converts from {@link Event} to {@link AppUsageEvent} */
@Nullable
public static AppUsageEvent convertToAppUsageEvent(
- Context context, IUsageStatsManager usageStatsManager, final Event event,
+ Context context,
+ IUsageStatsManager usageStatsManager,
+ final Event event,
final long userId) {
final String packageName = event.getPackageName();
if (packageName == null) {
// See b/190609174: Event package names should never be null, but sometimes they are.
// Note that system events like device shutting down should still come with the android
// package name.
- Log.w(TAG, String.format(
- "Ignoring a usage event with null package name (timestamp=%d, type=%d)",
- event.getTimeStamp(), event.getEventType()));
+ Log.w(
+ TAG,
+ String.format(
+ "Ignoring a usage event with null package name (timestamp=%d, type=%d)",
+ event.getTimeStamp(), event.getEventType()));
return null;
}
@@ -246,13 +252,16 @@
getEffectivePackageName(
context, usageStatsManager, packageName, taskRootPackageName);
try {
- final long uid = context
- .getPackageManager()
- .getPackageUidAsUser(effectivePackageName, (int) userId);
+ final long uid =
+ context.getPackageManager()
+ .getPackageUidAsUser(effectivePackageName, (int) userId);
appUsageEventBuilder.setUid(uid);
} catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, String.format(
- "Fail to get uid for package %s of user %d)", event.getPackageName(), userId));
+ Log.w(
+ TAG,
+ String.format(
+ "Fail to get uid for package %s of user %d)",
+ event.getPackageName(), userId));
return null;
}
@@ -300,8 +309,7 @@
eventBuilder.setTimestamp(getLongFromCursor(cursor, BatteryEventEntity.KEY_TIMESTAMP));
eventBuilder.setType(
BatteryEventType.forNumber(
- getIntegerFromCursor(
- cursor, BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)));
+ getIntegerFromCursor(cursor, BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)));
eventBuilder.setBatteryLevel(
getIntegerFromCursor(cursor, BatteryEventEntity.KEY_BATTERY_LEVEL));
return eventBuilder.build();
@@ -315,10 +323,11 @@
batteryLevelData.getHourlyBatteryLevelsPerDay();
for (BatteryLevelData.PeriodBatteryLevelData oneDayData : levelDataList) {
for (int hourIndex = 0; hourIndex < oneDayData.getLevels().size() - 1; hourIndex++) {
- batteryEventList.add(convertToBatteryEvent(
- oneDayData.getTimestamps().get(hourIndex),
- BatteryEventType.EVEN_HOUR,
- oneDayData.getLevels().get(hourIndex)));
+ batteryEventList.add(
+ convertToBatteryEvent(
+ oneDayData.getTimestamps().get(hourIndex),
+ BatteryEventType.EVEN_HOUR,
+ oneDayData.getLevels().get(hourIndex)));
}
}
return batteryEventList;
@@ -329,8 +338,9 @@
final BatteryUsageSlot defaultInstance = BatteryUsageSlot.getDefaultInstance();
final int columnIndex =
cursor.getColumnIndex(BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT);
- return columnIndex < 0 ? defaultInstance : BatteryUtils.parseProtoFromString(
- cursor.getString(columnIndex), defaultInstance);
+ return columnIndex < 0
+ ? defaultInstance
+ : BatteryUtils.parseProtoFromString(cursor.getString(columnIndex), defaultInstance);
}
/** Converts from {@link Map<Long, BatteryDiffData>} to {@link List<BatteryUsageSlot>} */
@@ -343,18 +353,22 @@
return batteryUsageSlotList;
}
- /** Converts UTC timestamp to local time string for logging only, so use the US locale for
- * better readability in debugging. */
+ /**
+ * Converts UTC timestamp to local time string for logging only, so use the US locale for better
+ * readability in debugging.
+ */
public static String utcToLocalTimeForLogging(long timestamp) {
final Locale locale = Locale.US;
- final String pattern =
- DateFormat.getBestDateTimePattern(locale, "MMM dd,yyyy HH:mm:ss");
+ final String pattern = DateFormat.getBestDateTimePattern(locale, "MMM dd,yyyy HH:mm:ss");
return DateFormat.format(pattern, timestamp).toString();
}
/** Converts UTC timestamp to local time hour data. */
- public static String utcToLocalTimeHour(final Context context, final long timestamp,
- final boolean is24HourFormat, final boolean showMinute) {
+ public static String utcToLocalTimeHour(
+ final Context context,
+ final long timestamp,
+ final boolean is24HourFormat,
+ final boolean showMinute) {
final Locale locale = getLocale(context);
// e.g. for 12-hour format: 9 PM
// e.g. for 24-hour format: 09:00
@@ -367,8 +381,8 @@
public static String utcToLocalTimeDayOfWeek(
final Context context, final long timestamp, final boolean isAbbreviation) {
final Locale locale = getLocale(context);
- final String pattern = DateFormat.getBestDateTimePattern(locale,
- isAbbreviation ? "E" : "EEEE");
+ final String pattern =
+ DateFormat.getBestDateTimePattern(locale, isAbbreviation ? "E" : "EEEE");
return DateFormat.format(pattern, timestamp).toString();
}
@@ -377,10 +391,8 @@
if (context == null) {
return Locale.getDefault();
}
- final LocaleList locales =
- context.getResources().getConfiguration().getLocales();
- return locales != null && !locales.isEmpty() ? locales.get(0)
- : Locale.getDefault();
+ final LocaleList locales = context.getResources().getConfiguration().getLocales();
+ return locales != null && !locales.isEmpty() ? locales.get(0) : Locale.getDefault();
}
/**
@@ -396,14 +408,14 @@
*/
@VisibleForTesting
static String getEffectivePackageName(
- Context context, IUsageStatsManager usageStatsManager, final String packageName,
+ Context context,
+ IUsageStatsManager usageStatsManager,
+ final String packageName,
final String taskRootPackageName) {
final int usageSource = getUsageSource(context, usageStatsManager);
switch (usageSource) {
case UsageStatsManager.USAGE_SOURCE_TASK_ROOT_ACTIVITY:
- return !TextUtils.isEmpty(taskRootPackageName)
- ? taskRootPackageName
- : packageName;
+ return !TextUtils.isEmpty(taskRootPackageName) ? taskRootPackageName : packageName;
case UsageStatsManager.USAGE_SOURCE_CURRENT_ACTIVITY:
return packageName;
default:
@@ -432,9 +444,13 @@
try {
String taskRootPackageName = event.getTaskRootPackageName();
if (taskRootPackageName == null) {
- Log.w(TAG, String.format(
- "Null task root in event with timestamp %d, type=%d, package %s",
- event.getTimeStamp(), event.getEventType(), event.getPackageName()));
+ Log.w(
+ TAG,
+ String.format(
+ "Null task root in event with timestamp %d, type=%d, package %s",
+ event.getTimeStamp(),
+ event.getEventType(),
+ event.getPackageName()));
}
return taskRootPackageName;
} catch (NoSuchMethodError e) {
@@ -464,21 +480,24 @@
}
private static BatteryUsageDiff convertToBatteryUsageDiff(BatteryDiffEntry batteryDiffEntry) {
- BatteryUsageDiff.Builder builder = BatteryUsageDiff.newBuilder()
- .setUid(batteryDiffEntry.mUid)
- .setUserId(batteryDiffEntry.mUserId)
- .setIsHidden(batteryDiffEntry.mIsHidden)
- .setComponentId(batteryDiffEntry.mComponentId)
- .setConsumerType(batteryDiffEntry.mConsumerType)
- .setConsumePower(batteryDiffEntry.mConsumePower)
- .setForegroundUsageConsumePower(batteryDiffEntry.mForegroundUsageConsumePower)
- .setBackgroundUsageConsumePower(batteryDiffEntry.mBackgroundUsageConsumePower)
- .setForegroundServiceUsageConsumePower(
- batteryDiffEntry.mForegroundServiceUsageConsumePower)
- .setCachedUsageConsumePower(batteryDiffEntry.mCachedUsageConsumePower)
- .setForegroundUsageTime(batteryDiffEntry.mForegroundUsageTimeInMs)
- .setBackgroundUsageTime(batteryDiffEntry.mBackgroundUsageTimeInMs)
- .setScreenOnTime(batteryDiffEntry.mScreenOnTimeInMs);
+ BatteryUsageDiff.Builder builder =
+ BatteryUsageDiff.newBuilder()
+ .setUid(batteryDiffEntry.mUid)
+ .setUserId(batteryDiffEntry.mUserId)
+ .setIsHidden(batteryDiffEntry.mIsHidden)
+ .setComponentId(batteryDiffEntry.mComponentId)
+ .setConsumerType(batteryDiffEntry.mConsumerType)
+ .setConsumePower(batteryDiffEntry.mConsumePower)
+ .setForegroundUsageConsumePower(
+ batteryDiffEntry.mForegroundUsageConsumePower)
+ .setBackgroundUsageConsumePower(
+ batteryDiffEntry.mBackgroundUsageConsumePower)
+ .setForegroundServiceUsageConsumePower(
+ batteryDiffEntry.mForegroundServiceUsageConsumePower)
+ .setCachedUsageConsumePower(batteryDiffEntry.mCachedUsageConsumePower)
+ .setForegroundUsageTime(batteryDiffEntry.mForegroundUsageTimeInMs)
+ .setBackgroundUsageTime(batteryDiffEntry.mBackgroundUsageTimeInMs)
+ .setScreenOnTime(batteryDiffEntry.mScreenOnTimeInMs);
if (batteryDiffEntry.mKey != null) {
builder.setKey(batteryDiffEntry.mKey);
}
@@ -496,12 +515,13 @@
if (batteryDiffData == null) {
return BatteryUsageSlot.getDefaultInstance();
}
- final BatteryUsageSlot.Builder builder = BatteryUsageSlot.newBuilder()
- .setStartTimestamp(batteryDiffData.getStartTimestamp())
- .setEndTimestamp(batteryDiffData.getEndTimestamp())
- .setStartBatteryLevel(batteryDiffData.getStartBatteryLevel())
- .setEndBatteryLevel(batteryDiffData.getEndBatteryLevel())
- .setScreenOnTime(batteryDiffData.getScreenOnTime());
+ final BatteryUsageSlot.Builder builder =
+ BatteryUsageSlot.newBuilder()
+ .setStartTimestamp(batteryDiffData.getStartTimestamp())
+ .setEndTimestamp(batteryDiffData.getEndTimestamp())
+ .setStartBatteryLevel(batteryDiffData.getStartBatteryLevel())
+ .setEndBatteryLevel(batteryDiffData.getEndBatteryLevel())
+ .setScreenOnTime(batteryDiffData.getScreenOnTime());
for (BatteryDiffEntry batteryDiffEntry : batteryDiffData.getAppDiffEntryList()) {
builder.addAppUsage(convertToBatteryUsageDiff(batteryDiffEntry));
}
@@ -557,7 +577,7 @@
systemDiffEntries,
systemAppsPackageNames,
systemAppsUids,
- /*isAccumulated=*/ false);
+ /* isAccumulated= */ false);
}
private static BatteryInformation constructBatteryInformation(
@@ -568,15 +588,13 @@
final int batteryHealth,
final long bootTimestamp) {
final DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
+ DeviceBatteryState.newBuilder()
.setBatteryLevel(batteryLevel)
.setBatteryStatus(batteryStatus)
.setBatteryHealth(batteryHealth)
.build();
final BatteryInformation.Builder batteryInformationBuilder =
- BatteryInformation
- .newBuilder()
+ BatteryInformation.newBuilder()
.setDeviceBatteryState(deviceBatteryState)
.setBootTimestamp(bootTimestamp)
.setZoneId(TimeZone.getDefault().getID());
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java
index 1a226fd..b3bcb47 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java
@@ -34,7 +34,6 @@
import java.util.ArrayList;
import java.util.Calendar;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -42,27 +41,29 @@
/**
* Manages the async tasks to process battery and app usage data.
*
- * For now, there exist 4 async tasks in this manager:
+ * <p>For now, there exist 4 async tasks in this manager:
+ *
* <ul>
- * <li>loadCurrentBatteryHistoryMap: load the latest battery history data from battery stats
- * service.</li>
- * <li>loadCurrentAppUsageList: load the latest app usage data (last timestamp in database - now)
- * from usage stats service.</li>
- * <li>loadDatabaseAppUsageList: load the necessary app usage data (after last full charge) from
- * database</li>
- * <li>loadAndApplyBatteryMapFromServiceOnly: load all the battery history data (should be after
- * last full charge) from battery stats service and apply the callback function directly</li>
+ * <li>loadCurrentBatteryHistoryMap: load the latest battery history data from battery stats
+ * service.
+ * <li>loadCurrentAppUsageList: load the latest app usage data (last timestamp in database - now)
+ * from usage stats service.
+ * <li>loadDatabaseAppUsageList: load the necessary app usage data (after last full charge) from
+ * database
+ * <li>loadAndApplyBatteryMapFromServiceOnly: load all the battery history data (should be after
+ * last full charge) from battery stats service and apply the callback function directly
* </ul>
*
* If there is battery level data, the first 3 async tasks will be started at the same time.
+ *
* <ul>
- * <li>After loadCurrentAppUsageList and loadDatabaseAppUsageList complete, which means all app
- * usage data has been loaded, the intermediate usage result will be generated.</li>
- * <li>Then after all 3 async tasks complete, the battery history data and app usage data will be
- * combined to generate final data used for UI rendering. And the callback function will be
- * applied.</li>
- * <li>If current user is locked, which means we couldn't get the latest app usage data,
- * screen-on time will not be shown in the UI and empty screen-on time data will be returned.</li>
+ * <li>After loadCurrentAppUsageList and loadDatabaseAppUsageList complete, which means all app
+ * usage data has been loaded, the intermediate usage result will be generated.
+ * <li>Then after all 3 async tasks complete, the battery history data and app usage data will be
+ * combined to generate final data used for UI rendering. And the callback function will be
+ * applied.
+ * <li>If current user is locked, which means we couldn't get the latest app usage data, screen-on
+ * time will not be shown in the UI and empty screen-on time data will be returned.
* </ul>
*
* If there is no battery level data, the 4th async task will be started only and the usage map
@@ -72,12 +73,9 @@
private static final String TAG = "DataProcessManager";
private static final List<BatteryEventType> POWER_CONNECTION_EVENTS =
List.of(BatteryEventType.POWER_CONNECTED, BatteryEventType.POWER_DISCONNECTED);
- private static final List<BatteryEventType> BATTERY_LEVEL_RECORD_EVENTS =
- List.of(BatteryEventType.FULL_CHARGED, BatteryEventType.EVEN_HOUR);
// For testing only.
- @VisibleForTesting
- static Map<Long, Map<String, BatteryHistEntry>> sFakeBatteryHistoryMap;
+ @VisibleForTesting static Map<Long, Map<String, BatteryHistEntry>> sFakeBatteryHistoryMap;
// Raw start timestamp with round to the nearest hour.
private final long mRawStartTimestamp;
@@ -104,24 +102,24 @@
/**
* The indexed {@link AppUsagePeriod} list data for each corresponding time slot.
- * <p>{@code Long} stands for the userId.</p>
- * <p>{@code String} stands for the packageName.</p>
+ *
+ * <p>{@code Long} stands for the userId.
+ *
+ * <p>{@code String} stands for the packageName.
*/
private Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
mAppUsagePeriodMap;
/**
- * A callback listener when all the data is processed.
- * This happens when all the async tasks complete and generate the final callback.
+ * A callback listener when all the data is processed. This happens when all the async tasks
+ * complete and generate the final callback.
*/
public interface OnBatteryDiffDataMapLoadedListener {
/** The callback function when all the data is processed. */
void onBatteryDiffDataMapLoaded(Map<Long, BatteryDiffData> batteryDiffDataMap);
}
- /**
- * Constructor when there exists battery level data.
- */
+ /** Constructor when there exists battery level data. */
DataProcessManager(
Context context,
Handler handler,
@@ -140,9 +138,7 @@
mBatteryHistoryMap = batteryHistoryMap;
}
- /**
- * Constructor when there is no battery level data.
- */
+ /** Constructor when there is no battery level data. */
DataProcessManager(
Context context,
Handler handler,
@@ -160,16 +156,12 @@
mShowScreenOnTime = false;
}
- /**
- * Starts the async tasks to load battery history data and app usage data.
- */
+ /** Starts the async tasks to load battery history data and app usage data. */
public void start() {
- start(/*isFromPeriodJob=*/ false);
+ start(/* isFromPeriodJob= */ false);
}
- /**
- * Starts the async tasks to load battery history data and app usage data.
- */
+ /** Starts the async tasks to load battery history data and app usage data. */
public void start(boolean isFromPeriodJob) {
// If we have battery level data, load the battery history map and app usage simultaneously.
if (mHourlyBatteryLevelsPerDay != null) {
@@ -239,10 +231,13 @@
final long startTime = System.currentTimeMillis();
// Loads the current battery usage data from the battery stats service.
final Map<String, BatteryHistEntry> currentBatteryHistoryMap =
- DataProcessor.getCurrentBatteryHistoryMapFromStatsService(
- mContext);
- Log.d(TAG, String.format("execute loadCurrentBatteryHistoryMap size=%d in %d/ms",
- currentBatteryHistoryMap.size(), (System.currentTimeMillis() - startTime)));
+ DataProcessor.getCurrentBatteryHistoryMapFromStatsService(mContext);
+ Log.d(
+ TAG,
+ String.format(
+ "execute loadCurrentBatteryHistoryMap size=%d in %d/ms",
+ currentBatteryHistoryMap.size(),
+ (System.currentTimeMillis() - startTime)));
return currentBatteryHistoryMap;
}
@@ -251,10 +246,11 @@
final Map<String, BatteryHistEntry> currentBatteryHistoryMap) {
if (mBatteryHistoryMap != null) {
// Replaces the placeholder in mBatteryHistoryMap.
- for (Map.Entry<Long, Map<String, BatteryHistEntry>> mapEntry
- : mBatteryHistoryMap.entrySet()) {
- if (mapEntry.getValue().containsKey(
- DataProcessor.CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER)) {
+ for (Map.Entry<Long, Map<String, BatteryHistEntry>> mapEntry :
+ mBatteryHistoryMap.entrySet()) {
+ if (mapEntry.getValue()
+ .containsKey(
+ DataProcessor.CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER)) {
mapEntry.setValue(currentBatteryHistoryMap);
}
}
@@ -295,7 +291,7 @@
Log.d(TAG, "there is no work profile");
}
- final Map<Long, UsageEvents> usageEventsMap = new HashMap<>();
+ final Map<Long, UsageEvents> usageEventsMap = new ArrayMap<>();
usageEventsMap.put(Long.valueOf(currentUserId), usageEventsForCurrentUser);
if (usageEventsForWorkProfile != null) {
Log.d(TAG, "usageEventsForWorkProfile is null");
@@ -305,14 +301,17 @@
final List<AppUsageEvent> appUsageEventList =
DataProcessor.generateAppUsageEventListFromUsageEvents(
mContext, usageEventsMap);
- Log.d(TAG, String.format("execute loadCurrentAppUsageList size=%d in %d/ms",
- appUsageEventList.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "execute loadCurrentAppUsageList size=%d in %d/ms",
+ appUsageEventList.size(),
+ (System.currentTimeMillis() - startTime)));
return appUsageEventList;
}
@Override
- protected void onPostExecute(
- final List<AppUsageEvent> currentAppUsageList) {
+ protected void onPostExecute(final List<AppUsageEvent> currentAppUsageList) {
if (currentAppUsageList == null || currentAppUsageList.isEmpty()) {
Log.d(TAG, "currentAppUsageList is null or empty");
} else {
@@ -336,16 +335,21 @@
// Loads the app usage data from the database.
final List<AppUsageEvent> appUsageEventList =
DatabaseUtils.getAppUsageEventForUsers(
- mContext, Calendar.getInstance(), getCurrentUserIds(),
+ mContext,
+ Calendar.getInstance(),
+ getCurrentUserIds(),
mRawStartTimestamp);
- Log.d(TAG, String.format("execute loadDatabaseAppUsageList size=%d in %d/ms",
- appUsageEventList.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "execute loadDatabaseAppUsageList size=%d in %d/ms",
+ appUsageEventList.size(),
+ (System.currentTimeMillis() - startTime)));
return appUsageEventList;
}
@Override
- protected void onPostExecute(
- final List<AppUsageEvent> databaseAppUsageList) {
+ protected void onPostExecute(final List<AppUsageEvent> databaseAppUsageList) {
if (databaseAppUsageList == null || databaseAppUsageList.isEmpty()) {
Log.d(TAG, "databaseAppUsageList is null or empty");
} else {
@@ -365,17 +369,20 @@
// Loads the battery event data from the database.
final List<BatteryEvent> batteryEventList =
DatabaseUtils.getBatteryEvents(
- mContext, Calendar.getInstance(), mRawStartTimestamp,
+ mContext,
+ Calendar.getInstance(),
+ mRawStartTimestamp,
POWER_CONNECTION_EVENTS);
- Log.d(TAG, String.format(
- "execute loadPowerConnectionBatteryEventList size=%d in %d/ms",
- batteryEventList.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "execute loadPowerConnectionBatteryEventList size=%d in %d/ms",
+ batteryEventList.size(), (System.currentTimeMillis() - startTime)));
return batteryEventList;
}
@Override
- protected void onPostExecute(
- final List<BatteryEvent> batteryEventList) {
+ protected void onPostExecute(final List<BatteryEvent> batteryEventList) {
if (batteryEventList == null || batteryEventList.isEmpty()) {
Log.d(TAG, "batteryEventList is null or empty");
} else {
@@ -397,8 +404,12 @@
final List<BatteryUsageSlot> batteryUsageSlotList =
DatabaseUtils.getBatteryUsageSlots(
mContext, Calendar.getInstance(), mLastFullChargeTimestamp);
- Log.d(TAG, String.format("execute loadBatteryUsageSlotList size=%d in %d/ms",
- batteryUsageSlotList.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "execute loadBatteryUsageSlotList size=%d in %d/ms",
+ batteryUsageSlotList.size(),
+ (System.currentTimeMillis() - startTime)));
return batteryUsageSlotList;
}
@@ -423,11 +434,16 @@
final long startTime = System.currentTimeMillis();
final Map<Long, BatteryDiffData> batteryDiffDataMap =
DataProcessor.getBatteryDiffDataMapFromStatsService(
- mContext, mRawStartTimestamp, getSystemAppsPackageNames(),
+ mContext,
+ mRawStartTimestamp,
+ getSystemAppsPackageNames(),
getSystemAppsUids());
- Log.d(TAG, String.format(
- "execute loadAndApplyBatteryMapFromServiceOnly size=%d in %d/ms",
- batteryDiffDataMap.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "execute loadAndApplyBatteryMapFromServiceOnly size=%d in %d/ms",
+ batteryDiffDataMap.size(),
+ (System.currentTimeMillis() - startTime)));
return batteryDiffDataMap;
}
@@ -435,9 +451,10 @@
protected void onPostExecute(final Map<Long, BatteryDiffData> batteryDiffDataMap) {
// Post results back to main thread to refresh UI.
if (mHandler != null && mCallbackFunction != null) {
- mHandler.post(() -> {
- mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap);
- });
+ mHandler.post(
+ () -> {
+ mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap);
+ });
}
}
}.execute();
@@ -459,8 +476,12 @@
}
// Generates the indexed AppUsagePeriod list data for each corresponding time slot for
// further use.
- mAppUsagePeriodMap = DataProcessor.generateAppUsagePeriodMap(
- mContext, mHourlyBatteryLevelsPerDay, mAppUsageEventList, mBatteryEventList);
+ mAppUsagePeriodMap =
+ DataProcessor.generateAppUsagePeriodMap(
+ mContext,
+ mHourlyBatteryLevelsPerDay,
+ mAppUsageEventList,
+ mBatteryEventList);
}
private void tryToGenerateFinalDataAndApplyCallback() {
@@ -482,18 +503,28 @@
final long startTime = System.currentTimeMillis();
final Map<Long, BatteryDiffData> batteryDiffDataMap = new ArrayMap<>();
for (BatteryUsageSlot batteryUsageSlot : mBatteryUsageSlotList) {
- batteryDiffDataMap.put(batteryUsageSlot.getStartTimestamp(),
+ batteryDiffDataMap.put(
+ batteryUsageSlot.getStartTimestamp(),
ConvertUtils.convertToBatteryDiffData(
- mContext, batteryUsageSlot, getSystemAppsPackageNames(),
+ mContext,
+ batteryUsageSlot,
+ getSystemAppsPackageNames(),
getSystemAppsUids()));
}
- batteryDiffDataMap.putAll(DataProcessor.getBatteryDiffDataMap(mContext,
- mHourlyBatteryLevelsPerDay, mBatteryHistoryMap, mAppUsagePeriodMap,
- getSystemAppsPackageNames(), getSystemAppsUids()));
+ batteryDiffDataMap.putAll(
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ mHourlyBatteryLevelsPerDay,
+ mBatteryHistoryMap,
+ mAppUsagePeriodMap,
+ getSystemAppsPackageNames(),
+ getSystemAppsUids()));
- Log.d(TAG, String.format(
- "execute generateFinalDataAndApplyCallback size=%d in %d/ms",
- batteryDiffDataMap.size(), System.currentTimeMillis() - startTime));
+ Log.d(
+ TAG,
+ String.format(
+ "execute generateFinalDataAndApplyCallback size=%d in %d/ms",
+ batteryDiffDataMap.size(), System.currentTimeMillis() - startTime));
return batteryDiffDataMap;
}
@@ -501,9 +532,10 @@
protected void onPostExecute(final Map<Long, BatteryDiffData> batteryDiffDataMap) {
// Post results back to main thread to refresh UI.
if (mHandler != null && mCallbackFunction != null) {
- mHandler.post(() -> {
- mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap);
- });
+ mHandler.post(
+ () -> {
+ mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap);
+ });
}
}
}.execute();
@@ -540,8 +572,7 @@
}
private int getWorkProfileUserId() {
- final UserHandle userHandle =
- Utils.getManagedProfile(mUserManager);
+ final UserHandle userHandle = Utils.getManagedProfile(mUserManager);
return userHandle != null ? userHandle.getIdentifier() : Integer.MIN_VALUE;
}
@@ -561,8 +592,8 @@
/**
* @return Returns battery level data and start async task to compute battery diff usage data
- * and load app labels + icons.
- * Returns null if the input is invalid or not having at least 2 hours data.
+ * and load app labels + icons. Returns null if the input is invalid or not having at least
+ * 2 hours data.
*/
@Nullable
public static BatteryLevelData getBatteryLevelData(
@@ -574,16 +605,28 @@
final long lastFullChargeTime = DatabaseUtils.getLastFullChargeTime(context);
final List<BatteryEvent> batteryLevelRecordEvents =
DatabaseUtils.getBatteryEvents(
- context, Calendar.getInstance(), lastFullChargeTime,
- BATTERY_LEVEL_RECORD_EVENTS);
- final long startTimestamp = batteryLevelRecordEvents.isEmpty()
- ? lastFullChargeTime : batteryLevelRecordEvents.get(0).getTimestamp();
- final BatteryLevelData batteryLevelData = getPeriodBatteryLevelData(context, handler,
- startTimestamp, lastFullChargeTime, isFromPeriodJob,
- onBatteryUsageMapLoadedListener);
- Log.d(TAG, String.format("execute getBatteryLevelData in %d/ms,"
- + " batteryLevelRecordEvents.size=%d",
- (System.currentTimeMillis() - start), batteryLevelRecordEvents.size()));
+ context,
+ Calendar.getInstance(),
+ lastFullChargeTime,
+ DatabaseUtils.BATTERY_LEVEL_RECORD_EVENTS);
+ final long startTimestamp =
+ batteryLevelRecordEvents.isEmpty()
+ ? lastFullChargeTime
+ : batteryLevelRecordEvents.get(0).getTimestamp();
+ final BatteryLevelData batteryLevelData =
+ getPeriodBatteryLevelData(
+ context,
+ handler,
+ startTimestamp,
+ lastFullChargeTime,
+ isFromPeriodJob,
+ onBatteryUsageMapLoadedListener);
+ Log.d(
+ TAG,
+ String.format(
+ "execute getBatteryLevelData in %d/ms,"
+ + " batteryLevelRecordEvents.size=%d",
+ (System.currentTimeMillis() - start), batteryLevelRecordEvents.size()));
return isFromPeriodJob
? batteryLevelData
@@ -598,8 +641,11 @@
final boolean isFromPeriodJob,
final OnBatteryDiffDataMapLoadedListener onBatteryDiffDataMapLoadedListener) {
final long currentTime = System.currentTimeMillis();
- Log.d(TAG, String.format("getPeriodBatteryLevelData() startTimestamp=%s",
- ConvertUtils.utcToLocalTimeForLogging(startTimestamp)));
+ Log.d(
+ TAG,
+ String.format(
+ "getPeriodBatteryLevelData() startTimestamp=%s",
+ ConvertUtils.utcToLocalTimeForLogging(startTimestamp)));
if (isFromPeriodJob
&& startTimestamp >= TimestampUtils.getLastEvenHourTimestamp(currentTime)) {
// Nothing needs to be loaded for period job.
@@ -608,9 +654,13 @@
handler = handler != null ? handler : new Handler(Looper.getMainLooper());
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
- sFakeBatteryHistoryMap != null ? sFakeBatteryHistoryMap
- : DatabaseUtils.getHistoryMapSinceLatestRecordBeforeQueryTimestamp(context,
- Calendar.getInstance(), startTimestamp, lastFullChargeTime);
+ sFakeBatteryHistoryMap != null
+ ? sFakeBatteryHistoryMap
+ : DatabaseUtils.getHistoryMapSinceLatestRecordBeforeQueryTimestamp(
+ context,
+ Calendar.getInstance(),
+ startTimestamp,
+ lastFullChargeTime);
if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
Log.d(TAG, "batteryHistoryMap is null in getPeriodBatteryLevelData()");
new DataProcessManager(context, handler, onBatteryDiffDataMapLoadedListener).start();
@@ -632,13 +682,14 @@
// Start the async task to compute diff usage data and load labels and icons.
new DataProcessManager(
- context,
- handler,
- startTimestamp,
- lastFullChargeTime,
- onBatteryDiffDataMapLoadedListener,
- batteryLevelData.getHourlyBatteryLevelsPerDay(),
- processedBatteryHistoryMap).start(isFromPeriodJob);
+ context,
+ handler,
+ startTimestamp,
+ lastFullChargeTime,
+ onBatteryDiffDataMapLoadedListener,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ processedBatteryHistoryMap)
+ .start(isFromPeriodJob);
return batteryLevelData;
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index 6099192..d8f0a77 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -104,14 +104,11 @@
static final Comparator<BatteryEvent> BATTERY_EVENT_TIMESTAMP_COMPARATOR =
Comparator.comparing(BatteryEvent::getTimestamp);
- @VisibleForTesting
- static boolean sDebug = false;
+ @VisibleForTesting static boolean sDebug = false;
- @VisibleForTesting
- static long sTestCurrentTimeMillis = 0;
+ @VisibleForTesting static long sTestCurrentTimeMillis = 0;
- @VisibleForTesting
- static Set<String> sTestSystemAppsPackageNames;
+ @VisibleForTesting static Set<String> sTestSystemAppsPackageNames;
@VisibleForTesting
static IUsageStatsManager sUsageStatsManager =
@@ -128,12 +125,11 @@
Map<Integer, Map<Integer, BatteryDiffData>> batteryCallbackData);
}
- private DataProcessor() {
- }
+ private DataProcessor() {}
/**
- * @return Returns battery usage data of different entries.
- * Returns null if the input is invalid or there is no enough data.
+ * @return Returns battery usage data of different entries. <br>
+ * Returns null if the input is invalid or there is no enough data.
*/
@Nullable
public static Map<Integer, Map<Integer, BatteryDiffData>> getBatteryUsageData(
@@ -153,32 +149,31 @@
final Map<String, BatteryHistEntry> currentBatteryHistoryMap =
getCurrentBatteryHistoryMapFromStatsService(context);
// Replaces the placeholder in processedBatteryHistoryMap.
- for (Map.Entry<Long, Map<String, BatteryHistEntry>> mapEntry
- : processedBatteryHistoryMap.entrySet()) {
+ for (Map.Entry<Long, Map<String, BatteryHistEntry>> mapEntry :
+ processedBatteryHistoryMap.entrySet()) {
if (mapEntry.getValue().containsKey(CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER)) {
mapEntry.setValue(currentBatteryHistoryMap);
}
}
return batteryLevelData == null
? null
- : generateBatteryUsageMap(context,
- getBatteryDiffDataMap(context,
+ : generateBatteryUsageMap(
+ context,
+ getBatteryDiffDataMap(
+ context,
batteryLevelData.getHourlyBatteryLevelsPerDay(),
processedBatteryHistoryMap,
- /*appUsagePeriodMap=*/ null,
+ /* appUsagePeriodMap= */ null,
getSystemAppsPackageNames(context),
getSystemAppsUids(context)),
batteryLevelData);
}
- /**
- * Gets the {@link BatteryUsageStats} from system service.
- */
+ /** Gets the {@link BatteryUsageStats} from system service. */
@Nullable
public static BatteryUsageStats getBatteryUsageStats(final Context context) {
final BatteryUsageStatsQuery batteryUsageStatsQuery =
- new BatteryUsageStatsQuery
- .Builder()
+ new BatteryUsageStatsQuery.Builder()
.includeBatteryHistory()
.includeProcessStateData()
.build();
@@ -186,9 +181,7 @@
.getBatteryUsageStats(batteryUsageStatsQuery);
}
- /**
- * Gets the {@link UsageEvents} from system service for all unlocked users.
- */
+ /** Gets the {@link UsageEvents} from system service for all unlocked users. */
@Nullable
public static Map<Long, UsageEvents> getAppUsageEvents(Context context) {
final long start = System.currentTimeMillis();
@@ -204,21 +197,20 @@
final long sixDaysAgoTimestamp =
DatabaseUtils.getTimestampSixDaysAgo(Calendar.getInstance());
for (final UserInfo user : userManager.getAliveUsers()) {
- final UsageEvents events = getAppUsageEventsForUser(
- context, userManager, user.id, sixDaysAgoTimestamp);
+ final UsageEvents events =
+ getAppUsageEventsForUser(context, userManager, user.id, sixDaysAgoTimestamp);
if (events != null) {
resultMap.put(Long.valueOf(user.id), events);
}
}
final long elapsedTime = System.currentTimeMillis() - start;
- Log.d(TAG, String.format("getAppUsageEvents() for all unlocked users in %d/ms",
- elapsedTime));
+ Log.d(
+ TAG,
+ String.format("getAppUsageEvents() for all unlocked users in %d/ms", elapsedTime));
return resultMap.isEmpty() ? null : resultMap;
}
- /**
- * Gets the {@link UsageEvents} from system service for the specific user.
- */
+ /** Gets the {@link UsageEvents} from system service for the specific user. */
@Nullable
public static UsageEvents getAppUsageEventsForUser(
Context context, final int userID, final long startTimestampOfLevelData) {
@@ -234,17 +226,17 @@
final long sixDaysAgoTimestamp =
DatabaseUtils.getTimestampSixDaysAgo(Calendar.getInstance());
final long earliestTimestamp = Math.max(sixDaysAgoTimestamp, startTimestampOfLevelData);
- final UsageEvents events = getAppUsageEventsForUser(
- context, userManager, userID, earliestTimestamp);
+ final UsageEvents events =
+ getAppUsageEventsForUser(context, userManager, userID, earliestTimestamp);
final long elapsedTime = System.currentTimeMillis() - start;
- Log.d(TAG, String.format("getAppUsageEventsForUser() for user %d in %d/ms",
- userID, elapsedTime));
+ Log.d(
+ TAG,
+ String.format(
+ "getAppUsageEventsForUser() for user %d in %d/ms", userID, elapsedTime));
return events;
}
- /**
- * Closes the {@link BatteryUsageStats} after using it.
- */
+ /** Closes the {@link BatteryUsageStats} after using it. */
public static void closeBatteryUsageStats(BatteryUsageStats batteryUsageStats) {
if (batteryUsageStats != null) {
try {
@@ -260,18 +252,20 @@
* Attributes the list of {@link AppUsageEvent} into hourly time slots and reformat them into
* {@link AppUsagePeriod} for easier use in the following process.
*
- * <p>There could be 2 cases of the returned value:</p>
+ * <p>There could be 2 cases of the returned value:
+ *
* <ul>
- * <li>null: empty or invalid data.</li>
- * <li>non-null: must be a 2d map and composed by:
- * <p> [0][0] ~ [maxDailyIndex][maxHourlyIndex]</p></li>
+ * <li>null: empty or invalid data.
+ * <li>non-null: must be a 2d map and composed by:
+ * <p>[0][0] ~ [maxDailyIndex][maxHourlyIndex]
* </ul>
*
- * <p>The structure is consistent with the battery usage map returned by
- * {@code generateBatteryUsageMap}.</p>
+ * <p>The structure is consistent with the battery usage map returned by {@code
+ * generateBatteryUsageMap}.
*
- * <p>{@code Long} stands for the userId.</p>
- * <p>{@code String} stands for the packageName.</p>
+ * <p>{@code Long} stands for the userId.
+ *
+ * <p>{@code String} stands for the packageName.
*/
@Nullable
public static Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
@@ -310,16 +304,18 @@
// The value could be null when there is no data in the hourly slot.
dailyMap.put(
hourlyIndex,
- buildAppUsagePeriodList(context, hourlyAppUsageEventList, batteryEventList,
- startTimestamp, endTimestamp));
+ buildAppUsagePeriodList(
+ context,
+ hourlyAppUsageEventList,
+ batteryEventList,
+ startTimestamp,
+ endTimestamp));
}
}
return resultMap;
}
- /**
- * Generates the list of {@link AppUsageEvent} from the supplied {@link UsageEvents}.
- */
+ /** Generates the list of {@link AppUsageEvent} from the supplied {@link UsageEvents}. */
public static List<AppUsageEvent> generateAppUsageEventListFromUsageEvents(
Context context, Map<Long, UsageEvents> usageEventsMap) {
final List<AppUsageEvent> appUsageEventList = new ArrayList<>();
@@ -342,12 +338,14 @@
final String taskRootClassName = event.getTaskRootClassName();
if (!TextUtils.isEmpty(taskRootClassName)
&& ignoreScreenOnTimeTaskRootSet.contains(taskRootClassName)) {
- Log.w(TAG, String.format(
- "Ignoring a usage event with task root class name %s, "
- + "(timestamp=%d, type=%d)",
- taskRootClassName,
- event.getTimeStamp(),
- event.getEventType()));
+ Log.w(
+ TAG,
+ String.format(
+ "Ignoring a usage event with task root class name %s, "
+ + "(timestamp=%d, type=%d)",
+ taskRootClassName,
+ event.getTimeStamp(),
+ event.getEventType()));
break;
}
final AppUsageEvent appUsageEvent =
@@ -363,19 +361,18 @@
}
}
}
- Log.w(TAG, String.format(
- "Read %d relevant events (%d total) from UsageStatsManager", numEventsFetched,
- numAllEventsFetched));
+ Log.w(
+ TAG,
+ String.format(
+ "Read %d relevant events (%d total) from UsageStatsManager",
+ numEventsFetched, numAllEventsFetched));
return appUsageEventList;
}
- /**
- * Generates the list of {@link BatteryEntry} from the supplied {@link BatteryUsageStats}.
- */
+ /** Generates the list of {@link BatteryEntry} from the supplied {@link BatteryUsageStats}. */
@Nullable
public static List<BatteryEntry> generateBatteryEntryListFromBatteryUsageStats(
- final Context context,
- @Nullable final BatteryUsageStats batteryUsageStats) {
+ final Context context, @Nullable final BatteryUsageStats batteryUsageStats) {
if (batteryUsageStats == null) {
Log.w(TAG, "batteryUsageStats is null content");
return null;
@@ -385,13 +382,18 @@
}
final BatteryUtils batteryUtils = BatteryUtils.getInstance(context);
final int dischargePercentage = Math.max(0, batteryUsageStats.getDischargePercentage());
- final List<BatteryEntry> usageList = getCoalescedUsageList(
- context, batteryUtils, batteryUsageStats, /*loadDataInBackground=*/ false);
+ final List<BatteryEntry> usageList =
+ getCoalescedUsageList(
+ context,
+ batteryUtils,
+ batteryUsageStats,
+ /* loadDataInBackground= */ false);
final double totalPower = batteryUsageStats.getConsumedPower();
for (int i = 0; i < usageList.size(); i++) {
final BatteryEntry entry = usageList.get(i);
- final double percentOfTotal = batteryUtils.calculateBatteryPercent(
- entry.getConsumedPower(), totalPower, dischargePercentage);
+ final double percentOfTotal =
+ batteryUtils.calculateBatteryPercent(
+ entry.getConsumedPower(), totalPower, dischargePercentage);
entry.mPercent = percentOfTotal;
}
return usageList;
@@ -404,19 +406,19 @@
final Context context) {
final List<BatteryHistEntry> batteryHistEntryList =
getBatteryHistListFromFromStatsService(context);
- return batteryHistEntryList == null ? new ArrayMap<>()
+ return batteryHistEntryList == null
+ ? new ArrayMap<>()
: batteryHistEntryList.stream().collect(Collectors.toMap(e -> e.getKey(), e -> e));
}
/**
* @return Returns the processed history map which has interpolated to every hour data.
- * The start timestamp is the first timestamp in batteryHistoryMap. The end timestamp is current
- * time. The keys of processed history map should contain every hour between the start and end
- * timestamp. If there's no data in some key, the value will be the empty map.
+ * <p>The start timestamp is the first timestamp in batteryHistoryMap. The end timestamp is
+ * current time. The keys of processed history map should contain every hour between the
+ * start and end timestamp. If there's no data in some key, the value will be the empty map.
*/
static Map<Long, Map<String, BatteryHistEntry>> getHistoryMapWithExpectedTimestamps(
- Context context,
- final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
+ Context context, final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
final long startTime = System.currentTimeMillis();
final List<Long> rawTimestampList = new ArrayList<>(batteryHistoryMap.keySet());
final Map<Long, Map<String, BatteryHistEntry>> resultMap = new ArrayMap();
@@ -429,8 +431,11 @@
final List<Long> expectedTimestampList = getTimestampSlots(rawTimestampList, currentTime);
interpolateHistory(
context, rawTimestampList, expectedTimestampList, batteryHistoryMap, resultMap);
- Log.d(TAG, String.format("getHistoryMapWithExpectedTimestamps() size=%d in %d/ms",
- resultMap.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "getHistoryMapWithExpectedTimestamps() size=%d in %d/ms",
+ resultMap.size(), (System.currentTimeMillis() - startTime)));
return resultMap;
}
@@ -470,7 +475,8 @@
}
timestampSlots.add(startTimestamp);
for (long timestamp = TimestampUtils.getNextHourTimestamp(startTimestamp);
- timestamp < endTimestamp; timestamp += DateUtils.HOUR_IN_MILLIS) {
+ timestamp < endTimestamp;
+ timestamp += DateUtils.HOUR_IN_MILLIS) {
timestampSlots.add(timestamp);
}
timestampSlots.add(endTimestamp);
@@ -496,16 +502,17 @@
@VisibleForTesting
static long[] findNearestTimestamp(final List<Long> timestamps, final long target) {
- final long[] results = new long[]{Long.MIN_VALUE, Long.MAX_VALUE};
+ final long[] results = new long[] {Long.MIN_VALUE, Long.MAX_VALUE};
// Searches the nearest lower and upper timestamp value.
- timestamps.forEach(timestamp -> {
- if (timestamp <= target && timestamp > results[0]) {
- results[0] = timestamp;
- }
- if (timestamp >= target && timestamp < results[1]) {
- results[1] = timestamp;
- }
- });
+ timestamps.forEach(
+ timestamp -> {
+ if (timestamp <= target && timestamp > results[0]) {
+ results[0] = timestamp;
+ }
+ if (timestamp >= target && timestamp < results[1]) {
+ results[1] = timestamp;
+ }
+ });
// Uses zero value to represent invalid searching result.
results[0] = results[0] == Long.MIN_VALUE ? 0 : results[0];
results[1] = results[1] == Long.MAX_VALUE ? 0 : results[1];
@@ -547,7 +554,8 @@
slotBatteryHistoryList.add(
batteryHistoryMap.getOrDefault(startTimestamp, EMPTY_BATTERY_MAP));
for (Long timestamp = TimestampUtils.getNextHourTimestamp(startTimestamp);
- timestamp < endTimestamp; timestamp += DateUtils.HOUR_IN_MILLIS) {
+ timestamp < endTimestamp;
+ timestamp += DateUtils.HOUR_IN_MILLIS) {
slotBatteryHistoryList.add(
batteryHistoryMap.getOrDefault(timestamp, EMPTY_BATTERY_MAP));
}
@@ -567,7 +575,7 @@
systemAppsPackageNames,
systemAppsUids,
appUsagePeriodMap == null
- || appUsagePeriodMap.get(dailyIndex) == null
+ || appUsagePeriodMap.get(dailyIndex) == null
? null
: appUsagePeriodMap.get(dailyIndex).get(hourlyIndex),
slotBatteryHistoryList);
@@ -579,17 +587,16 @@
/**
* @return Returns the indexed battery usage data for each corresponding time slot.
- *
- * <p>There could be 2 cases of the returned value:</p>
- * <ul>
- * <li> null: empty or invalid data.</li>
- * <li> 1 part: if batteryLevelData is null.</li>
- * <p> [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL]</p>
- * <li> 3 parts: if batteryLevelData is not null.</li>
- * <p> 1 - [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL]</p>
- * <p> 2 - [0][SELECTED_INDEX_ALL] ~ [maxDailyIndex][SELECTED_INDEX_ALL]</p>
- * <p> 3 - [0][0] ~ [maxDailyIndex][maxHourlyIndex]</p>
- * </ul>
+ * <p>There could be 2 cases of the returned value:
+ * <ul>
+ * <li>null: empty or invalid data.
+ * <li>1 part: if batteryLevelData is null.
+ * <p>[SELECTED_INDEX_ALL][SELECTED_INDEX_ALL]
+ * <li>3 parts: if batteryLevelData is not null.
+ * <p>1 - [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL]
+ * <p>2 - [0][SELECTED_INDEX_ALL] ~ [maxDailyIndex][SELECTED_INDEX_ALL]
+ * <p>3 - [0][0] ~ [maxDailyIndex][maxHourlyIndex]
+ * </ul>
*/
static Map<Integer, Map<Integer, BatteryDiffData>> generateBatteryUsageMap(
final Context context,
@@ -630,9 +637,17 @@
final List<BatteryDiffEntry> systemEntries = new ArrayList<>();
if (batteryHistEntryList == null || batteryHistEntryList.isEmpty()) {
Log.w(TAG, "batteryHistEntryList is null or empty in generateBatteryDiffData()");
- return new BatteryDiffData(context, startTimestamp, getCurrentTimeMillis(),
- /* startBatteryLevel =*/ 100, getCurrentLevel(context), /* screenOnTime= */ 0L,
- appEntries, systemEntries, systemAppsPackageNames, systemAppsUids,
+ return new BatteryDiffData(
+ context,
+ startTimestamp,
+ getCurrentTimeMillis(),
+ /* startBatteryLevel= */ 100,
+ getCurrentLevel(context),
+ /* screenOnTime= */ 0L,
+ appEntries,
+ systemEntries,
+ systemAppsPackageNames,
+ systemAppsUids,
/* isAccumulated= */ false);
}
final int currentUserId = context.getUserId();
@@ -642,30 +657,31 @@
userHandle != null ? userHandle.getIdentifier() : Integer.MIN_VALUE;
for (BatteryHistEntry entry : batteryHistEntryList) {
- final boolean isFromOtherUsers = isConsumedFromOtherUsers(
- currentUserId, workProfileUserId, entry);
+ final boolean isFromOtherUsers =
+ isConsumedFromOtherUsers(currentUserId, workProfileUserId, entry);
// Not show other users' battery usage data.
if (isFromOtherUsers) {
continue;
} else {
- final BatteryDiffEntry currentBatteryDiffEntry = new BatteryDiffEntry(
- context,
- entry.mUid,
- entry.mUserId,
- entry.getKey(),
- entry.mIsHidden,
- entry.mDrainType,
- entry.mPackageName,
- entry.mAppLabel,
- entry.mConsumerType,
- entry.mForegroundUsageTimeInMs,
- entry.mBackgroundUsageTimeInMs,
- /*screenOnTimeInMs=*/ 0,
- entry.mConsumePower,
- entry.mForegroundUsageConsumePower,
- entry.mForegroundServiceUsageConsumePower,
- entry.mBackgroundUsageConsumePower,
- entry.mCachedUsageConsumePower);
+ final BatteryDiffEntry currentBatteryDiffEntry =
+ new BatteryDiffEntry(
+ context,
+ entry.mUid,
+ entry.mUserId,
+ entry.getKey(),
+ entry.mIsHidden,
+ entry.mDrainType,
+ entry.mPackageName,
+ entry.mAppLabel,
+ entry.mConsumerType,
+ entry.mForegroundUsageTimeInMs,
+ entry.mBackgroundUsageTimeInMs,
+ /* screenOnTimeInMs= */ 0,
+ entry.mConsumePower,
+ entry.mForegroundUsageConsumePower,
+ entry.mForegroundServiceUsageConsumePower,
+ entry.mBackgroundUsageConsumePower,
+ entry.mCachedUsageConsumePower);
if (currentBatteryDiffEntry.isSystemEntry()) {
systemEntries.add(currentBatteryDiffEntry);
} else {
@@ -673,21 +689,33 @@
}
}
}
- return new BatteryDiffData(context, startTimestamp, getCurrentTimeMillis(),
- /* startBatteryLevel =*/ 100, getCurrentLevel(context), /* screenOnTime= */ 0L,
- appEntries, systemEntries, systemAppsPackageNames, systemAppsUids,
+ return new BatteryDiffData(
+ context,
+ startTimestamp,
+ getCurrentTimeMillis(),
+ /* startBatteryLevel= */ 100,
+ getCurrentLevel(context),
+ /* screenOnTime= */ 0L,
+ appEntries,
+ systemEntries,
+ systemAppsPackageNames,
+ systemAppsUids,
/* isAccumulated= */ false);
}
/**
- * <p>{@code Long} stands for the userId.</p>
- * <p>{@code String} stands for the packageName.</p>
+ * {@code Long} stands for the userId.
+ *
+ * <p>{@code String} stands for the packageName.
*/
@VisibleForTesting
@Nullable
static Map<Long, Map<String, List<AppUsagePeriod>>> buildAppUsagePeriodList(
- Context context, final List<AppUsageEvent> appUsageEvents,
- final List<BatteryEvent> batteryEventList, final long startTime, final long endTime) {
+ Context context,
+ final List<AppUsageEvent> appUsageEvents,
+ final List<BatteryEvent> batteryEventList,
+ final long startTime,
+ final long endTime) {
if (appUsageEvents.isEmpty()) {
return null;
}
@@ -726,11 +754,12 @@
// The same instance must have same userId and packageName.
final AppUsageEvent firstEvent = usageEvents.get(0);
final long eventUserId = firstEvent.getUserId();
- final String packageName = getEffectivePackageName(
- context,
- sUsageStatsManager,
- firstEvent.getPackageName(),
- firstEvent.getTaskRootPackageName());
+ final String packageName =
+ getEffectivePackageName(
+ context,
+ sUsageStatsManager,
+ firstEvent.getPackageName(),
+ firstEvent.getTaskRootPackageName());
usageEvents.addAll(deviceEvents);
// Sorts the usageEvents in ascending order based on the timestamp before computing the
// period.
@@ -752,7 +781,7 @@
if (allUsagePeriods.get(userId) == null) {
continue;
}
- for (final String packageName: allUsagePeriods.get(userId).keySet()) {
+ for (final String packageName : allUsagePeriods.get(userId).keySet()) {
Collections.sort(
allUsagePeriods.get(userId).get(packageName),
Comparator.comparing(AppUsagePeriod::getStartTime));
@@ -811,8 +840,7 @@
@VisibleForTesting
static List<AppUsagePeriod> excludePowerConnectedTimeFromAppUsagePeriodList(
- final List<AppUsagePeriod> usagePeriodList,
- final List<BatteryEvent> batteryEventList) {
+ final List<AppUsagePeriod> usagePeriodList, final List<BatteryEvent> batteryEventList) {
final List<AppUsagePeriod> resultList = new ArrayList<>();
int index = 0;
for (AppUsagePeriod inputPeriod : usagePeriodList) {
@@ -840,10 +868,11 @@
if (batteryEvent.getType() == BatteryEventType.POWER_CONNECTED
&& lastStartTime != 0) {
- resultList.add(AppUsagePeriod.newBuilder()
- .setStartTime(lastStartTime)
- .setEndTime(batteryEvent.getTimestamp())
- .build());
+ resultList.add(
+ AppUsagePeriod.newBuilder()
+ .setStartTime(lastStartTime)
+ .setEndTime(batteryEvent.getTimestamp())
+ .build());
lastStartTime = 0;
} else if (batteryEvent.getType() == BatteryEventType.POWER_DISCONNECTED) {
lastStartTime = batteryEvent.getTimestamp();
@@ -851,10 +880,11 @@
index++;
}
if (lastStartTime != 0) {
- resultList.add(AppUsagePeriod.newBuilder()
- .setStartTime(lastStartTime)
- .setEndTime(inputPeriod.getEndTime())
- .build());
+ resultList.add(
+ AppUsagePeriod.newBuilder()
+ .setStartTime(lastStartTime)
+ .setEndTime(inputPeriod.getEndTime())
+ .build());
}
}
return resultList;
@@ -873,13 +903,19 @@
}
static Map<Long, BatteryDiffData> getBatteryDiffDataMapFromStatsService(
- final Context context, final long startTimestamp,
+ final Context context,
+ final long startTimestamp,
@NonNull final Set<String> systemAppsPackageNames,
@NonNull final Set<Integer> systemAppsUids) {
Map<Long, BatteryDiffData> batteryDiffDataMap = new ArrayMap<>(1);
- batteryDiffDataMap.put(startTimestamp, generateBatteryDiffData(
- context, startTimestamp, getBatteryHistListFromFromStatsService(context),
- systemAppsPackageNames, systemAppsUids));
+ batteryDiffDataMap.put(
+ startTimestamp,
+ generateBatteryDiffData(
+ context,
+ startTimestamp,
+ getBatteryHistListFromFromStatsService(context),
+ systemAppsPackageNames,
+ systemAppsUids));
return batteryDiffDataMap;
}
@@ -892,23 +928,25 @@
final BatteryDiffData batteryUsageMapForAll =
batteryUsageMap.get(SELECTED_INDEX_ALL).get(SELECTED_INDEX_ALL);
if (batteryUsageMapForAll != null) {
- batteryUsageMapForAll.getAppDiffEntryList().forEach(
- entry -> entry.loadLabelAndIcon());
- batteryUsageMapForAll.getSystemDiffEntryList().forEach(
- entry -> entry.loadLabelAndIcon());
+ batteryUsageMapForAll.getAppDiffEntryList().forEach(entry -> entry.loadLabelAndIcon());
+ batteryUsageMapForAll
+ .getSystemDiffEntryList()
+ .forEach(entry -> entry.loadLabelAndIcon());
}
}
static Set<String> getSystemAppsPackageNames(Context context) {
- return sTestSystemAppsPackageNames != null ? sTestSystemAppsPackageNames
+ return sTestSystemAppsPackageNames != null
+ ? sTestSystemAppsPackageNames
: AppListRepositoryUtil.getSystemPackageNames(context, context.getUserId());
}
static Set<Integer> getSystemAppsUids(Context context) {
Set<Integer> result = new ArraySet<>(1);
try {
- result.add(context.getPackageManager().getUidForSharedUser(
- ANDROID_CORE_APPS_SHARED_USER_ID));
+ result.add(
+ context.getPackageManager()
+ .getUidForSharedUser(ANDROID_CORE_APPS_SHARED_USER_ID));
} catch (PackageManager.NameNotFoundException e) {
// No Android Core Apps
}
@@ -916,10 +954,10 @@
}
/**
- * Generates the list of {@link AppUsageEvent} within the specific time range.
- * The buffer is added to make sure the app usage calculation near the boundaries is correct.
+ * Generates the list of {@link AppUsageEvent} within the specific time range. The buffer is
+ * added to make sure the app usage calculation near the boundaries is correct.
*
- * Note: The appUsageEventList should have been sorted when calling this function.
+ * <p>Note: The appUsageEventList should have been sorted when calling this function.
*/
private static List<AppUsageEvent> getAppUsageEventListWithinTimeRangeWithBuffer(
final List<AppUsageEvent> appUsageEventList, final long startTime, final long endTime) {
@@ -978,17 +1016,13 @@
packageNameMap.get(packageName).addAll(usagePeriodList);
}
- /**
- * Returns the start time that gives {@code usagePeriod} the default usage duration.
- */
+ /** Returns the start time that gives {@code usagePeriod} the default usage duration. */
private static long getStartTimeForIncompleteUsagePeriod(
final AppUsagePeriodOrBuilder usagePeriod) {
return usagePeriod.getEndTime() - DEFAULT_USAGE_DURATION_FOR_INCOMPLETE_INTERVAL;
}
- /**
- * Returns the end time that gives {@code usagePeriod} the default usage duration.
- */
+ /** Returns the end time that gives {@code usagePeriod} the default usage duration. */
private static long getEndTimeForIncompleteUsagePeriod(
final AppUsagePeriodOrBuilder usagePeriod, final long eventTime) {
return Math.min(
@@ -998,7 +1032,9 @@
@Nullable
private static UsageEvents getAppUsageEventsForUser(
- Context context, final UserManager userManager, final int userID,
+ Context context,
+ final UserManager userManager,
+ final int userID,
final long earliestTimestamp) {
final String callingPackage = context.getPackageName();
final long now = System.currentTimeMillis();
@@ -1008,27 +1044,34 @@
Log.w(TAG, "fail to load app usage event for user :" + userID + " because locked");
return null;
}
- final long startTime = DatabaseUtils.getAppUsageStartTimestampOfUser(
- context, userID, earliestTimestamp);
+ final long startTime =
+ DatabaseUtils.getAppUsageStartTimestampOfUser(context, userID, earliestTimestamp);
return loadAppUsageEventsForUserFromService(
sUsageStatsManager, startTime, now, userID, callingPackage);
}
@Nullable
private static UsageEvents loadAppUsageEventsForUserFromService(
- final IUsageStatsManager usageStatsManager, final long startTime, final long endTime,
- final int userId, final String callingPackage) {
+ final IUsageStatsManager usageStatsManager,
+ final long startTime,
+ final long endTime,
+ final int userId,
+ final String callingPackage) {
final long start = System.currentTimeMillis();
UsageEvents events = null;
try {
- events = usageStatsManager.queryEventsForUser(
- startTime, endTime, userId, callingPackage);
+ events =
+ usageStatsManager.queryEventsForUser(
+ startTime, endTime, userId, callingPackage);
} catch (RemoteException e) {
Log.e(TAG, "Error fetching usage events: ", e);
}
final long elapsedTime = System.currentTimeMillis() - start;
- Log.d(TAG, String.format("getAppUsageEventsForUser(): %d from %d to %d in %d/ms", userId,
- startTime, endTime, elapsedTime));
+ Log.d(
+ TAG,
+ String.format(
+ "getAppUsageEventsForUser(): %d from %d to %d in %d/ms",
+ userId, startTime, endTime, elapsedTime));
return events;
}
@@ -1059,13 +1102,14 @@
return null;
}
return batteryEntryList.stream()
- .filter(entry -> {
- final long foregroundMs = entry.getTimeInForegroundMs();
- final long backgroundMs = entry.getTimeInBackgroundMs();
- return entry.getConsumedPower() > 0
- || (entry.getConsumedPower() == 0
- && (foregroundMs != 0 || backgroundMs != 0));
- })
+ .filter(
+ entry -> {
+ final long foregroundMs = entry.getTimeInForegroundMs();
+ final long backgroundMs = entry.getTimeInBackgroundMs();
+ return entry.getConsumedPower() > 0
+ || (entry.getConsumedPower() == 0
+ && (foregroundMs != 0 || backgroundMs != 0));
+ })
.map(entry -> ConvertUtils.convertToBatteryHistEntry(entry, batteryUsageStats))
.collect(Collectors.toList());
}
@@ -1089,10 +1133,15 @@
resultMap.put(startTimestamp, batteryHistoryMap.get(startTimestamp));
for (int index = 1; index < expectedTimestampSlotsSize - 1; index++) {
- interpolateHistoryForSlot(context, expectedTimestampSlots.get(index), rawTimestampList,
- batteryHistoryMap, resultMap);
+ interpolateHistoryForSlot(
+ context,
+ expectedTimestampSlots.get(index),
+ rawTimestampList,
+ batteryHistoryMap,
+ resultMap);
}
- resultMap.put(endTimestamp,
+ resultMap.put(
+ endTimestamp,
Map.of(CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER, EMPTY_BATTERY_HIST_ENTRY));
}
@@ -1183,7 +1232,7 @@
BatteryHistEntry.interpolate(
currentSlot,
upperTimestamp,
- /*ratio=*/ timestampDiff / timestampLength,
+ /* ratio= */ timestampDiff / timestampLength,
lowerEntry,
upperEntry);
newHistEntryMap.put(entryKey, newEntry);
@@ -1201,8 +1250,10 @@
final long timestamp) {
final Map<String, BatteryHistEntry> entryMap = processedBatteryHistoryMap.get(timestamp);
if (entryMap == null || entryMap.isEmpty()) {
- Log.e(TAG, "abnormal entry list in the timestamp:"
- + ConvertUtils.utcToLocalTimeForLogging(timestamp));
+ Log.e(
+ TAG,
+ "abnormal entry list in the timestamp:"
+ + ConvertUtils.utcToLocalTimeForLogging(timestamp));
return BATTERY_LEVEL_UNKNOWN;
}
// The current time battery history hasn't been loaded yet, returns the current battery
@@ -1262,11 +1313,11 @@
}
private static void insertAllUsageDiffData(
- final Context context,
- final Map<Integer, Map<Integer, BatteryDiffData>> resultMap) {
+ final Context context, final Map<Integer, Map<Integer, BatteryDiffData>> resultMap) {
final List<BatteryDiffData> diffDataList = new ArrayList<>();
- resultMap.keySet().forEach(
- key -> diffDataList.add(resultMap.get(key).get(SELECTED_INDEX_ALL)));
+ resultMap
+ .keySet()
+ .forEach(key -> diffDataList.add(resultMap.get(key).get(SELECTED_INDEX_ALL)));
final Map<Integer, BatteryDiffData> allUsageMap = new ArrayMap<>();
allUsageMap.put(SELECTED_INDEX_ALL, getAccumulatedUsageDiffData(context, diffDataList));
resultMap.put(SELECTED_INDEX_ALL, allUsageMap);
@@ -1302,8 +1353,7 @@
}
}
}
- slotScreenOnTime =
- Math.min(slotDuration, getScreenOnTime(flatAppUsagePeriodList));
+ slotScreenOnTime = Math.min(slotDuration, getScreenOnTime(flatAppUsagePeriodList));
}
final List<BatteryDiffEntry> appEntries = new ArrayList<>();
@@ -1316,9 +1366,18 @@
// We should not get the empty list since we have at least one fake data to record
// the battery level and status in each time slot, the empty list is used to
// represent there is no enough data to apply interpolation arithmetic.
- return new BatteryDiffData(context, startTimestamp, endTimestamp, startBatteryLevel,
- endBatteryLevel, /* screenOnTime= */ 0L, appEntries, systemEntries,
- systemAppsPackageNames, systemAppsUids, /* isAccumulated= */ false);
+ return new BatteryDiffData(
+ context,
+ startTimestamp,
+ endTimestamp,
+ startBatteryLevel,
+ endBatteryLevel,
+ /* screenOnTime= */ 0L,
+ appEntries,
+ systemEntries,
+ systemAppsPackageNames,
+ systemAppsUids,
+ /* isAccumulated= */ false);
}
allBatteryHistEntryKeys.addAll(slotBatteryHistMap.keySet());
}
@@ -1344,8 +1403,9 @@
}
// Not show other users' battery usage data.
- final boolean isFromOtherUsers = isConsumedFromOtherUsers(
- currentUserId, workProfileUserId, selectedBatteryEntry);
+ final boolean isFromOtherUsers =
+ isConsumedFromOtherUsers(
+ currentUserId, workProfileUserId, selectedBatteryEntry);
if (isFromOtherUsers) {
continue;
}
@@ -1369,10 +1429,7 @@
getDiffValue(
currentEntry.mBackgroundUsageTimeInMs,
nextEntry.mBackgroundUsageTimeInMs);
- consumePower +=
- getDiffValue(
- currentEntry.mConsumePower,
- nextEntry.mConsumePower);
+ consumePower += getDiffValue(currentEntry.mConsumePower, nextEntry.mConsumePower);
foregroundUsageConsumePower +=
getDiffValue(
currentEntry.mForegroundUsageConsumePower,
@@ -1396,27 +1453,25 @@
foregroundUsageTimeInMs = slotScreenOnTime;
}
// Excludes entry since we don't have enough data to calculate.
- if (foregroundUsageTimeInMs == 0
- && backgroundUsageTimeInMs == 0
- && consumePower == 0) {
+ if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs == 0 && consumePower == 0) {
continue;
}
// Forces refine the cumulative value since it may introduce deviation error since we
// will apply the interpolation arithmetic.
- final float totalUsageTimeInMs =
- foregroundUsageTimeInMs + backgroundUsageTimeInMs;
+ final float totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
if (totalUsageTimeInMs > slotDuration) {
final float ratio = slotDuration / totalUsageTimeInMs;
if (sDebug) {
- Log.w(TAG, String.format("abnormal usage time %d|%d for:\n%s",
- Duration.ofMillis(foregroundUsageTimeInMs).getSeconds(),
- Duration.ofMillis(backgroundUsageTimeInMs).getSeconds(),
- selectedBatteryEntry));
+ Log.w(
+ TAG,
+ String.format(
+ "abnormal usage time %d|%d for:\n%s",
+ Duration.ofMillis(foregroundUsageTimeInMs).getSeconds(),
+ Duration.ofMillis(backgroundUsageTimeInMs).getSeconds(),
+ selectedBatteryEntry));
}
- foregroundUsageTimeInMs =
- Math.round(foregroundUsageTimeInMs * ratio);
- backgroundUsageTimeInMs =
- Math.round(backgroundUsageTimeInMs * ratio);
+ foregroundUsageTimeInMs = Math.round(foregroundUsageTimeInMs * ratio);
+ backgroundUsageTimeInMs = Math.round(backgroundUsageTimeInMs * ratio);
consumePower = consumePower * ratio;
foregroundUsageConsumePower = foregroundUsageConsumePower * ratio;
foregroundServiceUsageConsumePower = foregroundServiceUsageConsumePower * ratio;
@@ -1425,42 +1480,53 @@
}
// Compute the screen on time and make sure it won't exceed the threshold.
- final long screenOnTime = Math.min(
- (long) slotDuration,
- getScreenOnTime(
- appUsageMap,
- selectedBatteryEntry.mUserId,
- selectedBatteryEntry.mPackageName));
+ final long screenOnTime =
+ Math.min(
+ (long) slotDuration,
+ getScreenOnTime(
+ appUsageMap,
+ selectedBatteryEntry.mUserId,
+ selectedBatteryEntry.mPackageName));
// Make sure the background + screen-on time will not exceed the threshold.
- backgroundUsageTimeInMs = Math.min(
- backgroundUsageTimeInMs, (long) slotDuration - screenOnTime);
- final BatteryDiffEntry currentBatteryDiffEntry = new BatteryDiffEntry(
- context,
- selectedBatteryEntry.mUid,
- selectedBatteryEntry.mUserId,
- selectedBatteryEntry.getKey(),
- selectedBatteryEntry.mIsHidden,
- selectedBatteryEntry.mDrainType,
- selectedBatteryEntry.mPackageName,
- selectedBatteryEntry.mAppLabel,
- selectedBatteryEntry.mConsumerType,
- foregroundUsageTimeInMs,
- backgroundUsageTimeInMs,
- screenOnTime,
- consumePower,
- foregroundUsageConsumePower,
- foregroundServiceUsageConsumePower,
- backgroundUsageConsumePower,
- cachedUsageConsumePower);
+ backgroundUsageTimeInMs =
+ Math.min(backgroundUsageTimeInMs, (long) slotDuration - screenOnTime);
+ final BatteryDiffEntry currentBatteryDiffEntry =
+ new BatteryDiffEntry(
+ context,
+ selectedBatteryEntry.mUid,
+ selectedBatteryEntry.mUserId,
+ selectedBatteryEntry.getKey(),
+ selectedBatteryEntry.mIsHidden,
+ selectedBatteryEntry.mDrainType,
+ selectedBatteryEntry.mPackageName,
+ selectedBatteryEntry.mAppLabel,
+ selectedBatteryEntry.mConsumerType,
+ foregroundUsageTimeInMs,
+ backgroundUsageTimeInMs,
+ screenOnTime,
+ consumePower,
+ foregroundUsageConsumePower,
+ foregroundServiceUsageConsumePower,
+ backgroundUsageConsumePower,
+ cachedUsageConsumePower);
if (currentBatteryDiffEntry.isSystemEntry()) {
systemEntries.add(currentBatteryDiffEntry);
} else {
appEntries.add(currentBatteryDiffEntry);
}
}
- return new BatteryDiffData(context, startTimestamp, endTimestamp, startBatteryLevel,
- endBatteryLevel, slotScreenOnTime, appEntries, systemEntries,
- systemAppsPackageNames, systemAppsUids, /* isAccumulated= */ false);
+ return new BatteryDiffData(
+ context,
+ startTimestamp,
+ endTimestamp,
+ startBatteryLevel,
+ endBatteryLevel,
+ slotScreenOnTime,
+ appEntries,
+ systemEntries,
+ systemAppsPackageNames,
+ systemAppsUids,
+ /* isAccumulated= */ false);
}
private static long getScreenOnTime(@Nullable final List<AppUsagePeriod> appUsagePeriodList) {
@@ -1557,15 +1623,22 @@
}
}
- return new BatteryDiffData(context, startTimestamp, endTimestamp, startBatteryLevel,
- endBatteryLevel, totalScreenOnTime, appEntries, systemEntries,
+ return new BatteryDiffData(
+ context,
+ startTimestamp,
+ endTimestamp,
+ startBatteryLevel,
+ endBatteryLevel,
+ totalScreenOnTime,
+ appEntries,
+ systemEntries,
/* systemAppsPackageNames= */ new ArraySet<>(),
- /* systemAppsUids= */ new ArraySet<>(), /* isAccumulated= */ true);
+ /* systemAppsUids= */ new ArraySet<>(),
+ /* isAccumulated= */ true);
}
private static void computeUsageDiffDataPerEntry(
- final BatteryDiffEntry entry,
- final Map<String, BatteryDiffEntry> diffEntryMap) {
+ final BatteryDiffEntry entry, final Map<String, BatteryDiffEntry> diffEntryMap) {
final String key = entry.getKey();
final BatteryDiffEntry oldBatteryDiffEntry = diffEntryMap.get(key);
// Creates new BatteryDiffEntry if we don't have it.
@@ -1573,16 +1646,13 @@
diffEntryMap.put(key, entry.clone());
} else {
// Sums up some field data into the existing one.
- oldBatteryDiffEntry.mForegroundUsageTimeInMs +=
- entry.mForegroundUsageTimeInMs;
- oldBatteryDiffEntry.mBackgroundUsageTimeInMs +=
- entry.mBackgroundUsageTimeInMs;
- oldBatteryDiffEntry.mScreenOnTimeInMs +=
- entry.mScreenOnTimeInMs;
+ oldBatteryDiffEntry.mForegroundUsageTimeInMs += entry.mForegroundUsageTimeInMs;
+ oldBatteryDiffEntry.mBackgroundUsageTimeInMs += entry.mBackgroundUsageTimeInMs;
+ oldBatteryDiffEntry.mScreenOnTimeInMs += entry.mScreenOnTimeInMs;
oldBatteryDiffEntry.mConsumePower += entry.mConsumePower;
oldBatteryDiffEntry.mForegroundUsageConsumePower += entry.mForegroundUsageConsumePower;
- oldBatteryDiffEntry.mForegroundServiceUsageConsumePower
- += entry.mForegroundServiceUsageConsumePower;
+ oldBatteryDiffEntry.mForegroundServiceUsageConsumePower +=
+ entry.mForegroundServiceUsageConsumePower;
oldBatteryDiffEntry.mBackgroundUsageConsumePower += entry.mBackgroundUsageConsumePower;
oldBatteryDiffEntry.mCachedUsageConsumePower += entry.mCachedUsageConsumePower;
}
@@ -1591,8 +1661,9 @@
private static boolean shouldShowBatteryAttributionList(final Context context) {
final PowerProfile powerProfile = new PowerProfile(context);
// Cheap hack to try to figure out if the power_profile.xml was populated.
- final double averagePowerForOrdinal = powerProfile.getAveragePowerForOrdinal(
- PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL, 0);
+ final double averagePowerForOrdinal =
+ powerProfile.getAveragePowerForOrdinal(
+ PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL, 0);
final boolean shouldShowBatteryAttributionList =
averagePowerForOrdinal >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP;
if (!shouldShowBatteryAttributionList) {
@@ -1602,13 +1673,14 @@
}
/**
- * We want to coalesce some UIDs. For example, dex2oat runs under a shared gid that
- * exists for all users of the same app. We detect this case and merge the power use
- * for dex2oat to the device OWNER's use of the app.
+ * We want to coalesce some UIDs. For example, dex2oat runs under a shared gid that exists for
+ * all users of the same app. We detect this case and merge the power use for dex2oat to the
+ * device OWNER's use of the app.
*
* @return A sorted list of apps using power.
*/
- private static List<BatteryEntry> getCoalescedUsageList(final Context context,
+ private static List<BatteryEntry> getCoalescedUsageList(
+ final Context context,
final BatteryUtils batteryUtils,
final BatteryUsageStats batteryUsageStats,
final boolean loadDataInBackground) {
@@ -1621,8 +1693,9 @@
// Sort to have all apps with "real" UIDs first, followed by apps that are supposed
// to be combined with the real ones.
- uidBatteryConsumers.sort(Comparator.comparingInt(
- consumer -> consumer.getUid() == getRealUid(consumer) ? 0 : 1));
+ uidBatteryConsumers.sort(
+ Comparator.comparingInt(
+ consumer -> consumer.getUid() == getRealUid(consumer) ? 0 : 1));
for (int i = 0, size = uidBatteryConsumers.size(); i < size; i++) {
final UidBatteryConsumer consumer = uidBatteryConsumers.get(i);
@@ -1637,8 +1710,17 @@
final int index = batteryEntryList.indexOfKey(uid);
if (index < 0) {
// New entry.
- batteryEntryList.put(uid, new BatteryEntry(context, userManager, consumer,
- isHidden, uid, packages, null, loadDataInBackground));
+ batteryEntryList.put(
+ uid,
+ new BatteryEntry(
+ context,
+ userManager,
+ consumer,
+ isHidden,
+ uid,
+ packages,
+ null,
+ loadDataInBackground));
} else {
// Combine BatterySippers if we already have one with this UID.
final BatteryEntry existingSipper = batteryEntryList.valueAt(index);
@@ -1646,33 +1728,50 @@
}
}
- final BatteryConsumer deviceConsumer = batteryUsageStats.getAggregateBatteryConsumer(
- BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
+ final BatteryConsumer deviceConsumer =
+ batteryUsageStats.getAggregateBatteryConsumer(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
- for (int componentId = 0; componentId < BatteryConsumer.POWER_COMPONENT_COUNT;
+ for (int componentId = 0;
+ componentId < BatteryConsumer.POWER_COMPONENT_COUNT;
componentId++) {
- results.add(new BatteryEntry(context, componentId,
- deviceConsumer.getConsumedPower(componentId),
- deviceConsumer.getUsageDurationMillis(componentId),
- componentId == POWER_COMPONENT_SYSTEM_SERVICES
- || componentId == POWER_COMPONENT_WAKELOCK));
+ results.add(
+ new BatteryEntry(
+ context,
+ componentId,
+ deviceConsumer.getConsumedPower(componentId),
+ deviceConsumer.getUsageDurationMillis(componentId),
+ componentId == POWER_COMPONENT_SYSTEM_SERVICES
+ || componentId == POWER_COMPONENT_WAKELOCK));
}
for (int componentId = BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;
- componentId < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID
- + deviceConsumer.getCustomPowerComponentCount();
+ componentId
+ < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID
+ + deviceConsumer.getCustomPowerComponentCount();
componentId++) {
- results.add(new BatteryEntry(context, componentId,
- deviceConsumer.getCustomPowerComponentName(componentId),
- deviceConsumer.getConsumedPowerForCustomComponent(componentId)));
+ results.add(
+ new BatteryEntry(
+ context,
+ componentId,
+ deviceConsumer.getCustomPowerComponentName(componentId),
+ deviceConsumer.getConsumedPowerForCustomComponent(componentId)));
}
final List<UserBatteryConsumer> userBatteryConsumers =
batteryUsageStats.getUserBatteryConsumers();
for (int i = 0, size = userBatteryConsumers.size(); i < size; i++) {
final UserBatteryConsumer consumer = userBatteryConsumers.get(i);
- results.add(new BatteryEntry(context, userManager, consumer, /* isHidden */ true,
- Process.INVALID_UID, null, null, loadDataInBackground));
+ results.add(
+ new BatteryEntry(
+ context,
+ userManager,
+ consumer, /* isHidden */
+ true,
+ Process.INVALID_UID,
+ null,
+ null,
+ loadDataInBackground));
}
final int numUidSippers = batteryEntryList.size();
@@ -1692,8 +1791,10 @@
// Check if this UID is a shared GID. If so, we combine it with the OWNER's
// actual app UID.
if (isSharedGid(consumer.getUid())) {
- realUid = UserHandle.getUid(UserHandle.USER_SYSTEM,
- UserHandle.getAppIdFromSharedAppGid(consumer.getUid()));
+ realUid =
+ UserHandle.getUid(
+ UserHandle.USER_SYSTEM,
+ UserHandle.getAppIdFromSharedAppGid(consumer.getUid()));
}
// Check if this UID is a system UID (mediaserver, logd, nfc, drm, etc).
@@ -1727,8 +1828,13 @@
for (int dailyIndex = 0; dailyIndex < hourlyBatteryLevelsPerDay.size(); dailyIndex++) {
if (batteryUsageMap.get(dailyIndex) == null
|| !batteryUsageMap.get(dailyIndex).containsKey(SELECTED_INDEX_ALL)) {
- Log.e(TAG, "no [" + dailyIndex + "][SELECTED_INDEX_ALL] in batteryUsageMap, "
- + "daily size is: " + hourlyBatteryLevelsPerDay.size());
+ Log.e(
+ TAG,
+ "no ["
+ + dailyIndex
+ + "][SELECTED_INDEX_ALL] in batteryUsageMap, "
+ + "daily size is: "
+ + hourlyBatteryLevelsPerDay.size());
return false;
}
if (hourlyBatteryLevelsPerDay.get(dailyIndex) == null) {
@@ -1738,8 +1844,15 @@
// Length of hourly usage map should be the length of hourly level data - 1.
for (int hourlyIndex = 0; hourlyIndex < timestamps.size() - 1; hourlyIndex++) {
if (!batteryUsageMap.get(dailyIndex).containsKey(hourlyIndex)) {
- Log.e(TAG, "no [" + dailyIndex + "][" + hourlyIndex + "] in batteryUsageMap, "
- + "hourly size is: " + (timestamps.size() - 1));
+ Log.e(
+ TAG,
+ "no ["
+ + dailyIndex
+ + "]["
+ + hourlyIndex
+ + "] in batteryUsageMap, "
+ + "hourly size is: "
+ + (timestamps.size() - 1));
return false;
}
}
@@ -1759,11 +1872,19 @@
return sTestCurrentTimeMillis > 0 ? sTestCurrentTimeMillis : System.currentTimeMillis();
}
- private static void log(Context context, final String content, final long timestamp,
+ private static void log(
+ Context context,
+ final String content,
+ final long timestamp,
final BatteryHistEntry entry) {
if (sDebug) {
- Log.d(TAG, String.format(entry != null ? "%s %s:\n%s" : "%s %s:%s",
- ConvertUtils.utcToLocalTimeForLogging(timestamp), content, entry));
+ Log.d(
+ TAG,
+ String.format(
+ entry != null ? "%s %s:\n%s" : "%s %s:%s",
+ ConvertUtils.utcToLocalTimeForLogging(timestamp),
+ content,
+ entry));
}
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
index e78d25c..f96ed5b 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
@@ -15,6 +15,7 @@
*/
package com.android.settings.fuelgauge.batteryusage;
+
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTimeForLogging;
import android.app.usage.IUsageStatsManager;
@@ -53,6 +54,7 @@
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@@ -64,8 +66,9 @@
private static final String TAG = "DatabaseUtils";
private static final String SHARED_PREFS_FILE = "battery_usage_shared_prefs";
- /** Clear memory threshold for device booting phase. **/
+ /** Clear memory threshold for device booting phase. */
private static final long CLEAR_MEMORY_THRESHOLD_MS = Duration.ofMinutes(5).toMillis();
+
private static final long CLEAR_MEMORY_DELAYED_MS = Duration.ofSeconds(2).toMillis();
private static final long INVALID_TIMESTAMP = 0L;
@@ -77,28 +80,39 @@
/** An authority name of the battery content provider. */
public static final String AUTHORITY = "com.android.settings.battery.usage.provider";
+
/** A table name for app usage events. */
public static final String APP_USAGE_EVENT_TABLE = "AppUsageEvent";
+
/** A table name for battery events. */
public static final String BATTERY_EVENT_TABLE = "BatteryEvent";
+
/** A table name for battery usage history. */
public static final String BATTERY_STATE_TABLE = "BatteryState";
+
/** A table name for battery usage slot. */
public static final String BATTERY_USAGE_SLOT_TABLE = "BatteryUsageSlot";
+
/** A path name for last full charge time query. */
public static final String LAST_FULL_CHARGE_TIMESTAMP_PATH = "lastFullChargeTimestamp";
+
/** A path name for querying the latest record timestamp in battery state table. */
public static final String BATTERY_STATE_LATEST_TIMESTAMP_PATH = "batteryStateLatestTimestamp";
+
/** A path name for app usage latest timestamp query. */
public static final String APP_USAGE_LATEST_TIMESTAMP_PATH = "appUsageLatestTimestamp";
- /** Key for query parameter timestamp used in BATTERY_CONTENT_URI **/
+
+ /** Key for query parameter timestamp used in BATTERY_CONTENT_URI */
public static final String QUERY_KEY_TIMESTAMP = "timestamp";
- /** Key for query parameter userid used in APP_USAGE_EVENT_URI **/
+
+ /** Key for query parameter userid used in APP_USAGE_EVENT_URI */
public static final String QUERY_KEY_USERID = "userid";
- /** Key for query parameter battery event type used in BATTERY_EVENT_URI **/
+
+ /** Key for query parameter battery event type used in BATTERY_EVENT_URI */
public static final String QUERY_BATTERY_EVENT_TYPE = "batteryEventType";
public static final long INVALID_USER_ID = Integer.MIN_VALUE;
+
/**
* The buffer hours to query app usage events that may have begun or ended out of the final
* desired time frame.
@@ -112,6 +126,7 @@
.authority(AUTHORITY)
.appendPath(APP_USAGE_EVENT_TABLE)
.build();
+
/** A content URI to access battery events data. */
public static final Uri BATTERY_EVENT_URI =
new Uri.Builder()
@@ -119,6 +134,7 @@
.authority(AUTHORITY)
.appendPath(BATTERY_EVENT_TABLE)
.build();
+
/** A content URI to access battery usage states data. */
public static final Uri BATTERY_CONTENT_URI =
new Uri.Builder()
@@ -126,6 +142,7 @@
.authority(AUTHORITY)
.appendPath(BATTERY_STATE_TABLE)
.build();
+
/** A content URI to access battery usage slots data. */
public static final Uri BATTERY_USAGE_SLOT_URI =
new Uri.Builder()
@@ -133,13 +150,14 @@
.authority(AUTHORITY)
.appendPath(BATTERY_USAGE_SLOT_TABLE)
.build();
+ /** A list of level record event types to access battery usage data. */
+ public static final List<BatteryEventType> BATTERY_LEVEL_RECORD_EVENTS =
+ List.of(BatteryEventType.FULL_CHARGED, BatteryEventType.EVEN_HOUR);
// For testing only.
- @VisibleForTesting
- static Supplier<Cursor> sFakeSupplier;
+ @VisibleForTesting static Supplier<Cursor> sFakeSupplier;
- private DatabaseUtils() {
- }
+ private DatabaseUtils() {}
/** Returns true if current user is a work profile user. */
public static boolean isWorkProfile(Context context) {
@@ -157,15 +175,17 @@
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.appendPath(APP_USAGE_LATEST_TIMESTAMP_PATH)
- .appendQueryParameter(
- QUERY_KEY_USERID, Long.toString(userId))
+ .appendQueryParameter(QUERY_KEY_USERID, Long.toString(userId))
.build();
- final long latestTimestamp = loadLongFromContentProvider(
- context, appUsageLatestTimestampUri, /*defaultValue=*/ INVALID_TIMESTAMP);
+ final long latestTimestamp =
+ loadLongFromContentProvider(
+ context, appUsageLatestTimestampUri, /* defaultValue= */ INVALID_TIMESTAMP);
final String latestTimestampString = utcToLocalTimeForLogging(latestTimestamp);
- Log.d(TAG, String.format(
- "getAppUsageStartTimestampOfUser() userId=%d latestTimestamp=%s in %d/ms",
- userId, latestTimestampString, (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "getAppUsageStartTimestampOfUser() userId=%d latestTimestamp=%s in %d/ms",
+ userId, latestTimestampString, (System.currentTimeMillis() - startTime)));
// Use (latestTimestamp + 1) here to avoid loading the events of the latestTimestamp
// repeatedly.
return Math.max(latestTimestamp + 1, earliestTimestamp);
@@ -184,25 +204,30 @@
final long queryTimestamp =
Math.max(rawStartTimestamp, sixDaysAgoTimestamp) - USAGE_QUERY_BUFFER_HOURS;
Log.d(TAG, "sixDaysAgoTimestamp: " + utcToLocalTimeForLogging(sixDaysAgoTimestamp));
- final String queryUserIdString = userIds.stream()
- .map(userId -> String.valueOf(userId))
- .collect(Collectors.joining(","));
+ final String queryUserIdString =
+ userIds.stream()
+ .map(userId -> String.valueOf(userId))
+ .collect(Collectors.joining(","));
// Builds the content uri everytime to avoid cache.
final Uri appUsageEventUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.appendPath(APP_USAGE_EVENT_TABLE)
- .appendQueryParameter(
- QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
+ .appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
.appendQueryParameter(QUERY_KEY_USERID, queryUserIdString)
.build();
- final List<AppUsageEvent> appUsageEventList = loadListFromContentProvider(
- context, appUsageEventUri, ConvertUtils::convertToAppUsageEvent);
- Log.d(TAG, String.format("getAppUsageEventForUser userId=%s size=%d in %d/ms",
- queryUserIdString, appUsageEventList.size(),
- (System.currentTimeMillis() - startTime)));
+ final List<AppUsageEvent> appUsageEventList =
+ loadListFromContentProvider(
+ context, appUsageEventUri, ConvertUtils::convertToAppUsageEvent);
+ Log.d(
+ TAG,
+ String.format(
+ "getAppUsageEventForUser userId=%s size=%d in %d/ms",
+ queryUserIdString,
+ appUsageEventList.size(),
+ (System.currentTimeMillis() - startTime)));
return appUsageEventList;
}
@@ -216,25 +241,29 @@
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
final long queryTimestamp = Math.max(rawStartTimestamp, sixDaysAgoTimestamp);
Log.d(TAG, "getBatteryEvents for timestamp: " + queryTimestamp);
- final String queryBatteryEventTypesString = queryBatteryEventTypes.stream()
- .map(type -> String.valueOf(type.getNumber()))
- .collect(Collectors.joining(","));
+ final String queryBatteryEventTypesString =
+ queryBatteryEventTypes.stream()
+ .map(type -> String.valueOf(type.getNumber()))
+ .collect(Collectors.joining(","));
// Builds the content uri everytime to avoid cache.
final Uri batteryEventUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.appendPath(BATTERY_EVENT_TABLE)
- .appendQueryParameter(
- QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
+ .appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
.appendQueryParameter(
QUERY_BATTERY_EVENT_TYPE, queryBatteryEventTypesString)
.build();
- final List<BatteryEvent> batteryEventList = loadListFromContentProvider(
- context, batteryEventUri, ConvertUtils::convertToBatteryEvent);
- Log.d(TAG, String.format("getBatteryEvents size=%d in %d/ms", batteryEventList.size(),
- (System.currentTimeMillis() - startTime)));
+ final List<BatteryEvent> batteryEventList =
+ loadListFromContentProvider(
+ context, batteryEventUri, ConvertUtils::convertToBatteryEvent);
+ Log.d(
+ TAG,
+ String.format(
+ "getBatteryEvents size=%d in %d/ms",
+ batteryEventList.size(), (System.currentTimeMillis() - startTime)));
return batteryEventList;
}
@@ -242,9 +271,7 @@
* Returns the battery usage slot data after {@code rawStartTimestamp} in battery event table.
*/
public static List<BatteryUsageSlot> getBatteryUsageSlots(
- Context context,
- final Calendar calendar,
- final long rawStartTimestamp) {
+ Context context, final Calendar calendar, final long rawStartTimestamp) {
final long startTime = System.currentTimeMillis();
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
final long queryTimestamp = Math.max(rawStartTimestamp, sixDaysAgoTimestamp);
@@ -255,14 +282,17 @@
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.appendPath(BATTERY_USAGE_SLOT_TABLE)
- .appendQueryParameter(
- QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
+ .appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
.build();
- final List<BatteryUsageSlot> batteryUsageSlotList = loadListFromContentProvider(
- context, batteryUsageSlotUri, ConvertUtils::convertToBatteryUsageSlot);
- Log.d(TAG, String.format("getBatteryUsageSlots size=%d in %d/ms",
- batteryUsageSlotList.size(), (System.currentTimeMillis() - startTime)));
+ final List<BatteryUsageSlot> batteryUsageSlotList =
+ loadListFromContentProvider(
+ context, batteryUsageSlotUri, ConvertUtils::convertToBatteryUsageSlot);
+ Log.d(
+ TAG,
+ String.format(
+ "getBatteryUsageSlots size=%d in %d/ms",
+ batteryUsageSlotList.size(), (System.currentTimeMillis() - startTime)));
return batteryUsageSlotList;
}
@@ -276,12 +306,15 @@
.authority(AUTHORITY)
.appendPath(LAST_FULL_CHARGE_TIMESTAMP_PATH)
.build();
- final long lastFullChargeTime = loadLongFromContentProvider(
- context, lastFullChargeTimeUri, /*defaultValue=*/ INVALID_TIMESTAMP);
+ final long lastFullChargeTime =
+ loadLongFromContentProvider(
+ context, lastFullChargeTimeUri, /* defaultValue= */ INVALID_TIMESTAMP);
final String lastFullChargeTimeString = utcToLocalTimeForLogging(lastFullChargeTime);
- Log.d(TAG, String.format(
- "getLastFullChargeTime() lastFullChargeTime=%s in %d/ms",
- lastFullChargeTimeString, (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "getLastFullChargeTime() lastFullChargeTime=%s in %d/ms",
+ lastFullChargeTimeString, (System.currentTimeMillis() - startTime)));
return lastFullChargeTime;
}
@@ -296,16 +329,21 @@
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.appendPath(BATTERY_STATE_LATEST_TIMESTAMP_PATH)
- .appendQueryParameter(
- QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
+ .appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
.build();
- final long batteryStateLatestTimestamp = loadLongFromContentProvider(
- context, batteryStateLatestTimestampUri, /*defaultValue=*/ INVALID_TIMESTAMP);
+ final long batteryStateLatestTimestamp =
+ loadLongFromContentProvider(
+ context,
+ batteryStateLatestTimestampUri,
+ /* defaultValue= */ INVALID_TIMESTAMP);
final String batteryStateLatestTimestampString =
utcToLocalTimeForLogging(batteryStateLatestTimestamp);
- Log.d(TAG, String.format(
- "getBatteryStateLatestTimestamp() batteryStateLatestTimestamp=%s in %d/ms",
- batteryStateLatestTimestampString, (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "getBatteryStateLatestTimestamp() batteryStateLatestTimestamp=%s in %d/ms",
+ batteryStateLatestTimestampString,
+ (System.currentTimeMillis() - startTime)));
return batteryStateLatestTimestamp;
}
@@ -320,12 +358,12 @@
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.appendPath(BATTERY_STATE_TABLE)
- .appendQueryParameter(
- QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
+ .appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
.build();
- final List<BatteryHistEntry> batteryHistEntryList = loadListFromContentProvider(
- context, batteryStateUri, cursor -> new BatteryHistEntry(cursor));
+ final List<BatteryHistEntry> batteryHistEntryList =
+ loadListFromContentProvider(
+ context, batteryStateUri, cursor -> new BatteryHistEntry(cursor));
final Map<Long, Map<String, BatteryHistEntry>> resultMap = new ArrayMap();
for (final BatteryHistEntry entry : batteryHistEntryList) {
final long timestamp = entry.mTimestamp;
@@ -342,27 +380,37 @@
if (resultMap == null || resultMap.isEmpty()) {
Log.d(TAG, "getBatteryHistoryMap() returns empty or null");
} else {
- Log.d(TAG, String.format("getBatteryHistoryMap() size=%d in %d/ms",
- resultMap.size(), (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "getBatteryHistoryMap() size=%d in %d/ms",
+ resultMap.size(), (System.currentTimeMillis() - startTime)));
}
return resultMap;
}
/**
- * Returns the battery history map since the latest record no later than the given timestamp.
- * If there is no record before the given timestamp or the given timestamp is before last full
+ * Returns the battery history map since the latest record no later than the given timestamp. If
+ * there is no record before the given timestamp or the given timestamp is before last full
* charge time, returns the history map since last full charge time.
*/
public static Map<Long, Map<String, BatteryHistEntry>>
- getHistoryMapSinceLatestRecordBeforeQueryTimestamp(Context context, Calendar calendar,
- final long queryTimestamp, final long lastFullChargeTime) {
+ getHistoryMapSinceLatestRecordBeforeQueryTimestamp(
+ Context context,
+ Calendar calendar,
+ final long queryTimestamp,
+ final long lastFullChargeTime) {
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
Log.d(TAG, "sixDaysAgoTimestamp: " + utcToLocalTimeForLogging(sixDaysAgoTimestamp));
final long batteryStateLatestTimestamp =
- queryTimestamp == 0L ? 0L : getBatteryStateLatestTimestampBeforeQueryTimestamp(
- context, queryTimestamp);
- final long maxTimestamp = Math.max(Math.max(
- sixDaysAgoTimestamp, lastFullChargeTime), batteryStateLatestTimestamp);
+ queryTimestamp == 0L
+ ? 0L
+ : getBatteryStateLatestTimestampBeforeQueryTimestamp(
+ context, queryTimestamp);
+ final long maxTimestamp =
+ Math.max(
+ Math.max(sixDaysAgoTimestamp, lastFullChargeTime),
+ batteryStateLatestTimestamp);
return getHistoryMapSinceQueryTimestamp(context, maxTimestamp);
}
@@ -376,34 +424,66 @@
/** Clears all data in the battery usage database. */
public static void clearAll(Context context) {
- AsyncTask.execute(() -> {
- try {
- final BatteryStateDatabase database = BatteryStateDatabase
- .getInstance(context.getApplicationContext());
- database.appUsageEventDao().clearAll();
- database.batteryEventDao().clearAll();
- database.batteryStateDao().clearAll();
- database.batteryUsageSlotDao().clearAll();
- } catch (RuntimeException e) {
- Log.e(TAG, "clearAll() failed", e);
- }
- });
+ AsyncTask.execute(
+ () -> {
+ try {
+ final BatteryStateDatabase database =
+ BatteryStateDatabase.getInstance(context.getApplicationContext());
+ database.appUsageEventDao().clearAll();
+ database.batteryEventDao().clearAll();
+ database.batteryStateDao().clearAll();
+ database.batteryUsageSlotDao().clearAll();
+ } catch (RuntimeException e) {
+ Log.e(TAG, "clearAll() failed", e);
+ }
+ });
}
/** Clears all out-of-date data in the battery usage database. */
public static void clearExpiredDataIfNeeded(Context context) {
+ AsyncTask.execute(
+ () -> {
+ try {
+ final BatteryStateDatabase database =
+ BatteryStateDatabase.getInstance(context.getApplicationContext());
+ final long earliestTimestamp =
+ Clock.systemUTC().millis()
+ - Duration.ofDays(DATA_RETENTION_INTERVAL_DAY).toMillis();
+ database.appUsageEventDao().clearAllBefore(earliestTimestamp);
+ database.batteryEventDao().clearAllBefore(earliestTimestamp);
+ database.batteryStateDao().clearAllBefore(earliestTimestamp);
+ database.batteryUsageSlotDao().clearAllBefore(earliestTimestamp);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "clearAllBefore() failed", e);
+ }
+ });
+ }
+
+ /** Clears all data and jobs if current timestamp is out of the range of last recorded job. */
+ public static void clearDataAfterTimeChangedIfNeeded(Context context) {
AsyncTask.execute(() -> {
try {
- final BatteryStateDatabase database = BatteryStateDatabase
- .getInstance(context.getApplicationContext());
- final long earliestTimestamp = Clock.systemUTC().millis()
- - Duration.ofDays(DATA_RETENTION_INTERVAL_DAY).toMillis();
- database.appUsageEventDao().clearAllBefore(earliestTimestamp);
- database.batteryEventDao().clearAllBefore(earliestTimestamp);
- database.batteryStateDao().clearAllBefore(earliestTimestamp);
- database.batteryUsageSlotDao().clearAllBefore(earliestTimestamp);
+ final List<BatteryEvent> batteryLevelRecordEvents =
+ DatabaseUtils.getBatteryEvents(context, Calendar.getInstance(),
+ getLastFullChargeTime(context), BATTERY_LEVEL_RECORD_EVENTS);
+ final long lastRecordTimestamp = batteryLevelRecordEvents.isEmpty()
+ ? INVALID_TIMESTAMP : batteryLevelRecordEvents.get(0).getTimestamp();
+ final long nextRecordTimestamp =
+ TimestampUtils.getNextEvenHourTimestamp(lastRecordTimestamp);
+ final long currentTime = System.currentTimeMillis();
+ final boolean isOutOfTimeRange = lastRecordTimestamp == INVALID_TIMESTAMP
+ || currentTime < lastRecordTimestamp || currentTime > nextRecordTimestamp;
+ final String logInfo = String.format(Locale.ENGLISH,
+ "clear database = %b, current time = %d, last record time = %d",
+ isOutOfTimeRange, currentTime, lastRecordTimestamp);
+ Log.d(TAG, logInfo);
+ BatteryUsageLogUtils.writeLog(context, Action.TIME_UPDATED, logInfo);
+ if (isOutOfTimeRange) {
+ DatabaseUtils.clearAll(context);
+ PeriodicJobManager.getInstance(context).refreshJob(/* fromBoot= */ false);
+ }
} catch (RuntimeException e) {
- Log.e(TAG, "clearAllBefore() failed", e);
+ Log.e(TAG, "refreshDataAndJobIfNeededAfterTimeChanged() failed", e);
}
});
}
@@ -425,9 +505,9 @@
if (isWorkProfile(context)) {
try {
return context.createPackageContextAsUser(
- /*packageName=*/ context.getPackageName(),
- /*flags=*/ 0,
- /*user=*/ context.getSystemService(UserManager.class)
+ /* packageName= */ context.getPackageName(),
+ /* flags= */ 0,
+ /* user= */ context.getSystemService(UserManager.class)
.getProfileParent(context.getUser()));
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "context.createPackageContextAsUser() fail:", e);
@@ -444,8 +524,11 @@
final List<ContentValues> valuesList = new ArrayList<>();
appUsageEventList.stream()
.filter(appUsageEvent -> appUsageEvent.hasUid())
- .forEach(appUsageEvent -> valuesList.add(
- ConvertUtils.convertAppUsageEventToContentValues(appUsageEvent)));
+ .forEach(
+ appUsageEvent ->
+ valuesList.add(
+ ConvertUtils.convertAppUsageEventToContentValues(
+ appUsageEvent)));
int size = 0;
final ContentResolver resolver = context.getContentResolver();
// Inserts all ContentValues into battery provider.
@@ -454,14 +537,17 @@
valuesList.toArray(valuesArray);
try {
size = resolver.bulkInsert(APP_USAGE_EVENT_URI, valuesArray);
- resolver.notifyChange(APP_USAGE_EVENT_URI, /*observer=*/ null);
+ resolver.notifyChange(APP_USAGE_EVENT_URI, /* observer= */ null);
Log.d(TAG, "insert() app usage events data into database");
} catch (Exception e) {
Log.e(TAG, "bulkInsert() app usage data into database error:", e);
}
}
- Log.d(TAG, String.format("sendAppUsageEventData() size=%d in %d/ms",
- size, (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "sendAppUsageEventData() size=%d in %d/ms",
+ size, (System.currentTimeMillis() - startTime)));
clearMemory();
return valuesList;
}
@@ -477,8 +563,11 @@
} catch (Exception e) {
Log.e(TAG, "insert() battery event data into database error:", e);
}
- Log.d(TAG, String.format("sendBatteryEventData() in %d/ms",
- (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "sendBatteryEventData() in %d/ms",
+ (System.currentTimeMillis() - startTime)));
clearMemory();
return contentValues;
}
@@ -489,8 +578,11 @@
// Creates the ContentValues list to insert them into provider.
final List<ContentValues> valuesList = new ArrayList<>();
batteryEventList.stream()
- .forEach(batteryEvent -> valuesList.add(
- ConvertUtils.convertBatteryEventToContentValues(batteryEvent)));
+ .forEach(
+ batteryEvent ->
+ valuesList.add(
+ ConvertUtils.convertBatteryEventToContentValues(
+ batteryEvent)));
int size = 0;
final ContentResolver resolver = context.getContentResolver();
// Inserts all ContentValues into battery provider.
@@ -499,14 +591,17 @@
valuesList.toArray(valuesArray);
try {
size = resolver.bulkInsert(BATTERY_EVENT_URI, valuesArray);
- resolver.notifyChange(BATTERY_EVENT_URI, /*observer=*/ null);
+ resolver.notifyChange(BATTERY_EVENT_URI, /* observer= */ null);
Log.d(TAG, "insert() battery event data into database");
} catch (Exception e) {
Log.e(TAG, "bulkInsert() battery event data into database error:", e);
}
}
- Log.d(TAG, String.format("sendBatteryEventData() size=%d in %d/ms",
- size, (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "sendBatteryEventData() size=%d in %d/ms",
+ size, (System.currentTimeMillis() - startTime)));
clearMemory();
return valuesList;
}
@@ -517,8 +612,11 @@
// Creates the ContentValues list to insert them into provider.
final List<ContentValues> valuesList = new ArrayList<>();
batteryUsageSlotList.stream()
- .forEach(batteryUsageSlot -> valuesList.add(
- ConvertUtils.convertBatteryUsageSlotToContentValues(batteryUsageSlot)));
+ .forEach(
+ batteryUsageSlot ->
+ valuesList.add(
+ ConvertUtils.convertBatteryUsageSlotToContentValues(
+ batteryUsageSlot)));
int size = 0;
final ContentResolver resolver = context.getContentResolver();
// Inserts all ContentValues into battery provider.
@@ -527,14 +625,17 @@
valuesList.toArray(valuesArray);
try {
size = resolver.bulkInsert(BATTERY_USAGE_SLOT_URI, valuesArray);
- resolver.notifyChange(BATTERY_USAGE_SLOT_URI, /*observer=*/ null);
+ resolver.notifyChange(BATTERY_USAGE_SLOT_URI, /* observer= */ null);
Log.d(TAG, "insert() battery usage slots data into database");
} catch (Exception e) {
Log.e(TAG, "bulkInsert() battery usage slots data into database error:", e);
}
}
- Log.d(TAG, String.format("sendBatteryUsageSlotData() size=%d in %d/ms",
- size, (System.currentTimeMillis() - startTime)));
+ Log.d(
+ TAG,
+ String.format(
+ "sendBatteryUsageSlotData() size=%d in %d/ms",
+ size, (System.currentTimeMillis() - startTime)));
clearMemory();
return valuesList;
}
@@ -553,10 +654,12 @@
return null;
}
final int batteryLevel = BatteryStatus.getBatteryLevel(intent);
- final int batteryStatus = intent.getIntExtra(
- BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
- final int batteryHealth = intent.getIntExtra(
- BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
+ final int batteryStatus =
+ intent.getIntExtra(
+ BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
+ final int batteryHealth =
+ intent.getIntExtra(
+ BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
// We should use the same timestamp for each data snapshot.
final long snapshotBootTimestamp = SystemClock.elapsedRealtime();
@@ -564,30 +667,35 @@
final List<ContentValues> valuesList = new ArrayList<>();
if (batteryEntryList != null) {
batteryEntryList.stream()
- .filter(entry -> {
- final long foregroundMs = entry.getTimeInForegroundMs();
- final long backgroundMs = entry.getTimeInBackgroundMs();
- if (entry.getConsumedPower() == 0
- && (foregroundMs != 0
- || backgroundMs != 0)) {
- Log.w(TAG, String.format(
- "no consumed power but has running time for %s time=%d|%d",
- entry.getLabel(), foregroundMs, backgroundMs));
- }
- return entry.getConsumedPower() != 0
- || foregroundMs != 0
- || backgroundMs != 0;
- })
- .forEach(entry -> valuesList.add(
- ConvertUtils.convertBatteryEntryToContentValues(
- entry,
- batteryUsageStats,
- batteryLevel,
- batteryStatus,
- batteryHealth,
- snapshotBootTimestamp,
- snapshotTimestamp,
- isFullChargeStart)));
+ .filter(
+ entry -> {
+ final long foregroundMs = entry.getTimeInForegroundMs();
+ final long backgroundMs = entry.getTimeInBackgroundMs();
+ if (entry.getConsumedPower() == 0
+ && (foregroundMs != 0 || backgroundMs != 0)) {
+ Log.w(
+ TAG,
+ String.format(
+ "no consumed power but has running time for %s"
+ + " time=%d|%d",
+ entry.getLabel(), foregroundMs, backgroundMs));
+ }
+ return entry.getConsumedPower() != 0
+ || foregroundMs != 0
+ || backgroundMs != 0;
+ })
+ .forEach(
+ entry ->
+ valuesList.add(
+ ConvertUtils.convertBatteryEntryToContentValues(
+ entry,
+ batteryUsageStats,
+ batteryLevel,
+ batteryStatus,
+ batteryHealth,
+ snapshotBootTimestamp,
+ snapshotTimestamp,
+ isFullChargeStart)));
}
int size = 1;
@@ -599,8 +707,10 @@
valuesList.toArray(valuesArray);
try {
size = resolver.bulkInsert(BATTERY_CONTENT_URI, valuesArray);
- Log.d(TAG, "insert() battery states data into database with isFullChargeStart:"
- + isFullChargeStart);
+ Log.d(
+ TAG,
+ "insert() battery states data into database with isFullChargeStart:"
+ + isFullChargeStart);
} catch (Exception e) {
Log.e(TAG, "bulkInsert() data into database error:", e);
}
@@ -608,8 +718,8 @@
// Inserts one fake data into battery provider.
final ContentValues contentValues =
ConvertUtils.convertBatteryEntryToContentValues(
- /*entry=*/ null,
- /*batteryUsageStats=*/ null,
+ /* entry= */ null,
+ /* batteryUsageStats= */ null,
batteryLevel,
batteryStatus,
batteryHealth,
@@ -618,21 +728,23 @@
isFullChargeStart);
try {
resolver.insert(BATTERY_CONTENT_URI, contentValues);
- Log.d(TAG, "insert() data into database with isFullChargeStart:"
- + isFullChargeStart);
+ Log.d(
+ TAG,
+ "insert() data into database with isFullChargeStart:" + isFullChargeStart);
} catch (Exception e) {
Log.e(TAG, "insert() data into database error:", e);
}
valuesList.add(contentValues);
}
- resolver.notifyChange(BATTERY_CONTENT_URI, /*observer=*/ null);
+ resolver.notifyChange(BATTERY_CONTENT_URI, /* observer= */ null);
BatteryUsageLogUtils.writeLog(
- context,
- Action.INSERT_USAGE_DATA,
- "size=" + size + " " + errorMessage);
- Log.d(TAG, String.format("sendBatteryEntryData() size=%d in %d/ms",
- size, (System.currentTimeMillis() - startTime)));
+ context, Action.INSERT_USAGE_DATA, "size=" + size + " " + errorMessage);
+ Log.d(
+ TAG,
+ String.format(
+ "sendBatteryEntryData() size=%d in %d/ms",
+ size, (System.currentTimeMillis() - startTime)));
if (isFullChargeStart) {
recordDateTime(context, KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
}
@@ -642,25 +754,30 @@
/** Dump all required data into {@link PrintWriter}. */
public static void dump(Context context, PrintWriter writer) {
- writeString(context, writer, "BatteryLevelChanged",
- Intent.ACTION_BATTERY_LEVEL_CHANGED);
- writeString(context, writer, "BatteryPlugging",
+ writeString(context, writer, "BatteryLevelChanged", Intent.ACTION_BATTERY_LEVEL_CHANGED);
+ writeString(
+ context,
+ writer,
+ "BatteryPlugging",
BatteryUsageBroadcastReceiver.ACTION_BATTERY_PLUGGING);
- writeString(context, writer, "BatteryUnplugging",
+ writeString(
+ context,
+ writer,
+ "BatteryUnplugging",
BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
- writeString(context, writer, "ClearBatteryCacheData",
+ writeString(
+ context,
+ writer,
+ "ClearBatteryCacheData",
BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA);
- writeString(context, writer, "LastLoadFullChargeTime",
- KEY_LAST_LOAD_FULL_CHARGE_TIME);
- writeString(context, writer, "LastUploadFullChargeTime",
- KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
- writeString(context, writer, "DismissedPowerAnomalyKeys",
- KEY_DISMISSED_POWER_ANOMALY_KEYS);
+ writeString(context, writer, "LastLoadFullChargeTime", KEY_LAST_LOAD_FULL_CHARGE_TIME);
+ writeString(context, writer, "LastUploadFullChargeTime", KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
+ writeString(context, writer, "DismissedPowerAnomalyKeys", KEY_DISMISSED_POWER_ANOMALY_KEYS);
}
static SharedPreferences getSharedPreferences(Context context) {
- return context.getApplicationContext().getSharedPreferences(
- SHARED_PREFS_FILE, Context.MODE_PRIVATE);
+ return context.getApplicationContext()
+ .getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
}
static void removeUsageSource(Context context) {
@@ -678,8 +795,8 @@
static int getUsageSource(Context context, IUsageStatsManager usageStatsManager) {
final SharedPreferences sharedPreferences = getSharedPreferences(context);
if (sharedPreferences != null && sharedPreferences.contains(KEY_LAST_USAGE_SOURCE)) {
- return sharedPreferences
- .getInt(KEY_LAST_USAGE_SOURCE, ConvertUtils.DEFAULT_USAGE_SOURCE);
+ return sharedPreferences.getInt(
+ KEY_LAST_USAGE_SOURCE, ConvertUtils.DEFAULT_USAGE_SOURCE);
}
int usageSource = ConvertUtils.DEFAULT_USAGE_SOURCE;
@@ -714,7 +831,8 @@
if (sharedPreferences != null) {
final Set<String> dismissedPowerAnomalyKeys = getDismissedPowerAnomalyKeys(context);
dismissedPowerAnomalyKeys.add(dismissedPowerAnomalyKey);
- sharedPreferences.edit()
+ sharedPreferences
+ .edit()
.putStringSet(KEY_DISMISSED_POWER_ANOMALY_KEYS, dismissedPowerAnomalyKeys)
.apply();
}
@@ -736,22 +854,32 @@
if (context == null) {
return defaultValue;
}
- try (Cursor cursor = sFakeSupplier != null ? sFakeSupplier.get() :
- context.getContentResolver().query(uri, null, null, null)) {
+ try (Cursor cursor =
+ sFakeSupplier != null
+ ? sFakeSupplier.get()
+ : context.getContentResolver().query(uri, null, null, null)) {
return (cursor == null || cursor.getCount() == 0)
- ? defaultValue : cursorReader.apply(cursor);
+ ? defaultValue
+ : cursorReader.apply(cursor);
}
}
private static long loadLongFromContentProvider(
Context context, Uri uri, final long defaultValue) {
- return loadFromContentProvider(context, uri, defaultValue,
- cursor -> cursor.moveToFirst() ? cursor.getLong(/*columnIndex=*/ 0) : defaultValue);
+ return loadFromContentProvider(
+ context,
+ uri,
+ defaultValue,
+ cursor ->
+ cursor.moveToFirst() ? cursor.getLong(/* columnIndex= */ 0) : defaultValue);
}
private static <E> List<E> loadListFromContentProvider(
Context context, Uri uri, Function<Cursor, E> converter) {
- return loadFromContentProvider(context, uri, new ArrayList<>(),
+ return loadFromContentProvider(
+ context,
+ uri,
+ new ArrayList<>(),
cursor -> {
final List<E> list = new ArrayList<>();
while (cursor.moveToNext()) {
@@ -775,11 +903,13 @@
return;
}
final Handler mainHandler = new Handler(Looper.getMainLooper());
- mainHandler.postDelayed(() -> {
- System.gc();
- System.runFinalization();
- System.gc();
- Log.w(TAG, "invoke clearMemory()");
- }, CLEAR_MEMORY_DELAYED_MS);
+ mainHandler.postDelayed(
+ () -> {
+ System.gc();
+ System.runFinalization();
+ System.gc();
+ Log.w(TAG, "invoke clearMemory()");
+ },
+ CLEAR_MEMORY_DELAYED_MS);
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
index 7fb2c56..b2c72bf 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
@@ -41,11 +41,9 @@
private final Context mContext;
private final AlarmManager mAlarmManager;
- @VisibleForTesting
- static final int DATA_FETCH_INTERVAL_MINUTE = 60;
+ @VisibleForTesting static final int DATA_FETCH_INTERVAL_MINUTE = 60;
- @VisibleForTesting
- static long sBroadcastDelayFromBoot = Duration.ofMinutes(40).toMillis();
+ @VisibleForTesting static long sBroadcastDelayFromBoot = Duration.ofMinutes(40).toMillis();
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
void reset() {
@@ -68,7 +66,9 @@
/** Schedules the next alarm job if it is available. */
public void refreshJob(final boolean fromBoot) {
if (mAlarmManager == null) {
- BatteryUsageLogUtils.writeLog(mContext, Action.SCHEDULE_JOB,
+ BatteryUsageLogUtils.writeLog(
+ mContext,
+ Action.SCHEDULE_JOB,
"cannot schedule next alarm job due to AlarmManager is null");
Log.e(TAG, "cannot schedule next alarm job");
return;
@@ -82,7 +82,9 @@
AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
final String utcToLocalTime = ConvertUtils.utcToLocalTimeForLogging(triggerAtMillis);
- BatteryUsageLogUtils.writeLog(mContext, Action.SCHEDULE_JOB,
+ BatteryUsageLogUtils.writeLog(
+ mContext,
+ Action.SCHEDULE_JOB,
String.format("triggerTime=%s, fromBoot=%b", utcToLocalTime, fromBoot));
Log.d(TAG, "schedule next alarm job at " + utcToLocalTime);
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
index dccca43..bd77feb 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
@@ -36,7 +36,9 @@
try {
loadDataAndRefreshJob(context, intent);
} catch (Exception e) {
- BatteryUsageLogUtils.writeLog(context, Action.SCHEDULE_JOB,
+ BatteryUsageLogUtils.writeLog(
+ context,
+ Action.SCHEDULE_JOB,
String.format("loadDataAndRefreshJob() failed: %s", e));
}
}
@@ -48,15 +50,15 @@
return;
}
if (DatabaseUtils.isWorkProfile(context)) {
- BatteryUsageLogUtils.writeLog(context, Action.SCHEDULE_JOB,
- "do not refresh job for work profile");
+ BatteryUsageLogUtils.writeLog(
+ context, Action.SCHEDULE_JOB, "do not refresh job for work profile");
Log.w(TAG, "do not refresh job for work profile action=" + action);
return;
}
BatteryUsageLogUtils.writeLog(context, Action.EXECUTE_JOB, "");
- BatteryUsageDataLoader.enqueueWork(context, /*isFullChargeStart=*/ false);
+ BatteryUsageDataLoader.enqueueWork(context, /* isFullChargeStart= */ false);
Log.d(TAG, "refresh periodic job from action=" + action);
- PeriodicJobManager.getInstance(context).refreshJob(/*fromBoot=*/ false);
+ PeriodicJobManager.getInstance(context).refreshJob(/* fromBoot= */ false);
DatabaseUtils.clearExpiredDataIfNeeded(context);
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java
index 56ada8e..fca618b 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java
@@ -30,11 +30,11 @@
import com.android.settingslib.widget.AppPreference;
/**
- * Custom preference for displaying battery usage info as a bar and an icon on
- * the left for the subsystem/app type.
+ * Custom preference for displaying battery usage info as a bar and an icon on the left for the
+ * subsystem/app type.
*
- * The battery usage info could be usage percentage or usage time. The preference
- * won't show any icon if it is null.
+ * <p>The battery usage info could be usage percentage or usage time. The preference won't show any
+ * icon if it is null.
*/
public class PowerGaugePreference extends AppPreference {
@@ -49,8 +49,8 @@
private CharSequence mProgress;
private boolean mShowAnomalyIcon;
- public PowerGaugePreference(Context context, Drawable icon, CharSequence contentDescription,
- BatteryEntry info) {
+ public PowerGaugePreference(
+ Context context, Drawable icon, CharSequence contentDescription, BatteryEntry info) {
this(context, null, icon, contentDescription, info);
}
@@ -62,8 +62,12 @@
this(context, attrs, null, null, null);
}
- private PowerGaugePreference(Context context, AttributeSet attrs, Drawable icon,
- CharSequence contentDescription, BatteryEntry info) {
+ private PowerGaugePreference(
+ Context context,
+ AttributeSet attrs,
+ Drawable icon,
+ CharSequence contentDescription,
+ BatteryEntry info) {
super(context, attrs);
if (icon != null) {
setIcon(icon);
@@ -119,15 +123,19 @@
super.onBindViewHolder(view);
final boolean isNightMode = Utils.isNightMode(getContext());
- final float alpha = isSelectable() ? SELECTABLE_ALPHA
- : (isNightMode ? UNSELECTABLE_ALPHA_DARK_MODE : UNSELECTABLE_ALPHA_LIGHT_MODE);
+ final float alpha =
+ isSelectable()
+ ? SELECTABLE_ALPHA
+ : (isNightMode
+ ? UNSELECTABLE_ALPHA_DARK_MODE
+ : UNSELECTABLE_ALPHA_LIGHT_MODE);
setViewAlpha(view.itemView, alpha);
final TextView subtitle = (TextView) view.findViewById(R.id.widget_summary);
subtitle.setText(mProgress);
if (mShowAnomalyIcon) {
- subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_warning_24dp, 0,
- 0, 0);
+ subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
+ R.drawable.ic_warning_24dp, 0, 0, 0);
} else {
subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index 056490b..072040d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -61,8 +61,8 @@
private static final String KEY_REFRESH_TYPE = "refresh_type";
private static final String KEY_BATTERY_CHART = "battery_chart";
- @VisibleForTesting
- BatteryHistoryPreference mHistPref;
+ @VisibleForTesting BatteryHistoryPreference mHistPref;
+
@VisibleForTesting
final BatteryLevelDataLoaderCallbacks mBatteryLevelDataLoaderCallbacks =
new BatteryLevelDataLoaderCallbacks();
@@ -79,23 +79,16 @@
public void onChange(boolean selfChange) {
Log.d(TAG, "onBatteryContentChange: " + selfChange);
mIsChartDataLoaded = false;
- restartBatteryStatsLoader(
- BatteryBroadcastReceiver.BatteryUpdateType.MANUAL);
+ restartBatteryStatsLoader(BatteryBroadcastReceiver.BatteryUpdateType.MANUAL);
}
};
- @VisibleForTesting
- BatteryTipsController mBatteryTipsController;
- @VisibleForTesting
- BatteryChartPreferenceController mBatteryChartPreferenceController;
- @VisibleForTesting
- ScreenOnTimeController mScreenOnTimeController;
- @VisibleForTesting
- BatteryUsageBreakdownController mBatteryUsageBreakdownController;
- @VisibleForTesting
- Optional<BatteryLevelData> mBatteryLevelData;
- @VisibleForTesting
- Optional<AnomalyEventWrapper> mHighlightEventWrapper;
+ @VisibleForTesting BatteryTipsController mBatteryTipsController;
+ @VisibleForTesting BatteryChartPreferenceController mBatteryChartPreferenceController;
+ @VisibleForTesting ScreenOnTimeController mScreenOnTimeController;
+ @VisibleForTesting BatteryUsageBreakdownController mBatteryUsageBreakdownController;
+ @VisibleForTesting Optional<BatteryLevelData> mBatteryLevelData;
+ @VisibleForTesting Optional<AnomalyEventWrapper> mHighlightEventWrapper;
@Override
public void onCreate(Bundle icicle) {
@@ -146,8 +139,9 @@
mResumeTimestamp = System.currentTimeMillis();
final Uri uri = DatabaseUtils.BATTERY_CONTENT_URI;
if (uri != null) {
- getContext().getContentResolver().registerContentObserver(
- uri, /*notifyForDescendants*/ true, mBatteryObserver);
+ getContext()
+ .getContentResolver()
+ .registerContentObserver(uri, /*notifyForDescendants*/ true, mBatteryObserver);
}
}
@@ -190,7 +184,9 @@
mBatteryLevelData = null;
mBatteryUsageMap = null;
mHighlightEventWrapper = null;
- restartLoader(LoaderIndex.BATTERY_LEVEL_DATA_LOADER, bundle,
+ restartLoader(
+ LoaderIndex.BATTERY_LEVEL_DATA_LOADER,
+ bundle,
mBatteryLevelDataLoaderCallbacks);
}
}
@@ -202,8 +198,11 @@
mBatteryLevelData = Optional.ofNullable(batteryLevelData);
if (mBatteryChartPreferenceController != null) {
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(batteryLevelData);
- Log.d(TAG, String.format("Battery chart shows in %d millis",
- System.currentTimeMillis() - mResumeTimestamp));
+ Log.d(
+ TAG,
+ String.format(
+ "Battery chart shows in %d millis",
+ System.currentTimeMillis() - mResumeTimestamp));
}
}
@@ -211,15 +210,17 @@
if (!isResumed() || mBatteryLevelData == null) {
return;
}
- mBatteryUsageMap = DataProcessor.generateBatteryUsageMap(
- getContext(), batteryDiffDataMap, mBatteryLevelData.orElse(null));
+ mBatteryUsageMap =
+ DataProcessor.generateBatteryUsageMap(
+ getContext(), batteryDiffDataMap, mBatteryLevelData.orElse(null));
Log.d(TAG, "onBatteryDiffDataMapUpdate: " + mBatteryUsageMap);
DataProcessor.loadLabelAndIcon(mBatteryUsageMap);
onSelectedSlotDataUpdated();
detectAnomaly();
logScreenUsageTime();
if (mBatteryChartPreferenceController != null
- && mBatteryLevelData.isEmpty() && isBatteryUsageMapNullOrEmpty()) {
+ && mBatteryLevelData.isEmpty()
+ && isBatteryUsageMapNullOrEmpty()) {
// No available battery usage and battery level data.
mBatteryChartPreferenceController.showEmptyChart();
}
@@ -243,21 +244,28 @@
mBatteryTipsController.acceptTipsCard();
}
mBatteryUsageBreakdownController.handleBatteryUsageUpdated(
- slotUsageData, slotInformation, isBatteryUsageMapNullOrEmpty(),
- isAppsAnomalyEventFocused(), mHighlightEventWrapper);
- Log.d(TAG, String.format("Battery usage list shows in %d millis",
- System.currentTimeMillis() - mResumeTimestamp));
+ slotUsageData,
+ slotInformation,
+ isBatteryUsageMapNullOrEmpty(),
+ isAppsAnomalyEventFocused(),
+ mHighlightEventWrapper);
+ Log.d(
+ TAG,
+ String.format(
+ "Battery usage list shows in %d millis",
+ System.currentTimeMillis() - mResumeTimestamp));
}
private void detectAnomaly() {
- mExecutor.execute(() -> {
- final PowerUsageFeatureProvider powerUsageFeatureProvider =
- FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
- final PowerAnomalyEventList anomalyEventList =
- powerUsageFeatureProvider.detectSettingsAnomaly(
- getContext(), /* displayDrain= */ 0);
- mHandler.post(() -> onAnomalyDetected(anomalyEventList));
- });
+ mExecutor.execute(
+ () -> {
+ final PowerUsageFeatureProvider powerUsageFeatureProvider =
+ FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
+ final PowerAnomalyEventList anomalyEventList =
+ powerUsageFeatureProvider.detectSettingsAnomaly(
+ getContext(), /* displayDrain= */ 0);
+ mHandler.post(() -> onAnomalyDetected(anomalyEventList));
+ });
}
private void onAnomalyDetected(PowerAnomalyEventList anomalyEventList) {
@@ -277,9 +285,12 @@
// If the slot is already highlighted, the tips card should be the corresponding app
// or settings anomaly event.
final PowerAnomalyEvent tipsCardEvent =
- getAnomalyEvent(anomalyEventList,
- event -> !dismissedPowerAnomalyKeys.contains(event.getDismissRecordKey())
- && (event.equals(highlightEvent) || !event.hasWarningItemInfo()));
+ getAnomalyEvent(
+ anomalyEventList,
+ event ->
+ !dismissedPowerAnomalyKeys.contains(event.getDismissRecordKey())
+ && (event.equals(highlightEvent)
+ || !event.hasWarningItemInfo()));
onDisplayAnomalyEventUpdated(tipsCardEvent, highlightEvent);
}
@@ -296,8 +307,10 @@
// Update battery tips card preference & behaviour
mBatteryTipsController.setOnAnomalyConfirmListener(null);
mBatteryTipsController.setOnAnomalyRejectListener(null);
- final AnomalyEventWrapper tipsCardEventWrapper = (tipsCardEvent == null) ? null :
- new AnomalyEventWrapper(getContext(), tipsCardEvent);
+ final AnomalyEventWrapper tipsCardEventWrapper =
+ (tipsCardEvent == null)
+ ? null
+ : new AnomalyEventWrapper(getContext(), tipsCardEvent);
if (tipsCardEventWrapper != null) {
tipsCardEventWrapper.setRelatedBatteryDiffEntry(
findRelatedBatteryDiffEntry(tipsCardEventWrapper));
@@ -306,23 +319,30 @@
tipsCardEventWrapper, isSameAnomalyEvent);
// Update highlight slot effect in battery chart view
- Pair<Integer, Integer> highlightSlotIndexPair = Pair.create(
- BatteryChartViewModel.SELECTED_INDEX_INVALID,
- BatteryChartViewModel.SELECTED_INDEX_INVALID);
- mHighlightEventWrapper = Optional.ofNullable(isSameAnomalyEvent ? tipsCardEventWrapper :
- ((highlightEvent != null)
- ? new AnomalyEventWrapper(getContext(), highlightEvent) : null));
- if (mBatteryLevelData != null && mBatteryLevelData.isPresent()
+ Pair<Integer, Integer> highlightSlotIndexPair =
+ Pair.create(
+ BatteryChartViewModel.SELECTED_INDEX_INVALID,
+ BatteryChartViewModel.SELECTED_INDEX_INVALID);
+ mHighlightEventWrapper =
+ Optional.ofNullable(
+ isSameAnomalyEvent
+ ? tipsCardEventWrapper
+ : ((highlightEvent != null)
+ ? new AnomalyEventWrapper(getContext(), highlightEvent)
+ : null));
+ if (mBatteryLevelData != null
+ && mBatteryLevelData.isPresent()
&& mHighlightEventWrapper.isPresent()
&& mHighlightEventWrapper.get().hasHighlightSlotPair(mBatteryLevelData.get())) {
- highlightSlotIndexPair = mHighlightEventWrapper.get()
- .getHighlightSlotPair(mBatteryLevelData.get());
+ highlightSlotIndexPair =
+ mHighlightEventWrapper.get().getHighlightSlotPair(mBatteryLevelData.get());
if (isSameAnomalyEvent) {
// For main button, focus on highlight slot when clicked
- mBatteryTipsController.setOnAnomalyConfirmListener(() -> {
- mBatteryChartPreferenceController.selectHighlightSlotIndex();
- mBatteryTipsController.acceptTipsCard();
- });
+ mBatteryTipsController.setOnAnomalyConfirmListener(
+ () -> {
+ mBatteryChartPreferenceController.selectHighlightSlotIndex();
+ mBatteryTipsController.acceptTipsCard();
+ });
}
}
mBatteryChartPreferenceController.onHighlightSlotIndexUpdate(
@@ -332,7 +352,8 @@
@VisibleForTesting
BatteryDiffEntry findRelatedBatteryDiffEntry(AnomalyEventWrapper eventWrapper) {
if (eventWrapper == null
- || mBatteryLevelData == null || mBatteryLevelData.isEmpty()
+ || mBatteryLevelData == null
+ || mBatteryLevelData.isEmpty()
|| !eventWrapper.hasHighlightSlotPair(mBatteryLevelData.get())
|| !eventWrapper.hasAnomalyEntryKey()
|| mBatteryUsageMap == null) {
@@ -340,8 +361,10 @@
}
final Pair<Integer, Integer> highlightSlotIndexPair =
eventWrapper.getHighlightSlotPair(mBatteryLevelData.get());
- final BatteryDiffData relatedDiffData = mBatteryUsageMap
- .get(highlightSlotIndexPair.first).get(highlightSlotIndexPair.second);
+ final BatteryDiffData relatedDiffData =
+ mBatteryUsageMap
+ .get(highlightSlotIndexPair.first)
+ .get(highlightSlotIndexPair.second);
final String anomalyEntryKey = eventWrapper.getAnomalyEntryKey();
if (relatedDiffData == null || anomalyEntryKey == null) {
return null;
@@ -365,7 +388,7 @@
// If all data is null or empty, each slot must be null or empty.
return allBatteryDiffData == null
|| (allBatteryDiffData.getAppDiffEntryList().isEmpty()
- && allBatteryDiffData.getSystemDiffEntryList().isEmpty());
+ && allBatteryDiffData.getSystemDiffEntryList().isEmpty());
}
private boolean isAppsAnomalyEventFocused() {
@@ -399,21 +422,22 @@
return null;
}
- final PowerAnomalyEvent filterAnomalyEvent = anomalyEventList.getPowerAnomalyEventsList()
- .stream()
- .filter(predicate)
- .max(Comparator.comparing(PowerAnomalyEvent::getScore))
- .orElse(null);
+ final PowerAnomalyEvent filterAnomalyEvent =
+ anomalyEventList.getPowerAnomalyEventsList().stream()
+ .filter(predicate)
+ .max(Comparator.comparing(PowerAnomalyEvent::getScore))
+ .orElse(null);
Log.d(TAG, "filterAnomalyEvent = " + filterAnomalyEvent);
return filterAnomalyEvent;
}
-
private static BatteryDiffData getAllBatteryDiffData(
Map<Integer, Map<Integer, BatteryDiffData>> batteryUsageMap) {
- return batteryUsageMap == null ? null : batteryUsageMap
- .get(BatteryChartViewModel.SELECTED_INDEX_ALL)
- .get(BatteryChartViewModel.SELECTED_INDEX_ALL);
+ return batteryUsageMap == null
+ ? null
+ : batteryUsageMap
+ .get(BatteryChartViewModel.SELECTED_INDEX_ALL)
+ .get(BatteryChartViewModel.SELECTED_INDEX_ALL);
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
@@ -430,12 +454,16 @@
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new BatteryChartPreferenceController(
- context, null /* lifecycle */, null /* activity */));
+ controllers.add(
+ new BatteryChartPreferenceController(
+ context, null /* lifecycle */, null /* activity */));
controllers.add((new ScreenOnTimeController(context)));
- controllers.add(new BatteryUsageBreakdownController(
- context, null /* lifecycle */, null /* activity */,
- null /* fragment */));
+ controllers.add(
+ new BatteryUsageBreakdownController(
+ context,
+ null /* lifecycle */,
+ null /* activity */,
+ null /* fragment */));
controllers.add(new BatteryTipsController(context));
return controllers;
}
@@ -452,20 +480,21 @@
@Override
public BatteryLevelData loadInBackground() {
return DataProcessManager.getBatteryLevelData(
- getContext(), mHandler, /*isFromPeriodJob=*/ false,
+ getContext(),
+ mHandler,
+ /* isFromPeriodJob= */ false,
PowerUsageAdvanced.this::onBatteryDiffDataMapUpdate);
}
};
}
@Override
- public void onLoadFinished(Loader<BatteryLevelData> loader,
- BatteryLevelData batteryLevelData) {
+ public void onLoadFinished(
+ Loader<BatteryLevelData> loader, BatteryLevelData batteryLevelData) {
PowerUsageAdvanced.this.onBatteryLevelDataUpdate(batteryLevelData);
}
@Override
- public void onLoaderReset(Loader<BatteryLevelData> loader) {
- }
+ public void onLoaderReset(Loader<BatteryLevelData> loader) {}
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBase.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBase.java
index 22856b6..d916ef7 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBase.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBase.java
@@ -36,18 +36,13 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-/**
- * Common base class for things that need to show the battery usage graph.
- */
+/** Common base class for things that need to show the battery usage graph. */
public abstract class PowerUsageBase extends DashboardFragment {
private static final String TAG = "PowerUsageBase";
- @VisibleForTesting
- static final String KEY_REFRESH_TYPE = "refresh_type";
- @VisibleForTesting
- static final String KEY_INCLUDE_HISTORY = "include_history";
- @VisibleForTesting
- BatteryUsageStats mBatteryUsageStats;
+ @VisibleForTesting static final String KEY_REFRESH_TYPE = "refresh_type";
+ @VisibleForTesting static final String KEY_INCLUDE_HISTORY = "include_history";
+ @VisibleForTesting BatteryUsageStats mBatteryUsageStats;
protected UserManager mUm;
protected boolean mIsBatteryPresent = true;
@@ -59,11 +54,10 @@
@Retention(RetentionPolicy.SOURCE)
@IntDef({
- LoaderIndex.BATTERY_USAGE_STATS_LOADER,
- LoaderIndex.BATTERY_INFO_LOADER,
- LoaderIndex.BATTERY_TIP_LOADER,
- LoaderIndex.BATTERY_LEVEL_DATA_LOADER
-
+ LoaderIndex.BATTERY_USAGE_STATS_LOADER,
+ LoaderIndex.BATTERY_INFO_LOADER,
+ LoaderIndex.BATTERY_TIP_LOADER,
+ LoaderIndex.BATTERY_LEVEL_DATA_LOADER
})
public @interface LoaderIndex {
int BATTERY_USAGE_STATS_LOADER = 0;
@@ -83,12 +77,13 @@
super.onCreate(icicle);
mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext());
- mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
- if (type == BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT) {
- mIsBatteryPresent = false;
- }
- restartBatteryStatsLoader(type);
- });
+ mBatteryBroadcastReceiver.setBatteryChangedListener(
+ type -> {
+ if (type == BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT) {
+ mIsBatteryPresent = false;
+ }
+ restartBatteryStatsLoader(type);
+ });
}
@Override
@@ -108,25 +103,22 @@
final Bundle bundle = new Bundle();
bundle.putInt(KEY_REFRESH_TYPE, refreshType);
bundle.putBoolean(KEY_INCLUDE_HISTORY, false);
- restartLoader(LoaderIndex.BATTERY_USAGE_STATS_LOADER, bundle,
- mBatteryUsageStatsLoaderCallbacks);
+ restartLoader(
+ LoaderIndex.BATTERY_USAGE_STATS_LOADER, bundle, mBatteryUsageStatsLoaderCallbacks);
}
protected LoaderManager getLoaderManagerForCurrentFragment() {
return LoaderManager.getInstance(this);
}
- protected void restartLoader(int loaderId, Bundle bundle,
- LoaderManager.LoaderCallbacks<?> loaderCallbacks) {
+ protected void restartLoader(
+ int loaderId, Bundle bundle, LoaderManager.LoaderCallbacks<?> loaderCallbacks) {
LoaderManager loaderManager = getLoaderManagerForCurrentFragment();
- Loader<?> loader = loaderManager.getLoader(
- loaderId);
+ Loader<?> loader = loaderManager.getLoader(loaderId);
if (loader != null && !loader.isReset()) {
- loaderManager.restartLoader(loaderId, bundle,
- loaderCallbacks);
+ loaderManager.restartLoader(loaderId, bundle, loaderCallbacks);
} else {
- loaderManager.initLoader(loaderId, bundle,
- loaderCallbacks);
+ loaderManager.initLoader(loaderId, bundle, loaderCallbacks);
}
}
@@ -148,16 +140,15 @@
}
@Override
- public void onLoadFinished(Loader<BatteryUsageStats> loader,
- BatteryUsageStats batteryUsageStats) {
+ public void onLoadFinished(
+ Loader<BatteryUsageStats> loader, BatteryUsageStats batteryUsageStats) {
closeBatteryUsageStatsIfNeeded();
mBatteryUsageStats = batteryUsageStats;
PowerUsageBase.this.onLoadFinished(mRefreshType);
}
@Override
- public void onLoaderReset(Loader<BatteryUsageStats> loader) {
- }
+ public void onLoaderReset(Loader<BatteryUsageStats> loader) {}
}
private void closeBatteryUsageStatsIfNeeded() {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java
index f52de5f..5ef820c 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummary.java
@@ -53,41 +53,32 @@
* since the last time it was unplugged.
*/
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
-public class PowerUsageSummary extends PowerUsageBase implements
- BatteryTipPreferenceController.BatteryTipListener {
+public class PowerUsageSummary extends PowerUsageBase
+ implements BatteryTipPreferenceController.BatteryTipListener {
static final String TAG = "PowerUsageSummary";
- @VisibleForTesting
- static final String KEY_BATTERY_ERROR = "battery_help_message";
- @VisibleForTesting
- static final String KEY_BATTERY_USAGE = "battery_usage_summary";
+ @VisibleForTesting static final String KEY_BATTERY_ERROR = "battery_help_message";
+ @VisibleForTesting static final String KEY_BATTERY_USAGE = "battery_usage_summary";
+
+ @VisibleForTesting PowerUsageFeatureProvider mPowerFeatureProvider;
+ @VisibleForTesting BatteryUtils mBatteryUtils;
+ @VisibleForTesting BatteryInfo mBatteryInfo;
+
+ @VisibleForTesting BatteryHeaderPreferenceController mBatteryHeaderPreferenceController;
+ @VisibleForTesting BatteryTipPreferenceController mBatteryTipPreferenceController;
+ @VisibleForTesting boolean mNeedUpdateBatteryTip;
+ @VisibleForTesting Preference mHelpPreference;
+ @VisibleForTesting Preference mBatteryUsagePreference;
@VisibleForTesting
- PowerUsageFeatureProvider mPowerFeatureProvider;
- @VisibleForTesting
- BatteryUtils mBatteryUtils;
- @VisibleForTesting
- BatteryInfo mBatteryInfo;
-
- @VisibleForTesting
- BatteryHeaderPreferenceController mBatteryHeaderPreferenceController;
- @VisibleForTesting
- BatteryTipPreferenceController mBatteryTipPreferenceController;
- @VisibleForTesting
- boolean mNeedUpdateBatteryTip;
- @VisibleForTesting
- Preference mHelpPreference;
- @VisibleForTesting
- Preference mBatteryUsagePreference;
-
- @VisibleForTesting
- final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- restartBatteryInfoLoader();
- }
- };
+ final ContentObserver mSettingsObserver =
+ new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ restartBatteryInfoLoader();
+ }
+ };
@VisibleForTesting
LoaderManager.LoaderCallbacks<BatteryInfo> mBatteryInfoLoaderCallbacks =
@@ -121,17 +112,14 @@
}
@Override
- public void onLoadFinished(Loader<List<BatteryTip>> loader,
- List<BatteryTip> data) {
+ public void onLoadFinished(Loader<List<BatteryTip>> loader, List<BatteryTip> data) {
mBatteryTipPreferenceController.updateBatteryTips(data);
mBatteryHeaderPreferenceController.updateHeaderByBatteryTips(
mBatteryTipPreferenceController.getCurrentBatteryTip(), mBatteryInfo);
}
@Override
- public void onLoaderReset(Loader<List<BatteryTip>> loader) {
-
- }
+ public void onLoaderReset(Loader<List<BatteryTip>> loader) {}
};
@Override
@@ -170,10 +158,11 @@
@Override
public void onResume() {
super.onResume();
- getContentResolver().registerContentObserver(
- Global.getUriFor(Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
- false,
- mSettingsObserver);
+ getContentResolver()
+ .registerContentObserver(
+ Global.getUriFor(Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
+ false,
+ mSettingsObserver);
}
@Override
@@ -213,8 +202,7 @@
}
// Skip BatteryTipLoader if device is rotated or only battery level change
- if (mNeedUpdateBatteryTip
- && refreshType != BatteryUpdateType.BATTERY_LEVEL) {
+ if (mNeedUpdateBatteryTip && refreshType != BatteryUpdateType.BATTERY_LEVEL) {
restartBatteryTipLoader();
} else {
mNeedUpdateBatteryTip = true;
@@ -237,8 +225,7 @@
void initPreference() {
mBatteryUsagePreference = findPreference(KEY_BATTERY_USAGE);
mBatteryUsagePreference.setSummary(getString(R.string.advanced_battery_preference_summary));
- mBatteryUsagePreference.setVisible(
- mPowerFeatureProvider.isBatteryUsageEnabled());
+ mBatteryUsagePreference.setVisible(mPowerFeatureProvider.isBatteryUsageEnabled());
mHelpPreference = findPreference(KEY_BATTERY_ERROR);
mHelpPreference.setVisible(false);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeController.java b/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeController.java
index 286a95f..fcdd673 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeController.java
@@ -42,12 +42,9 @@
private static final Pattern NUMBER_PATTERN = Pattern.compile("[\\d]*[\\.,]?[\\d]+");
private static final Locale IW_LOCALE = new Locale("iw");
- @VisibleForTesting
- Context mPrefContext;
- @VisibleForTesting
- PreferenceCategory mRootPreference;
- @VisibleForTesting
- TextViewPreference mScreenOnTimeTextPreference;
+ @VisibleForTesting Context mPrefContext;
+ @VisibleForTesting PreferenceCategory mRootPreference;
+ @VisibleForTesting TextViewPreference mScreenOnTimeTextPreference;
public ScreenOnTimeController(Context context) {
super(context, ROOT_PREFERENCE_KEY);
@@ -78,19 +75,22 @@
@VisibleForTesting
void showCategoryTitle(String slotTimestamp) {
- mRootPreference.setTitle(slotTimestamp == null
- ? mPrefContext.getString(
- R.string.screen_time_category_last_full_charge)
- : mPrefContext.getString(
- R.string.screen_time_category_for_slot, slotTimestamp));
+ mRootPreference.setTitle(
+ slotTimestamp == null
+ ? mPrefContext.getString(R.string.screen_time_category_last_full_charge)
+ : mPrefContext.getString(
+ R.string.screen_time_category_for_slot, slotTimestamp));
mRootPreference.setVisible(true);
}
@VisibleForTesting
void showScreenOnTimeText(Long screenOnTime) {
final CharSequence timeSequence =
- BatteryUtils.formatElapsedTimeWithoutComma(mPrefContext, (double) screenOnTime,
- /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
+ BatteryUtils.formatElapsedTimeWithoutComma(
+ mPrefContext,
+ (double) screenOnTime,
+ /* withSeconds= */ false,
+ /* collapseTimeUnit= */ false);
mScreenOnTimeTextPreference.setText(
enlargeFontOfNumberIfNeeded(mPrefContext, timeSequence));
mScreenOnTimeTextPreference.setVisible(true);
@@ -107,11 +107,14 @@
return text;
}
- final SpannableString spannableText = new SpannableString(text);
+ final SpannableString spannableText = new SpannableString(text);
final Matcher matcher = NUMBER_PATTERN.matcher(text);
while (matcher.find()) {
- spannableText.setSpan(new AbsoluteSizeSpan(36, true /* dip */), matcher.start(),
- matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ spannableText.setSpan(
+ new AbsoluteSizeSpan(36, true /* dip */),
+ matcher.start(),
+ matcher.end(),
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spannableText;
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java b/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java
index f57c85a..0810158 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java
@@ -36,12 +36,9 @@
private AdapterView.OnItemSelectedListener mOnItemSelectedListener;
- @VisibleForTesting
- Spinner mSpinner;
- @VisibleForTesting
- String[] mItems;
- @VisibleForTesting
- int mSavedSpinnerPosition;
+ @VisibleForTesting Spinner mSpinner;
+ @VisibleForTesting String[] mItems;
+ @VisibleForTesting int mSavedSpinnerPosition;
public SpinnerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -91,8 +88,11 @@
super.onRestoreInstanceState(savedState.getSuperState());
mSavedSpinnerPosition = savedState.getSpinnerPosition();
if (mOnItemSelectedListener != null) {
- mOnItemSelectedListener.onItemSelected(/* parent= */null, /* view= */null,
- savedState.getSpinnerPosition(), /* id= */ 0);
+ mOnItemSelectedListener.onItemSelected(
+ /* parent= */ null,
+ /* view= */ null,
+ savedState.getSpinnerPosition(),
+ /* id= */ 0);
}
Log.d(TAG, "onRestoreInstanceState() spinnerPosition=" + savedState.getSpinnerPosition());
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/TextViewPreference.java b/src/com/android/settings/fuelgauge/batteryusage/TextViewPreference.java
index 22faabb..b20ef39 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/TextViewPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/TextViewPreference.java
@@ -30,8 +30,7 @@
public class TextViewPreference extends Preference {
private static final String TAG = "TextViewPreference";
- @VisibleForTesting
- CharSequence mText;
+ @VisibleForTesting CharSequence mText;
public TextViewPreference(Context context, AttributeSet attrs) {
super(context, attrs);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BatteryUsageLogUtils.java b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BatteryUsageLogUtils.java
index cb2f394..4017131 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BatteryUsageLogUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BatteryUsageLogUtils.java
@@ -25,6 +25,7 @@
import com.android.settings.fuelgauge.BatteryUsageHistoricalLogEntry.Action;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
+
import com.google.common.annotations.VisibleForTesting;
import java.io.PrintWriter;
@@ -62,16 +63,13 @@
final String loggingContent =
Base64.encodeToString(newLogBuilder.build().toByteArray(), Base64.DEFAULT);
- sharedPreferences
- .edit()
- .putString(LOGS_KEY, loggingContent)
- .apply();
+ sharedPreferences.edit().putString(LOGS_KEY, loggingContent).apply();
}
/** Prints the historical log that has previously been stored by this utility. */
public static void printHistoricalLog(Context context, PrintWriter writer) {
- final BatteryUsageHistoricalLog existingLog = parseLogFromString(
- getSharedPreferences(context).getString(LOGS_KEY, ""));
+ final BatteryUsageHistoricalLog existingLog =
+ parseLogFromString(getSharedPreferences(context).getString(LOGS_KEY, ""));
final List<BatteryUsageHistoricalLogEntry> logEntryList = existingLog.getLogEntryList();
if (logEntryList.isEmpty()) {
writer.println("\tnothing to dump");
@@ -92,9 +90,10 @@
}
private static String toString(BatteryUsageHistoricalLogEntry entry) {
- final StringBuilder builder = new StringBuilder("\t")
- .append(ConvertUtils.utcToLocalTimeForLogging(entry.getTimestamp()))
- .append(" " + entry.getAction());
+ final StringBuilder builder =
+ new StringBuilder("\t")
+ .append(ConvertUtils.utcToLocalTimeForLogging(entry.getTimestamp()))
+ .append(" " + entry.getAction());
final String description = entry.getActionDescription();
if (description != null && !description.isEmpty()) {
builder.append(" " + description);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java
index 4c42327..60d7314 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java
@@ -79,11 +79,7 @@
}
@Override
- public int update(
- Uri uri,
- ContentValues values,
- String selection,
- String[] selectionArgs) {
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException("unsupported!");
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java b/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java
index 6d5082c..b461d20 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java
@@ -48,11 +48,8 @@
DatabaseUtils.dump(context, writer);
writer.flush();
final BatteryStateDao dao =
- BatteryStateDatabase
- .getInstance(context.getApplicationContext())
- .batteryStateDao();
- final long timeOffset =
- Clock.systemUTC().millis() - DUMP_TIME_OFFSET.toMillis();
+ BatteryStateDatabase.getInstance(context.getApplicationContext()).batteryStateDao();
+ final long timeOffset = Clock.systemUTC().millis() - DUMP_TIME_OFFSET.toMillis();
// Gets all distinct timestamps.
final List<Long> timestamps = dao.getDistinctTimestamps(timeOffset);
@@ -64,26 +61,27 @@
return;
}
// Dumps all distinct timestamps.
- timestamps.forEach(timestamp -> {
- final String formattedTimestamp = ConvertUtils.utcToLocalTimeForLogging(timestamp);
- writer.println("\t" + formattedTimestamp);
- Log.w(TAG, "\t" + formattedTimestamp);
- });
+ timestamps.forEach(
+ timestamp -> {
+ final String formattedTimestamp =
+ ConvertUtils.utcToLocalTimeForLogging(timestamp);
+ writer.println("\t" + formattedTimestamp);
+ Log.w(TAG, "\t" + formattedTimestamp);
+ });
writer.flush();
- final List<BatteryState> stateList = dao.getAllAfter(
- Clock.systemUTC().millis() - DUMP_TIME_OFFSET_FOR_ENTRY.toMillis());
+ final List<BatteryState> stateList =
+ dao.getAllAfter(Clock.systemUTC().millis() - DUMP_TIME_OFFSET_FOR_ENTRY.toMillis());
stateList.stream().forEach(state -> writer.println(state));
}
static void dumpAppUsageDatabaseHist(Context context, PrintWriter writer) {
final AppUsageEventDao dao =
- BatteryStateDatabase
- .getInstance(context.getApplicationContext())
+ BatteryStateDatabase.getInstance(context.getApplicationContext())
.appUsageEventDao();
writer.println("\n\tApp DatabaseHistory:");
- final List<AppUsageEventEntity> eventList = dao.getAllAfter(
- Clock.systemUTC().millis() - DUMP_TIME_OFFSET_FOR_ENTRY.toMillis());
+ final List<AppUsageEventEntity> eventList =
+ dao.getAllAfter(Clock.systemUTC().millis() - DUMP_TIME_OFFSET_FOR_ENTRY.toMillis());
eventList.stream().forEach(event -> writer.println(event));
writer.flush();
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDao.java b/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDao.java
index 19360f4..d220b15 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDao.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDao.java
@@ -42,8 +42,9 @@
List<AppUsageEventEntity> getAllAfter(long timestamp);
/** Gets the {@link Cursor} of all recorded data after a specific timestamp of the users. */
- @Query("SELECT * FROM AppUsageEventEntity WHERE timestamp >= :timestamp"
- + " AND userId IN (:userIds) ORDER BY timestamp ASC")
+ @Query(
+ "SELECT * FROM AppUsageEventEntity WHERE timestamp >= :timestamp"
+ + " AND userId IN (:userIds) ORDER BY timestamp ASC")
Cursor getAllForUsersAfter(List<Long> userIds, long timestamp);
/** Gets the {@link Cursor} of the latest timestamp of the specific user. */
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntity.java b/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntity.java
index c08c735..f0cc71d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntity.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntity.java
@@ -32,6 +32,7 @@
public class AppUsageEventEntity {
/** Keys for accessing {@link ContentValues}. */
public static final String KEY_UID = "uid";
+
public static final String KEY_USER_ID = "userId";
public static final String KEY_TIMESTAMP = "timestamp";
public static final String KEY_APP_USAGE_EVENT_TYPE = "appUsageEventType";
@@ -81,14 +82,28 @@
@Override
public String toString() {
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp);
- final StringBuilder builder = new StringBuilder()
- .append("\nAppUsageEvent{")
- .append(String.format(Locale.US,
- "\n\tpackage=%s|uid=%d|userId=%d", packageName, uid, userId))
- .append(String.format(Locale.US, "\n\ttimestamp=%s|eventType=%d|instanceId=%d",
- recordAtDateTime, appUsageEventType, instanceId))
- .append(String.format(Locale.US, "\n\ttaskRootPackageName=%s",
- taskRootPackageName));
+ final StringBuilder builder =
+ new StringBuilder()
+ .append("\nAppUsageEvent{")
+ .append(
+ String.format(
+ Locale.US,
+ "\n\tpackage=%s|uid=%d|userId=%d",
+ packageName,
+ uid,
+ userId))
+ .append(
+ String.format(
+ Locale.US,
+ "\n\ttimestamp=%s|eventType=%d|instanceId=%d",
+ recordAtDateTime,
+ appUsageEventType,
+ instanceId))
+ .append(
+ String.format(
+ Locale.US,
+ "\n\ttaskRootPackageName=%s",
+ taskRootPackageName));
return builder.toString();
}
@@ -111,8 +126,7 @@
builder.setPackageName(contentValues.getAsString(KEY_PACKAGE_NAME));
}
if (contentValues.containsKey(KEY_INSTANCE_ID)) {
- builder.setInstanceId(
- contentValues.getAsInteger(KEY_INSTANCE_ID));
+ builder.setInstanceId(contentValues.getAsInteger(KEY_INSTANCE_ID));
}
if (contentValues.containsKey(KEY_TASK_ROOT_PACKAGE_NAME)) {
builder.setTaskRootPackageName(contentValues.getAsString(KEY_TASK_ROOT_PACKAGE_NAME));
@@ -198,6 +212,4 @@
private Builder() {}
}
-
-
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java
index 0a6de71..f1b2d66 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDao.java
@@ -37,14 +37,16 @@
List<BatteryEventEntity> getAll();
/** Gets the {@link Cursor} of the last full charge time . */
- @Query("SELECT MAX(timestamp) FROM BatteryEventEntity"
- + " WHERE batteryEventType = 3") // BatteryEventType.FULL_CHARGED = 3
+ @Query(
+ "SELECT MAX(timestamp) FROM BatteryEventEntity"
+ + " WHERE batteryEventType = 3") // BatteryEventType.FULL_CHARGED = 3
Cursor getLastFullChargeTimestamp();
/** Gets the {@link Cursor} of all recorded data after a specific timestamp. */
- @Query("SELECT * FROM BatteryEventEntity"
- + " WHERE timestamp > :timestamp AND batteryEventType IN (:batteryEventTypes)"
- + " ORDER BY timestamp DESC")
+ @Query(
+ "SELECT * FROM BatteryEventEntity"
+ + " WHERE timestamp >= :timestamp AND batteryEventType IN (:batteryEventTypes)"
+ + " ORDER BY timestamp DESC")
Cursor getAllAfter(long timestamp, List<Integer> batteryEventTypes);
/** Deletes all recorded data before a specific timestamp. */
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java
index 66cadda..cee0fec 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntity.java
@@ -32,6 +32,7 @@
public class BatteryEventEntity {
/** Keys for accessing {@link ContentValues}. */
public static final String KEY_TIMESTAMP = "timestamp";
+
public static final String KEY_BATTERY_EVENT_TYPE = "batteryEventType";
public static final String KEY_BATTERY_LEVEL = "batteryLevel";
@@ -43,9 +44,7 @@
public final int batteryLevel;
public BatteryEventEntity(
- final long timestamp,
- final int batteryEventType,
- final int batteryLevel) {
+ final long timestamp, final int batteryEventType, final int batteryLevel) {
this.timestamp = timestamp;
this.batteryEventType = batteryEventType;
this.batteryLevel = batteryLevel;
@@ -64,12 +63,17 @@
@Override
public String toString() {
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp);
- final StringBuilder builder = new StringBuilder()
- .append("\nBatteryEvent{")
- .append(String.format(Locale.US,
- "\n\ttimestamp=%s|batteryEventType=%d|batteryLevel=%d",
- recordAtDateTime, batteryEventType, batteryLevel))
- .append("\n}");
+ final StringBuilder builder =
+ new StringBuilder()
+ .append("\nBatteryEvent{")
+ .append(
+ String.format(
+ Locale.US,
+ "\n\ttimestamp=%s|batteryEventType=%d|batteryLevel=%d",
+ recordAtDateTime,
+ batteryEventType,
+ batteryLevel))
+ .append("\n}");
return builder.toString();
}
@@ -122,10 +126,7 @@
/** Builds the {@link BatteryEventEntity}. */
public BatteryEventEntity build() {
- return new BatteryEventEntity(
- mTimestamp,
- mBatteryEventType,
- mBatteryLevel);
+ return new BatteryEventEntity(mTimestamp, mBatteryEventType, mBatteryLevel);
}
private Builder() {}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java
index 190c274..8e1280d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java
@@ -43,15 +43,17 @@
public final int consumerType;
public final boolean isFullChargeCycleStart;
public final String batteryInformation;
+
/**
* This field is filled only when build type is "userdebug".
- * For now, Java Proto Lite is recommended by the Android team as the more lightweight solution
- * designed specifically for mobile apps to process protobuf.
- * However, converting protobuf to string through Java Proto Lite needs to parse it into a bytes
- * field first, which leads to the strings saved in our database are encoded and hard to
- * understand.
- * To make it easier to debug in our daily development, this field is added.
- * It will not be filled for the real users.
+ *
+ * <p>For now, Java Proto Lite is recommended by the Android team as the more lightweight
+ * solution designed specifically for mobile apps to process protobuf. However, converting
+ * protobuf to string through Java Proto Lite needs to parse it into a bytes field first, which
+ * leads to the strings saved in our database are encoded and hard to understand.
+ *
+ * <p>To make it easier to debug in our daily development, this field is added. It will not be
+ * filled for the real users.
*/
public final String batteryInformationDebug;
@@ -91,18 +93,28 @@
final BatteryInformation batteryInformationInstance =
BatteryUtils.parseProtoFromString(
batteryInformation, BatteryInformation.getDefaultInstance());
- final StringBuilder builder = new StringBuilder()
- .append("\nBatteryState{")
- .append(String.format(Locale.US,
- "\n\tpackage=%s|uid=%d|userId=%d", packageName, uid, userId))
- .append(String.format(Locale.US, "\n\ttimestamp=%s|consumer=%d|isStart=%b",
- recordAtDateTime, consumerType, isFullChargeCycleStart))
- .append(String.format(Locale.US, "\n\tbatteryInfo="))
- .append(batteryInformationInstance.toString());
+ final StringBuilder builder =
+ new StringBuilder()
+ .append("\nBatteryState{")
+ .append(
+ String.format(
+ Locale.US,
+ "\n\tpackage=%s|uid=%d|userId=%d",
+ packageName,
+ uid,
+ userId))
+ .append(
+ String.format(
+ Locale.US,
+ "\n\ttimestamp=%s|consumer=%d|isStart=%b",
+ recordAtDateTime,
+ consumerType,
+ isFullChargeCycleStart))
+ .append(String.format(Locale.US, "\n\tbatteryInfo="))
+ .append(batteryInformationInstance.toString());
return builder.toString();
}
-
/** Creates new {@link BatteryState} from {@link ContentValues}. */
public static BatteryState create(ContentValues contentValues) {
Builder builder = BatteryState.newBuilder();
@@ -122,8 +134,7 @@
builder.setConsumerType(contentValues.getAsInteger("consumerType"));
}
if (contentValues.containsKey("isFullChargeCycleStart")) {
- builder.setIsFullChargeCycleStart(
- contentValues.getAsBoolean("isFullChargeCycleStart"));
+ builder.setIsFullChargeCycleStart(contentValues.getAsBoolean("isFullChargeCycleStart"));
}
if (contentValues.containsKey("batteryInformation")) {
builder.setBatteryInformation(contentValues.getAsString("batteryInformation"));
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java
index 28a0012..7504775 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java
@@ -25,8 +25,12 @@
/** A {@link RoomDatabase} for battery usage states history. */
@Database(
- entities = {AppUsageEventEntity.class, BatteryEventEntity.class, BatteryState.class,
- BatteryUsageSlotEntity.class},
+ entities = {
+ AppUsageEventEntity.class,
+ BatteryEventEntity.class,
+ BatteryState.class,
+ BatteryUsageSlotEntity.class
+ },
version = 1)
public abstract class BatteryStateDatabase extends RoomDatabase {
private static final String TAG = "BatteryStateDatabase";
@@ -35,10 +39,13 @@
/** Provides DAO for app usage event table. */
public abstract AppUsageEventDao appUsageEventDao();
+
/** Provides DAO for battery event table. */
public abstract BatteryEventDao batteryEventDao();
+
/** Provides DAO for battery state table. */
public abstract BatteryStateDao batteryStateDao();
+
/** Provides DAO for battery usage slot table. */
public abstract BatteryUsageSlotDao batteryUsageSlotDao();
@@ -46,8 +53,7 @@
public static BatteryStateDatabase getInstance(Context context) {
if (sBatteryStateDatabase == null) {
sBatteryStateDatabase =
- Room.databaseBuilder(
- context, BatteryStateDatabase.class, "battery-usage-db-v9")
+ Room.databaseBuilder(context, BatteryStateDatabase.class, "battery-usage-db-v9")
// Allows accessing data in the main thread for dumping bugreport.
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDao.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDao.java
index a695f6a..b1900c7 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDao.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDao.java
@@ -37,8 +37,9 @@
List<BatteryUsageSlotEntity> getAll();
/** Gets the {@link Cursor} of all recorded data after a specific timestamp. */
- @Query("SELECT * FROM BatteryUsageSlotEntity WHERE timestamp >= :timestamp"
- + " ORDER BY timestamp ASC")
+ @Query(
+ "SELECT * FROM BatteryUsageSlotEntity WHERE timestamp >= :timestamp"
+ + " ORDER BY timestamp ASC")
Cursor getAllAfter(long timestamp);
/** Deletes all recorded data before a specific timestamp. */
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntity.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntity.java
index c2d5631..16a01b4 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntity.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntity.java
@@ -32,6 +32,7 @@
public class BatteryUsageSlotEntity {
/** Keys for accessing {@link ContentValues}. */
public static final String KEY_TIMESTAMP = "timestamp";
+
public static final String KEY_BATTERY_USAGE_SLOT = "batteryUsageSlot";
@PrimaryKey(autoGenerate = true)
@@ -58,11 +59,16 @@
@Override
public String toString() {
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp);
- final StringBuilder builder = new StringBuilder()
- .append("\nBatteryUsageSlot{")
- .append(String.format(Locale.US, "\n\ttimestamp=%s|batteryUsageSlot=%s",
- recordAtDateTime, batteryUsageSlot))
- .append("\n}");
+ final StringBuilder builder =
+ new StringBuilder()
+ .append("\nBatteryUsageSlot{")
+ .append(
+ String.format(
+ Locale.US,
+ "\n\ttimestamp=%s|batteryUsageSlot=%s",
+ recordAtDateTime,
+ batteryUsageSlot))
+ .append("\n}");
return builder.toString();
}
diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
new file mode 100644
index 0000000..be72e56
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 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.datasaver;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.NetworkPolicyManager;
+
+import androidx.annotation.VisibleForTesting;
+
+/** A class to dynamically manage per apps {@link NetworkPolicyManager} POLICY_ flags. */
+public final class DynamicDenylistManager {
+
+ private static final String TAG = "DynamicDenylistManager";
+ private static final String PREF_KEY_MANUAL_DENY = "manual_denylist_preference";
+ private static final String PREF_KEY_DYNAMIC_DENY = "dynamic_denylist_preference";
+
+ private final Context mContext;
+ private final NetworkPolicyManager mNetworkPolicyManager;
+
+ private static DynamicDenylistManager sInstance;
+
+ /** @return a DynamicDenylistManager object */
+ public static DynamicDenylistManager getInstance(Context context) {
+ synchronized (DynamicDenylistManager.class) {
+ if (sInstance == null) {
+ sInstance = new DynamicDenylistManager(context);
+ }
+ return sInstance;
+ }
+ }
+
+ DynamicDenylistManager(Context context) {
+ mContext = context.getApplicationContext();
+ mNetworkPolicyManager = NetworkPolicyManager.from(mContext);
+ }
+
+ /** Update the target uid policy in {@link #getManualDenylistPref()}. */
+ public void updateManualDenylist(String uid, int policy) {
+ if (policy != NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND) {
+ getManualDenylistPref().edit().remove(uid).apply();
+ } else {
+ getManualDenylistPref().edit().putInt(uid, policy).apply();
+ }
+ }
+
+ /** Return true if the target uid is in {@link #getManualDenylistPref()}. */
+ public boolean isInManualDenylist(String uid) {
+ return getManualDenylistPref().contains(uid);
+ }
+
+ /** Clear all data in {@link #getManualDenylistPref()} */
+ public void clearManualDenylistPref() {
+ getManualDenylistPref().edit().clear().apply();
+ }
+
+ /** Clear all data in {@link #getDynamicDenylistPref()} */
+ public void clearDynamicDenylistPref() {
+ getDynamicDenylistPref().edit().clear().apply();
+ }
+
+ @VisibleForTesting
+ SharedPreferences getManualDenylistPref() {
+ return mContext.getSharedPreferences(PREF_KEY_MANUAL_DENY, Context.MODE_PRIVATE);
+ }
+
+ @VisibleForTesting
+ SharedPreferences getDynamicDenylistPref() {
+ return mContext.getSharedPreferences(PREF_KEY_DYNAMIC_DENY, Context.MODE_PRIVATE);
+ }
+}
diff --git a/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java b/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java
index d79db43..fa7b372 100644
--- a/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java
+++ b/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java
@@ -21,6 +21,7 @@
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.hardware.input.InputManager;
@@ -47,6 +48,7 @@
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.Utils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList;
import java.util.Arrays;
@@ -68,6 +70,7 @@
private TextView mLeftBracket;
private TextView mRightBracket;
private ImageView mActionKeyIcon;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
private List<int[]> mRemappableKeyList =
new ArrayList<>(Arrays.asList(
@@ -92,6 +95,7 @@
mActivity = getActivity();
FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
+ mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
mFeatureProvider = featureFactory.getKeyboardSettingsFeatureProvider();
InputManager inputManager = mActivity.getSystemService(InputManager.class);
mKeyDefaultName = getArguments().getString(DEFAULT_KEY);
@@ -139,6 +143,7 @@
doneButton.setOnClickListener(v -> {
String selectedItem = modifierKeys.get(adapter.getCurrentItem());
Spannable itemSummary;
+ logMetricsForRemapping(selectedItem);
if (selectedItem.equals(mKeyDefaultName)) {
itemSummary = new SpannableString(
mActivity.getString(R.string.modifier_keys_default_summary));
@@ -189,6 +194,28 @@
return modifierKeyDialog;
}
+ private void logMetricsForRemapping(String selectedItem) {
+ if (mKeyDefaultName.equals("Caps lock")) {
+ mMetricsFeatureProvider.action(
+ mActivity, SettingsEnums.ACTION_FROM_CAPS_LOCK_TO, selectedItem);
+ }
+
+ if (mKeyDefaultName.equals("Ctrl")) {
+ mMetricsFeatureProvider.action(
+ mActivity, SettingsEnums.ACTION_FROM_CTRL_TO, selectedItem);
+ }
+
+ if (mKeyDefaultName.equals("Action key")) {
+ mMetricsFeatureProvider.action(
+ mActivity, SettingsEnums.ACTION_FROM_ACTION_KEY_TO, selectedItem);
+ }
+
+ if (mKeyDefaultName.equals("Alt")) {
+ mMetricsFeatureProvider.action(
+ mActivity, SettingsEnums.ACTION_FROM_ALT_TO, selectedItem);
+ }
+ }
+
private void setInitialFocusItem(
List<String> modifierKeys, ModifierKeyAdapter adapter) {
if (modifierKeys.indexOf(mKeyFocus) == -1) {
diff --git a/src/com/android/settings/inputmethod/ModifierKeysResetDialogFragment.java b/src/com/android/settings/inputmethod/ModifierKeysResetDialogFragment.java
index 070968c..d49fbd1 100644
--- a/src/com/android/settings/inputmethod/ModifierKeysResetDialogFragment.java
+++ b/src/com/android/settings/inputmethod/ModifierKeysResetDialogFragment.java
@@ -21,6 +21,7 @@
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
+import android.app.settings.SettingsEnums;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -31,6 +32,8 @@
import androidx.fragment.app.DialogFragment;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class ModifierKeysResetDialogFragment extends DialogFragment {
@@ -39,6 +42,8 @@
private static final String MODIFIER_KEYS_META = "modifier_keys_meta";
private static final String MODIFIER_KEYS_ALT = "modifier_keys_alt";
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
private String[] mKeys = {
MODIFIER_KEYS_CAPS_LOCK,
MODIFIER_KEYS_CTRL,
@@ -52,6 +57,7 @@
super.onCreateDialog(savedInstanceState);
Activity activity = getActivity();
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
InputManager inputManager = activity.getSystemService(InputManager.class);
View dialoglayout =
LayoutInflater.from(activity).inflate(R.layout.modifier_key_reset_dialog, null);
@@ -61,6 +67,7 @@
Button restoreButton = dialoglayout.findViewById(R.id.modifier_key_reset_restore_button);
restoreButton.setOnClickListener(v -> {
+ mMetricsFeatureProvider.action(activity, SettingsEnums.ACTION_CLEAR_REMAPPINGS);
inputManager.clearAllModifierKeyRemappings();
dismiss();
activity.recreate();
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
index e63d7d1..879f134 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
@@ -16,6 +16,7 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
@@ -30,7 +31,9 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -53,13 +56,16 @@
private KeyboardLayout[] mKeyboardLayouts;
private PreferenceScreen mScreen;
private String mPreviousSelection;
+ private String mFinalSelectedLayout;
private String mLayout;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
public NewKeyboardLayoutPickerController(Context context, String key) {
super(context, key);
mIm = context.getSystemService(InputManager.class);
mInputDeviceId = -1;
mPreferenceMap = new HashMap<>();
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
public void initialize(Fragment parent) {
@@ -74,6 +80,7 @@
mInputMethodSubtype =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE);
mLayout = getSelectedLayoutLabel();
+ mFinalSelectedLayout = mLayout;
mKeyboardLayouts = mIm.getKeyboardLayoutListForInputDevice(
mInputDeviceIdentifier, mUserId, mInputMethodInfo, mInputMethodSubtype);
parent.getActivity().setTitle(mTitle);
@@ -92,6 +99,11 @@
@Override
public void onStop() {
+ if (!mLayout.equals(mFinalSelectedLayout)) {
+ String change = "From:" + mLayout + ", to:" + mFinalSelectedLayout;
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_PK_LAYOUT_CHANGED, change);
+ }
mIm.unregisterInputDeviceListener(this);
mInputDeviceId = -1;
}
@@ -122,6 +134,7 @@
}
setLayout(pref);
mPreviousSelection = preference.getKey();
+ mFinalSelectedLayout = pref.getTitle().toString();
return true;
}
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index ea2d4b9..1ca9ee6 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -108,6 +108,7 @@
SHOW_VIRTUAL_KEYBOARD_SWITCH));
FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
+ mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
mFeatureProvider = featureFactory.getKeyboardSettingsFeatureProvider();
mSupportsFirmwareUpdate = mFeatureProvider.supportsFirmwareUpdate();
if (mSupportsFirmwareUpdate) {
@@ -124,6 +125,10 @@
KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
int intentFromWhere =
activity.getIntent().getIntExtra(android.provider.Settings.EXTRA_ENTRYPOINT, -1);
+ if (intentFromWhere != -1) {
+ mMetricsFeatureProvider.action(
+ getContext(), SettingsEnums.ACTION_OPEN_PK_SETTINGS_FROM, intentFromWhere);
+ }
if (inputDeviceIdentifier != null) {
mAutoInputDeviceIdentifier = inputDeviceIdentifier;
}
@@ -254,6 +259,16 @@
});
}
category.addPreference(pref);
+ StringBuilder vendorAndProductId = new StringBuilder();
+ String vendorId = String.valueOf(hardKeyboardDeviceInfo.mVendorId);
+ String productId = String.valueOf(hardKeyboardDeviceInfo.mProductId);
+ vendorAndProductId.append(vendorId);
+ vendorAndProductId.append("-");
+ vendorAndProductId.append(productId);
+ mMetricsFeatureProvider.action(
+ getContext(),
+ SettingsEnums.ACTION_USE_SPECIFIC_KEYBOARD,
+ vendorAndProductId.toString());
}
mKeyboardAssistanceCategory.setOrder(1);
preferenceScreen.addPreference(mKeyboardAssistanceCategory);
@@ -374,7 +389,9 @@
device.getName(),
device.getIdentifier(),
getLayoutLabel(device, context, im),
- device.getBluetoothAddress()));
+ device.getBluetoothAddress(),
+ device.getVendorId(),
+ device.getProductId()));
}
// We intentionally don't reuse Comparator because Collator may not be thread-safe.
@@ -403,16 +420,24 @@
public final String mLayoutLabel;
@Nullable
public final String mBluetoothAddress;
+ @NonNull
+ public final int mVendorId;
+ @NonNull
+ public final int mProductId;
public HardKeyboardDeviceInfo(
@Nullable String deviceName,
@NonNull InputDeviceIdentifier deviceIdentifier,
@NonNull String layoutLabel,
- @Nullable String bluetoothAddress) {
+ @Nullable String bluetoothAddress,
+ @NonNull int vendorId,
+ @NonNull int productId) {
mDeviceName = TextUtils.emptyIfNull(deviceName);
mDeviceIdentifier = deviceIdentifier;
mLayoutLabel = layoutLabel;
mBluetoothAddress = bluetoothAddress;
+ mVendorId = vendorId;
+ mProductId = productId;
}
@Override
diff --git a/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java b/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java
index bbe65c1..648a3e6 100644
--- a/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.util.FeatureFlagUtils;
@@ -23,6 +24,8 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.ButtonPreference;
public class TouchGesturesButtonPreferenceController extends BasePreferenceController {
@@ -33,9 +36,11 @@
private static final String GESTURE_DIALOG_TAG = "GESTURE_DIALOG_TAG";
private Fragment mParent;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
public TouchGesturesButtonPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
public void setFragment(Fragment parent) {
@@ -67,6 +72,7 @@
}
private void showTouchpadGestureEducation() {
+ mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_LEARN_TOUCHPAD_GESTURE_CLICK);
TrackpadGestureDialogFragment fragment = new TrackpadGestureDialogFragment();
fragment.setTargetFragment(mParent, 0);
fragment.show(mParent.getActivity().getSupportFragmentManager(), GESTURE_DIALOG_TAG);
diff --git a/src/com/android/settings/inputmethod/TrackpadBottomPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadBottomPreferenceController.java
index 5133d04..d410a1b 100644
--- a/src/com/android/settings/inputmethod/TrackpadBottomPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadBottomPreferenceController.java
@@ -16,16 +16,22 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputSettings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadBottomPreferenceController extends TogglePreferenceController {
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadBottomPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -36,6 +42,8 @@
@Override
public boolean setChecked(boolean isChecked) {
InputSettings.setTouchpadRightClickZone(mContext, isChecked);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_BOTTOM_RIGHT_TAP_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceController.java
index 017689d..36fb0c0 100644
--- a/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceController.java
@@ -16,18 +16,24 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadGoBackPreferenceController extends TogglePreferenceController {
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_BACK_ENABLED;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadGoBackPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -38,6 +44,8 @@
@Override
public boolean setChecked(boolean isChecked) {
Settings.Secure.putInt(mContext.getContentResolver(), SETTING_KEY, isChecked ? 1 : 0);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_GO_BACK_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceController.java b/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceController.java
index 18699e3..dbc706e 100644
--- a/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceController.java
@@ -16,18 +16,24 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadGoHomePreferenceController extends TogglePreferenceController {
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_HOME_ENABLED;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadGoHomePreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -38,6 +44,8 @@
@Override
public boolean setChecked(boolean isChecked) {
Settings.Secure.putInt(mContext.getContentResolver(), SETTING_KEY, isChecked ? 1 : 0);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_GO_HOME_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceController.java
index 21f04a3..d430e4d 100644
--- a/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceController.java
@@ -16,18 +16,24 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadNotificationsPreferenceController extends TogglePreferenceController {
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_NOTIFICATION_ENABLED;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadNotificationsPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -38,6 +44,8 @@
@Override
public boolean setChecked(boolean isChecked) {
Settings.Secure.putInt(mContext.getContentResolver(), SETTING_KEY, isChecked ? 1 : 0);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_NOTIFICATION_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceController.java
index 71b4119..d024546 100644
--- a/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceController.java
@@ -16,20 +16,25 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputSettings;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.SliderPreferenceController;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.SeekBarPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadPointerSpeedPreferenceController extends SliderPreferenceController {
private SeekBarPreference mPreference;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
public TrackpadPointerSpeedPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -53,6 +58,8 @@
return false;
}
InputSettings.setTouchpadPointerSpeed(mContext, position);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_POINTER_SPEED_CHANGED, position);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceController.java
index eab2b33..44a56e7 100644
--- a/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceController.java
@@ -16,18 +16,24 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadRecentAppsPreferenceController extends TogglePreferenceController {
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_OVERVIEW_ENABLED;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadRecentAppsPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -38,6 +44,8 @@
@Override
public boolean setChecked(boolean isChecked) {
Settings.Secure.putInt(mContext.getContentResolver(), SETTING_KEY, isChecked ? 1 : 0);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_RECENT_APPS_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
index 10d3013..042126d 100644
--- a/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
@@ -16,16 +16,22 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputSettings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadReverseScrollingPreferenceController extends TogglePreferenceController {
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadReverseScrollingPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -36,6 +42,8 @@
@Override
public boolean setChecked(boolean isChecked) {
InputSettings.setTouchpadNaturalScrolling(mContext, !isChecked);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_REVERSE_SCROLLING_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceController.java
index 84de64e..2b11411 100644
--- a/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceController.java
@@ -16,18 +16,24 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadSwitchAppsPreferenceController extends TogglePreferenceController {
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_QUICK_SWITCH_ENABLED;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadSwitchAppsPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -38,6 +44,8 @@
@Override
public boolean setChecked(boolean isChecked) {
Settings.Secure.putInt(mContext.getContentResolver(), SETTING_KEY, isChecked ? 1 : 0);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_SWITCH_APPS_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceController.java
index 8655307..f78c81e 100644
--- a/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceController.java
@@ -16,16 +16,22 @@
package com.android.settings.inputmethod;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputSettings;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class TrackpadTapToClickPreferenceController extends TogglePreferenceController {
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
public TrackpadTapToClickPreferenceController(Context context, String key) {
super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -36,6 +42,8 @@
@Override
public boolean setChecked(boolean isChecked) {
InputSettings.setTouchpadTapToClick(mContext, isChecked);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_TAP_TO_CLICK_CHANGED, isChecked);
return true;
}
diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
index 194a08f..6706c6d 100644
--- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java
+++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
@@ -23,6 +23,7 @@
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.app.settings.SettingsEnums;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
@@ -45,12 +46,18 @@
import com.android.settings.applications.AppLocaleUtil;
import com.android.settings.applications.appinfo.AppLocaleDetails;
import com.android.settings.core.SettingsBaseActivity;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class AppLocalePickerActivity extends SettingsBaseActivity
implements LocalePickerWithRegion.LocaleSelectedListener, MenuItem.OnActionExpandListener {
private static final String TAG = AppLocalePickerActivity.class.getSimpleName();
private static final String CHANNEL_ID_SUGGESTION = "suggestion";
private static final String CHANNEL_ID_SUGGESTION_TO_USER = "Locale suggestion";
+ private static final int SIM_LOCALE = 1 << 0;
+ private static final int SYSTEM_LOCALE = 1 << 1;
+ private static final int APP_LOCALE = 1 << 2;
+ private static final int IME_LOCALE = 1 << 3;
static final String EXTRA_APP_LOCALE = "app_locale";
static final String EXTRA_NOTIFICATION_ID = "notification_id";
@@ -59,6 +66,7 @@
private AppLocaleDetails mAppLocaleDetails;
private View mAppLocaleDetailContainer;
private NotificationController mNotificationController;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -84,6 +92,7 @@
setTitle(R.string.app_locale_picker_title);
getActionBar().setDisplayHomeAsUpEnabled(true);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
mNotificationController = NotificationController.getInstance(this);
mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker(
@@ -113,6 +122,7 @@
if (localeInfo == null || localeInfo.getLocale() == null || localeInfo.isSystemLocale()) {
setAppDefaultLocale("");
} else {
+ logLocaleSource(localeInfo);
setAppDefaultLocale(localeInfo.getLocale().toLanguageTag());
broadcastAppLocaleChange(localeInfo);
}
@@ -268,4 +278,32 @@
return false;
}
+
+ private void logLocaleSource(LocaleStore.LocaleInfo localeInfo) {
+ if (!localeInfo.isSuggested() || localeInfo.isAppCurrentLocale()) {
+ return;
+ }
+ int localeSource = 0;
+ if (hasSuggestionType(localeInfo,
+ LocaleStore.LocaleInfo.SUGGESTION_TYPE_SYSTEM_AVAILABLE_LANGUAGE)) {
+ localeSource |= SYSTEM_LOCALE;
+ }
+ if (hasSuggestionType(localeInfo,
+ LocaleStore.LocaleInfo.SUGGESTION_TYPE_OTHER_APP_LANGUAGE)) {
+ localeSource |= APP_LOCALE;
+ }
+ if (hasSuggestionType(localeInfo, LocaleStore.LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE)) {
+ localeSource |= IME_LOCALE;
+ }
+ if (hasSuggestionType(localeInfo, LocaleStore.LocaleInfo.SUGGESTION_TYPE_SIM)) {
+ localeSource |= SIM_LOCALE;
+ }
+ mMetricsFeatureProvider.action(this,
+ SettingsEnums.ACTION_CHANGE_APP_LANGUAGE_FROM_SUGGESTED, localeSource);
+ }
+
+ private static boolean hasSuggestionType(LocaleStore.LocaleInfo localeInfo,
+ int suggestionType) {
+ return localeInfo.isSuggestionOfType(suggestionType);
+ }
}
diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
index bfe0749..43fc9cf 100644
--- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
+++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
@@ -16,6 +16,7 @@
package com.android.settings.localepicker;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
@@ -38,6 +39,7 @@
import com.android.internal.app.LocalePicker;
import com.android.internal.app.LocaleStore;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.shortcut.ShortcutsUpdateTask;
import java.text.NumberFormat;
@@ -225,6 +227,12 @@
"Negative position in onItemMove %d -> %d", fromPosition, toPosition));
}
+ if (fromPosition != toPosition) {
+ FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
+ .action(mContext, SettingsEnums.ACTION_REORDER_LANGUAGE,
+ mDragLocale.getLocale().toLanguageTag() + " move to " + toPosition);
+ }
+
notifyItemChanged(fromPosition); // to update the numbers
notifyItemChanged(toPosition);
notifyItemMoved(fromPosition, toPosition);
@@ -263,6 +271,9 @@
for (int i = itemCount - 1; i >= 0; i--) {
localeInfo = mFeedItemList.get(i);
if (localeInfo.getChecked()) {
+ FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
+ .action(mContext, SettingsEnums.ACTION_REMOVE_LANGUAGE,
+ localeInfo.getLocale().toLanguageTag());
mFeedItemList.remove(i);
}
}
diff --git a/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java b/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java
index a639c9d..b962b9e 100644
--- a/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java
+++ b/src/com/android/settings/localepicker/LocaleHelperPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.localepicker;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
@@ -24,8 +25,10 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.FooterPreference;
/**
@@ -36,8 +39,11 @@
private static final String KEY_FOOTER_LANGUAGE_PICKER = "footer_languages_picker";
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
+
public LocaleHelperPreferenceController(Context context) {
super(context);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -72,6 +78,7 @@
mContext.getString(R.string.link_locale_picker_footer_learn_more),
mContext.getClass().getName());
if (intent != null) {
+ mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_LANGUAGES_LEARN_MORE);
mContext.startActivity(intent);
} else {
Log.w(TAG, "HelpIntent is null");
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index bdda549..28f066a 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -224,6 +224,8 @@
localeInfo = mayAppendUnicodeTags(localeInfo, preferencesTags);
mAdapter.addLocale(localeInfo);
updateVisibilityOfRemoveMenu();
+ mMetricsFeatureProvider.action(getContext(), SettingsEnums.ACTION_ADD_LANGUAGE,
+ localeInfo.getLocale().toLanguageTag());
} else if (requestCode == DIALOG_CONFIRM_SYSTEM_DEFAULT) {
localeInfo = mAdapter.getFeedItemList().get(0);
if (resultCode == Activity.RESULT_OK) {
diff --git a/src/com/android/settings/network/EnableMultiSimSidecar.java b/src/com/android/settings/network/EnableMultiSimSidecar.java
index aefd55f..6bc38ef 100644
--- a/src/com/android/settings/network/EnableMultiSimSidecar.java
+++ b/src/com/android/settings/network/EnableMultiSimSidecar.java
@@ -171,8 +171,11 @@
}
int activePorts = 0;
for (UiccSlotInfo slotInfo : slotsInfo) {
+ if (slotInfo == null) {
+ continue;
+ }
for (UiccPortInfo portInfo : slotInfo.getPorts()) {
- if (slotInfo != null && portInfo.isActive()) {
+ if (portInfo.isActive()) {
activePorts++;
}
}
@@ -189,8 +192,11 @@
}
Set<Integer> activeRemovableLogicalSlotIds = new ArraySet<>();
for (UiccSlotInfo info : infos) {
- for (UiccPortInfo portInfo :info.getPorts()) {
- if (info != null && portInfo.isActive() && info.isRemovable()) {
+ if (info == null) {
+ continue;
+ }
+ for (UiccPortInfo portInfo : info.getPorts()) {
+ if (portInfo.isActive() && info.isRemovable()) {
activeRemovableLogicalSlotIds.add(portInfo.getLogicalSlotIndex());
}
}
diff --git a/src/com/android/settings/network/MobileDataEnabledFlow.kt b/src/com/android/settings/network/MobileDataEnabledFlow.kt
new file mode 100644
index 0000000..2342377
--- /dev/null
+++ b/src/com/android/settings/network/MobileDataEnabledFlow.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2023 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.provider.Settings
+import android.telephony.SubscriptionManager
+import com.android.settingslib.spaprivileged.settingsprovider.settingsGlobalChangeFlow
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.merge
+
+/**
+ * Flow for mobile data enabled changed event.
+ *
+ * Note: This flow can only notify enabled status changes, cannot provide the latest status.
+ */
+fun Context.mobileDataEnabledFlow(subId: Int): Flow<Unit> {
+ val flow = settingsGlobalChangeFlow(Settings.Global.MOBILE_DATA)
+ return when (subId) {
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID -> flow
+ else -> {
+ val subIdFlow = settingsGlobalChangeFlow(
+ name = Settings.Global.MOBILE_DATA + subId,
+ sendInitialValue = false,
+ )
+ merge(flow, subIdFlow)
+ }
+ }
+}
diff --git a/src/com/android/settings/network/MobileDataEnabledListener.java b/src/com/android/settings/network/MobileDataEnabledListener.java
index b030823..f2d55ab 100644
--- a/src/com/android/settings/network/MobileDataEnabledListener.java
+++ b/src/com/android/settings/network/MobileDataEnabledListener.java
@@ -20,7 +20,12 @@
import android.provider.Settings;
import android.telephony.SubscriptionManager;
-/** Helper class to listen for changes in the enabled state of mobile data. */
+/**
+ * Helper class to listen for changes in the enabled state of mobile data.
+ *
+ * @deprecated use {@link MobileDataEnabledFlowKt} instead
+ */
+@Deprecated
public class MobileDataEnabledListener {
private Context mContext;
private Client mClient;
diff --git a/src/com/android/settings/network/MobileNetworkListFragment.java b/src/com/android/settings/network/MobileNetworkListFragment.java
deleted file mode 100644
index 3de05af..0000000
--- a/src/com/android/settings/network/MobileNetworkListFragment.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;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.os.UserManager;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.network.telephony.MobileNetworkUtils;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.search.SearchIndexable;
-
-@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
-public class MobileNetworkListFragment extends DashboardFragment {
- private static final String LOG_TAG = "NetworkListFragment";
-
- private static final String KEY_ADD_SIM = "add_sim";
-
- @Override
- public void onResume() {
- super.onResume();
- // Disable the animation of the preference list
- final RecyclerView prefListView = getListView();
- if (prefListView != null) {
- prefListView.setItemAnimator(null);
- }
-
- findPreference(KEY_ADD_SIM).setVisible(MobileNetworkUtils.showEuiccSettings(getContext()));
- }
-
- @Override
- protected int getPreferenceScreenResId() {
- return R.xml.network_provider_sims_list;
- }
-
- @Override
- protected String getLogTag() {
- return LOG_TAG;
- }
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.MOBILE_NETWORK_LIST;
- }
-
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.network_provider_sims_list) {
-
- @Override
- protected boolean isPageSearchEnabled(Context context) {
- return SubscriptionUtil.isSimHardwareVisible(context) &&
- context.getSystemService(UserManager.class).isAdminUser();
- }
- };
-}
diff --git a/src/com/android/settings/network/MobileNetworkListFragment.kt b/src/com/android/settings/network/MobileNetworkListFragment.kt
new file mode 100644
index 0000000..09b1150
--- /dev/null
+++ b/src/com/android/settings/network/MobileNetworkListFragment.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2023 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.settings.SettingsEnums
+import android.content.Context
+import android.os.Bundle
+import android.provider.Settings
+import android.view.View
+import androidx.annotation.VisibleForTesting
+import androidx.preference.Preference
+import com.android.settings.R
+import com.android.settings.SettingsPreferenceFragment
+import com.android.settings.dashboard.DashboardFragment
+import com.android.settings.network.telephony.MobileNetworkUtils
+import com.android.settings.search.BaseSearchIndexProvider
+import com.android.settingslib.search.SearchIndexable
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+import com.android.settingslib.spaprivileged.framework.common.userManager
+import com.android.settingslib.spaprivileged.settingsprovider.settingsGlobalBooleanFlow
+
+@SearchIndexable(forTarget = SearchIndexable.ALL and SearchIndexable.ARC.inv())
+class MobileNetworkListFragment : DashboardFragment() {
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ collectAirplaneModeAndFinishIfOn()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ // Disable the animation of the preference list
+ listView.itemAnimator = null
+
+ findPreference<Preference>(KEY_ADD_SIM)!!.isVisible =
+ MobileNetworkUtils.showEuiccSettings(context)
+ }
+
+ override fun getPreferenceScreenResId() = R.xml.network_provider_sims_list
+
+ override fun getLogTag() = LOG_TAG
+
+ override fun getMetricsCategory() = SettingsEnums.MOBILE_NETWORK_LIST
+
+ companion object {
+ private const val LOG_TAG = "NetworkListFragment"
+ private const val KEY_ADD_SIM = "add_sim"
+
+ @JvmStatic
+ fun SettingsPreferenceFragment.collectAirplaneModeAndFinishIfOn() {
+ requireContext().settingsGlobalBooleanFlow(Settings.Global.AIRPLANE_MODE_ON)
+ .collectLatestWithLifecycle(viewLifecycleOwner) { isAirplaneModeOn ->
+ if (isAirplaneModeOn) {
+ finish()
+ }
+ }
+ }
+
+ @JvmField
+ val SEARCH_INDEX_DATA_PROVIDER = SearchIndexProvider()
+
+ @VisibleForTesting
+ class SearchIndexProvider : BaseSearchIndexProvider(R.xml.network_provider_sims_list) {
+ public override fun isPageSearchEnabled(context: Context): Boolean =
+ SubscriptionUtil.isSimHardwareVisible(context) &&
+ context.userManager.isAdminUser
+ }
+ }
+}
diff --git a/src/com/android/settings/network/MobileNetworkRepository.java b/src/com/android/settings/network/MobileNetworkRepository.java
index 54c571b..f69b63f 100644
--- a/src/com/android/settings/network/MobileNetworkRepository.java
+++ b/src/com/android/settings/network/MobileNetworkRepository.java
@@ -378,11 +378,11 @@
return mMobileNetworkInfoDao.queryMobileNetworkInfoBySubId(subId);
}
- private void getUiccInfoBySubscriptionInfo(UiccSlotInfo[] uiccSlotInfos,
+ private void getUiccInfoBySubscriptionInfo(@NonNull UiccSlotInfo[] uiccSlotInfos,
SubscriptionInfo subInfo) {
for (int i = 0; i < uiccSlotInfos.length; i++) {
UiccSlotInfo curSlotInfo = uiccSlotInfos[i];
- if (curSlotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT) {
+ if (curSlotInfo != null && curSlotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT) {
final int index = i;
mIsEuicc = curSlotInfo.getIsEuicc();
mCardState = curSlotInfo.getCardStateInfo();
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index bc271ca..d5bc2af 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -175,10 +175,6 @@
private static final String EXTRA_START_CONNECT_SSID = "wifi_start_connect_ssid";
private String mOpenSsid;
- private static boolean isVerboseLoggingEnabled() {
- return WifiPickerTracker.isVerboseLoggingEnabled();
- }
-
private boolean mIsViewLoading;
@VisibleForTesting
final Runnable mRemoveLoadingRunnable = () -> {
@@ -840,7 +836,7 @@
}
final int wifiState = mWifiPickerTracker.getWifiState();
- if (isVerboseLoggingEnabled()) {
+ if (mWifiPickerTracker.isVerboseLoggingEnabled()) {
Log.i(TAG, "onWifiStateChanged called with wifi state: " + wifiState);
}
@@ -849,8 +845,10 @@
return;
}
- // update the menu item
- requireActivity().invalidateMenu();
+ if (isAdded()) {
+ // update the menu item
+ requireActivity().invalidateMenu();
+ }
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
@@ -1484,8 +1482,10 @@
@Override
public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
updateAirplaneModeMsgPreference(isAirplaneModeOn /* visible */);
- // update the menu item
- requireActivity().invalidateMenu();
+ if (isAdded()) {
+ // update the menu item
+ requireActivity().invalidateMenu();
+ }
}
/**
diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java
index 49a1a85..e329c74 100644
--- a/src/com/android/settings/network/UiccSlotUtil.java
+++ b/src/com/android/settings/network/UiccSlotUtil.java
@@ -301,7 +301,8 @@
}
if (slotId == INVALID_PHYSICAL_SLOT_ID) {
for (int i = 0; i < slots.length; i++) {
- if (slots[i].isRemovable()
+ if (slots[i] != null
+ && slots[i].isRemovable()
&& !slots[i].getIsEuicc()
&& !slots[i].getPorts().stream().findFirst().get().isActive()
&& slots[i].getCardStateInfo() != UiccSlotInfo.CARD_STATE_INFO_ERROR
@@ -310,8 +311,9 @@
}
}
} else {
- if (slotId >= slots.length || !slots[slotId].isRemovable()) {
- throw new UiccSlotsException("The given slotId is not a removable slot: " + slotId);
+ if (slotId >= slots.length || slots[slotId] == null || !slots[slotId].isRemovable()) {
+ Log.d(TAG, "The given slotId is not a removable slot: " + slotId);
+ return INVALID_PHYSICAL_SLOT_ID;
}
if (!slots[slotId].getPorts().stream().findFirst().get().isActive()) {
return slotId;
diff --git a/src/com/android/settings/network/apn/ApnEditPageProvider.kt b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
index 0e23a0e..0ed54e7 100644
--- a/src/com/android/settings/network/apn/ApnEditPageProvider.kt
+++ b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
@@ -38,7 +38,6 @@
import com.android.settings.network.apn.ApnNetworkTypes.getNetworkTypeDisplayNames
import com.android.settings.network.apn.ApnNetworkTypes.getNetworkTypeSelectedOptionsState
import com.android.settingslib.spa.framework.common.SettingsPageProvider
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuBox
import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuCheckBox
import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField
@@ -96,7 +95,7 @@
getNetworkTypeSelectedOptionsState(apnData.networkType)
}
RegularScaffold(
- title = stringResource(id = R.string.apn_edit),
+ title = if(apnDataInit.newApn) stringResource(id = R.string.apn_add) else stringResource(id = R.string.apn_edit),
actions = {
IconButton(onClick = {
validateAndSaveApnData(
@@ -186,10 +185,8 @@
SwitchPreference(
object : SwitchPreferenceModel {
override val title = context.resources.getString(R.string.carrier_enabled)
- override val changeable =
- stateOf(apnData.apnEnableEnabled)
- override val checked =
- stateOf(apnData.apnEnable)
+ override val changeable = { apnData.apnEnableEnabled }
+ override val checked = { apnData.apnEnable }
override val onCheckedChange = { newChecked: Boolean ->
apnData = apnData.copy(apnEnable = newChecked)
}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index afc1b7e..a514414 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -16,6 +16,8 @@
package com.android.settings.network.telephony;
+import static com.android.settings.network.MobileNetworkListFragment.collectAirplaneModeAndFinishIfOn;
+
import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -31,7 +33,10 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.View;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -327,6 +332,12 @@
}
@Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ collectAirplaneModeAndFinishIfOn(this);
+ }
+
+ @Override
public void onResume() {
super.onResume();
mMobileNetworkRepository.addRegister(this, this, mSubId);
@@ -361,11 +372,6 @@
super.onPause();
}
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
@VisibleForTesting
void onRestoreInstance(Bundle icicle) {
if (icicle != null) {
diff --git a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java
index 2830024..200a47b 100644
--- a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java
+++ b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java
@@ -39,13 +39,18 @@
import com.android.settings.applications.AppInfoBase;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.flags.Flags;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.RestrictedSwitchPreference;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* Populates the PreferenceCategory with notification channels associated with the given app.
@@ -61,6 +66,9 @@
private RestrictedSwitchPreference mAllNotificationsToggle;
private PreferenceCategory mPreferenceCategory;
private List<NotificationChannel> mChannels = new ArrayList<>();
+ private Set<String> mDuplicateChannelNames = new HashSet<>();
+ private Map<NotificationChannel, String> mChannelGroupNames =
+ new HashMap<NotificationChannel, String>();
public AppChannelsBypassingDndPreferenceController(
Context context,
@@ -135,10 +143,20 @@
List<NotificationChannel> newChannelList = new ArrayList<>();
List<NotificationChannelGroup> mChannelGroupList = mBackend.getGroups(mAppRow.pkg,
mAppRow.uid).getList();
+ Set<String> allChannelNames = new HashSet<>();
for (NotificationChannelGroup channelGroup : mChannelGroupList) {
for (NotificationChannel channel : channelGroup.getChannels()) {
if (!isConversation(channel)) {
newChannelList.add(channel);
+ if (Flags.dedupeDndSettingsChannels()) {
+ mChannelGroupNames.put(channel, channelGroup.getName().toString());
+ // Check if channel name is unique on this page; if not, save it.
+ if (allChannelNames.contains(channel.getName())) {
+ mDuplicateChannelNames.add(channel.getName().toString());
+ } else {
+ allChannelNames.add(channel.getName().toString());
+ }
+ }
}
}
}
@@ -172,6 +190,17 @@
&& isChannelConfigurable(channel)
&& showNotification(channel));
channelPreference.setTitle(BidiFormatter.getInstance().unicodeWrap(channel.getName()));
+ if (Flags.dedupeDndSettingsChannels()) {
+ // If the channel shares its name with another channel, set group name as summary
+ // to disambiguate in the list.
+ if (mDuplicateChannelNames.contains(channel.getName().toString())
+ && mChannelGroupNames.containsKey(channel)
+ && mChannelGroupNames.get(channel) != null
+ && !mChannelGroupNames.get(channel).isEmpty()) {
+ channelPreference.setSummary(BidiFormatter.getInstance().unicodeWrap(
+ mChannelGroupNames.get(channel)));
+ }
+ }
channelPreference.setChecked(showNotificationInDnd(channel));
channelPreference.setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index ac689d9..bc0cf1f 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -39,6 +39,7 @@
import com.android.settings.onboarding.OnboardingFeatureProvider
import com.android.settings.overlay.FeatureFactory.Companion.setFactory
import com.android.settings.panel.PanelFeatureProvider
+import com.android.settings.privatespace.PrivateSpaceLoginFeatureProvider
import com.android.settings.search.SearchFeatureProvider
import com.android.settings.security.SecurityFeatureProvider
import com.android.settings.security.SecuritySettingsFeatureProvider
@@ -170,6 +171,11 @@
*/
abstract val fastPairFeatureProvider: FastPairFeatureProvider
+ /**
+ * Gets implementation for Private Space account login feature.
+ */
+ abstract val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
+
companion object {
private var _factory: FeatureFactory? = null
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 7f991b7..28dbb23 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -59,6 +59,8 @@
import com.android.settings.security.SecurityFeatureProviderImpl
import com.android.settings.security.SecuritySettingsFeatureProvider
import com.android.settings.security.SecuritySettingsFeatureProviderImpl
+import com.android.settings.privatespace.PrivateSpaceLoginFeatureProvider
+import com.android.settings.privatespace.PrivateSpaceLoginFeatureProviderImpl
import com.android.settings.slices.SlicesFeatureProviderImpl
import com.android.settings.users.UserFeatureProviderImpl
import com.android.settings.vpn2.AdvancedVpnFeatureProviderImpl
@@ -184,4 +186,8 @@
override val fastPairFeatureProvider: FastPairFeatureProvider by lazy {
FastPairFeatureProviderImpl()
}
+
+ override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider by lazy {
+ PrivateSpaceLoginFeatureProviderImpl()
+ }
}
diff --git a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
index 5456c01..3b59166 100644
--- a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
+++ b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
@@ -16,7 +16,8 @@
package com.android.settings.privatespace;
-import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LOCK_ACTION;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUNT_LOGIN_ACTION;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE;
import android.annotation.SuppressLint;
import android.content.Intent;
@@ -134,7 +135,8 @@
private void startActivityInPrivateUser(UserHandle userHandle) {
/* Start new activity in private profile which is needed to set private profile lock */
Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class);
- getActivity().startActivityForResultAsUser(intent, SET_LOCK_ACTION, userHandle);
+ intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION);
+ getActivity().startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION, userHandle);
}
private void showPrivateSpaceErrorScreen() {
diff --git a/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java b/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java
index c0d762a..0539f60 100644
--- a/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java
+++ b/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java
@@ -16,27 +16,84 @@
package com.android.settings.privatespace;
+import static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PASSWORD;
+import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY;
+import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
+
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUNT_LOGIN_ACTION;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LOCK_ACTION;
+
+import android.app.KeyguardManager;
+import android.content.Intent;
import android.os.Bundle;
+import androidx.activity.result.ActivityResult;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
-import androidx.navigation.fragment.NavHostFragment;
-import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
+import com.android.settings.overlay.FeatureFactory;
import com.google.android.setupdesign.util.ThemeHelper;
-/** Activity that is started as private profile user that helps to set private profile lock. */
+/** Activity that is started as private profile user that helps to set private profile lock or
+ * add an account on the private profile. */
public class PrivateProfileContextHelperActivity extends FragmentActivity {
private static final String TAG = "PrivateProfileHelper";
+ private final ActivityResultLauncher<Intent> mAddAccountToPrivateProfile =
+ registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
+ this::onAccountAdded);
+ private final ActivityResultLauncher<Intent> mVerifyDeviceLock =
+ registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
+ this::onSetDeviceNewLock);
+
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(SetupWizardUtils.getTheme(this, getIntent()));
ThemeHelper.trySetDynamicColor(this);
super.onCreate(savedInstanceState);
- setContentView(R.layout.privatespace_setup_root);
- NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
- .findFragmentById(R.id.ps_nav_host_fragment);
- navHostFragment.getNavController().setGraph(R.navigation.privatespace_private_context_nav);
+ if (savedInstanceState == null) {
+ int action = getIntent().getIntExtra(EXTRA_ACTION_TYPE, -1);
+ if (action == ACCOUNT_LOGIN_ACTION) {
+ PrivateSpaceLoginFeatureProvider privateSpaceLoginFeatureProvider =
+ FeatureFactory.getFeatureFactory().getPrivateSpaceLoginFeatureProvider();
+ if (!privateSpaceLoginFeatureProvider.initiateAccountLogin(this,
+ mAddAccountToPrivateProfile)) {
+ setResult(RESULT_OK);
+ finish();
+ }
+ } else if (action == SET_LOCK_ACTION) {
+ createPrivateSpaceLock();
+ }
+ }
+ }
+
+ private void createPrivateSpaceLock() {
+ final Intent intent = new Intent(ACTION_SET_NEW_PASSWORD);
+ intent.putExtra(EXTRA_PASSWORD_COMPLEXITY, PASSWORD_COMPLEXITY_LOW);
+ mVerifyDeviceLock.launch(intent);
+ }
+
+ private void onAccountAdded(@Nullable ActivityResult result) {
+ if (result != null && result.getResultCode() == RESULT_OK) {
+ setResult(RESULT_OK);
+ } else {
+ setResult(RESULT_CANCELED);
+ }
+ finish();
+ }
+
+ private void onSetDeviceNewLock(@Nullable ActivityResult result) {
+ // TODO(b/307281644) : Verify this for biometrics and check result code after new
+ // Authentication changes are merged.
+ if (result != null && getSystemService(KeyguardManager.class).isDeviceSecure()) {
+ setResult(RESULT_OK);
+ } else {
+ setResult(RESULT_CANCELED);
+ }
+ finish();
}
}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java b/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java
new file mode 100644
index 0000000..2d263d7
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUNT_LOGIN_ACTION;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.settings.R;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupdesign.GlifLayout;
+
+/** Fragment to display error screen if the profile is not signed in with a Google account. */
+public class PrivateSpaceAccountLoginError extends Fragment {
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater,
+ @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ GlifLayout rootView =
+ (GlifLayout) inflater
+ .inflate(R.layout.privatespace_account_login_error, container, false);
+ final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
+ mixin.setPrimaryButton(
+ new FooterButton.Builder(getContext())
+ .setText(R.string.privatespace_tryagain_label)
+ .setListener(nextScreen())
+ .setButtonType(FooterButton.ButtonType.NEXT)
+ .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
+ .build());
+ OnBackPressedCallback callback =
+ new OnBackPressedCallback(true /* enabled by default */) {
+ @Override
+ public void handleOnBackPressed() {
+ // Handle the back button event
+ }
+ };
+ requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
+
+ return rootView;
+ }
+
+ @SuppressLint("MissingPermission")
+ private View.OnClickListener nextScreen() {
+ return v -> {
+ PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer
+ .getInstance(getActivity());
+ UserHandle userHandle;
+ if (privateSpaceMaintainer.doesPrivateSpaceExist() && (userHandle =
+ privateSpaceMaintainer.getPrivateProfileHandle()) != null) {
+ Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class);
+ intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION);
+ getActivity().startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION,
+ userHandle);
+ }
+ };
+ }
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceLoginFeatureProvider.java b/src/com/android/settings/privatespace/PrivateSpaceLoginFeatureProvider.java
new file mode 100644
index 0000000..76ea9ac
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceLoginFeatureProvider.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.annotation.NonNull;
+
+/** Feature provider for account login during Private Space setup. */
+public interface PrivateSpaceLoginFeatureProvider {
+ /** Returns true if login to an account is enabled during Private Space setup. */
+ boolean initiateAccountLogin(@NonNull Context context,
+ @NonNull ActivityResultLauncher<Intent> resultLauncher);
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceLoginFeatureProviderImpl.java b/src/com/android/settings/privatespace/PrivateSpaceLoginFeatureProviderImpl.java
new file mode 100644
index 0000000..7fca2a4
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceLoginFeatureProviderImpl.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.annotation.NonNull;
+
+/** Stub class for Private space to not initiate account login during setup */
+public class PrivateSpaceLoginFeatureProviderImpl implements PrivateSpaceLoginFeatureProvider {
+ @Override
+ public boolean initiateAccountLogin(@NonNull Context context,
+ @NonNull ActivityResultLauncher<Intent> resultLauncher) {
+ return false;
+ }
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
index 3d17638..93dc43b 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
@@ -16,25 +16,21 @@
package com.android.settings.privatespace;
-import static android.app.Activity.RESULT_OK;
-import static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PASSWORD;
-import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY;
-import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE;
+import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LOCK_ACTION;
-import android.app.Activity;
-import android.app.KeyguardManager;
+import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
+import android.os.UserHandle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.activity.OnBackPressedCallback;
-import androidx.activity.result.ActivityResult;
-import androidx.activity.result.ActivityResultLauncher;
-import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
import com.android.settings.R;
@@ -45,9 +41,6 @@
/** Fragment that provides an option to user to choose between the existing screen lock or set a
* separate private profile lock. */
public class PrivateSpaceSetLockFragment extends Fragment {
- private final ActivityResultLauncher<Intent> mVerifyDeviceLock =
- registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
- this::onSetDeviceNewLock);
@Override
public View onCreateView(
@@ -90,11 +83,8 @@
private View.OnClickListener onClickUse() {
return v -> {
// Simply Use default screen lock. No need to handle
- Activity activity = getActivity();
- if (activity != null) {
- activity.setResult(RESULT_OK);
- activity.finish();
- }
+ NavHostFragment.findNavController(PrivateSpaceSetLockFragment.this)
+ .navigate(R.id.action_success_fragment);
};
}
@@ -104,22 +94,17 @@
};
}
+ @SuppressLint("MissingPermission")
private void createPrivateSpaceLock() {
- final Intent intent = new Intent(ACTION_SET_NEW_PASSWORD);
- intent.putExtra(EXTRA_PASSWORD_COMPLEXITY, PASSWORD_COMPLEXITY_LOW);
- mVerifyDeviceLock.launch(intent);
- }
-
- private void onSetDeviceNewLock(@Nullable ActivityResult result) {
- // TODO(b/307281644) : Verify this for biometrics and check result code after new
- // Authentication changes are merged.
- if (result != null) {
- Activity profileContextHelperActivity = getActivity();
- if (profileContextHelperActivity != null && profileContextHelperActivity
- .getSystemService(KeyguardManager.class).isDeviceSecure()) {
- profileContextHelperActivity.setResult(RESULT_OK);
- profileContextHelperActivity.finish();
- }
+ PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer
+ .getInstance(getActivity());
+ UserHandle userHandle;
+ if (privateSpaceMaintainer.doesPrivateSpaceExist() && (userHandle =
+ privateSpaceMaintainer.getPrivateProfileHandle()) != null) {
+ Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class);
+ intent.putExtra(EXTRA_ACTION_TYPE, SET_LOCK_ACTION);
+ getActivity().startActivityForResultAsUser(intent, SET_LOCK_ACTION,
+ userHandle);
}
}
}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java
index 3a58e9e..a5628c8 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java
@@ -31,6 +31,8 @@
/** Activity class that helps in setting up of private space */
public class PrivateSpaceSetupActivity extends FragmentActivity {
public static final int SET_LOCK_ACTION = 1;
+ public static final int ACCOUNT_LOGIN_ACTION = 2;
+ public static final String EXTRA_ACTION_TYPE = "action_type";
private NavHostFragment mNavHostFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -46,7 +48,13 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == SET_LOCK_ACTION && resultCode == RESULT_OK) {
- mNavHostFragment.getNavController().navigate(R.id.action_advance_to_success);
+ mNavHostFragment.getNavController().navigate(R.id.action_success_fragment);
+ } else if (requestCode == ACCOUNT_LOGIN_ACTION) {
+ if (resultCode == RESULT_OK) {
+ mNavHostFragment.getNavController().navigate(R.id.action_set_lock_fragment);
+ } else {
+ mNavHostFragment.getNavController().navigate(R.id.action_advance_login_error);
+ }
}
super.onActivityResult(requestCode, resultCode, data);
}
diff --git a/src/com/android/settings/privatespace/SetupSuccessFragment.java b/src/com/android/settings/privatespace/SetupSuccessFragment.java
index a8ca3f1..b761da7 100644
--- a/src/com/android/settings/privatespace/SetupSuccessFragment.java
+++ b/src/com/android/settings/privatespace/SetupSuccessFragment.java
@@ -70,7 +70,7 @@
private View.OnClickListener onClickNext() {
return v -> {
accessPrivateSpaceToast();
- // TODO: Replace with the intent to launch PS/PS Launch Settings
+ // TODO(b/306228087): Replace with the intent to launch All Apps once it is working.
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startActivity(startMain);
diff --git a/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListController.java b/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListController.java
index 03a59de..d509d2e 100644
--- a/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListController.java
+++ b/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemListController.java
@@ -16,6 +16,7 @@
package com.android.settings.regionalpreferences;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
@@ -57,4 +58,9 @@
protected String[] getUnitValues() {
return mContext.getResources().getStringArray(R.array.first_day_of_week);
}
+
+ @Override
+ protected int getMetricsActionKey() {
+ return SettingsEnums.ACTION_SET_FIRST_DAY_OF_WEEK;
+ }
}
diff --git a/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java b/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
index 2f2bf76..ac0e7ee 100644
--- a/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
+++ b/src/com/android/settings/regionalpreferences/RegionalPreferenceListBasePreferenceController.java
@@ -22,16 +22,20 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.TickButtonPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/** A base controller for handling all regional preferences controllers. */
public abstract class RegionalPreferenceListBasePreferenceController extends
BasePreferenceController {
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
private PreferenceCategory mPreferenceCategory;
public RegionalPreferenceListBasePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
@Override
@@ -61,6 +65,8 @@
RegionalPreferencesDataUtils.savePreference(mContext, getExtensionTypes(),
item.equals(RegionalPreferencesDataUtils.DEFAULT_VALUE)
? null : item);
+ mMetricsFeatureProvider.action(mContext, getMetricsActionKey(),
+ getPreferenceTitle(value) + " > " + getPreferenceTitle(item));
return true;
});
pref.setSelected(!value.isEmpty() && item.equals(value));
@@ -90,4 +96,8 @@
protected abstract String getExtensionTypes();
protected abstract String[] getUnitValues();
+
+ protected abstract int getMetricsActionKey();
+
+
}
diff --git a/src/com/android/settings/regionalpreferences/TemperatureUnitListController.java b/src/com/android/settings/regionalpreferences/TemperatureUnitListController.java
index c51ca71..91ab1a2 100644
--- a/src/com/android/settings/regionalpreferences/TemperatureUnitListController.java
+++ b/src/com/android/settings/regionalpreferences/TemperatureUnitListController.java
@@ -16,6 +16,7 @@
package com.android.settings.regionalpreferences;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
@@ -55,4 +56,9 @@
protected String[] getUnitValues() {
return mContext.getResources().getStringArray(R.array.temperature_units);
}
+
+ @Override
+ protected int getMetricsActionKey() {
+ return SettingsEnums.ACTION_SET_TEMPERATURE_UNIT;
+ }
}
diff --git a/src/com/android/settings/security/ContentProtectionPreferenceController.java b/src/com/android/settings/security/ContentProtectionPreferenceController.java
index 0129800..5ff2712 100644
--- a/src/com/android/settings/security/ContentProtectionPreferenceController.java
+++ b/src/com/android/settings/security/ContentProtectionPreferenceController.java
@@ -15,11 +15,16 @@
*/
package com.android.settings.security;
-import static android.view.contentprotection.flags.Flags.settingUiEnabled;
+import static com.android.internal.R.string.config_defaultContentProtectionService;
+import android.content.ComponentName;
import android.content.Context;
+import android.provider.DeviceConfig;
+import android.view.contentcapture.ContentCaptureManager;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import com.android.settings.core.BasePreferenceController;
@@ -31,7 +36,32 @@
@Override
public int getAvailabilityStatus() {
- // TODO(b/306565942): Add a resource value check.
- return settingUiEnabled() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ if (!settingUiEnabled() || getContentProtectionServiceComponentName() == null) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ return AVAILABLE;
+ }
+
+ @VisibleForTesting
+ @Nullable
+ protected String getContentProtectionServiceFlatComponentName() {
+ return mContext.getString(config_defaultContentProtectionService);
+ }
+
+ @Nullable
+ private ComponentName getContentProtectionServiceComponentName() {
+ String flatComponentName = getContentProtectionServiceFlatComponentName();
+ if (flatComponentName == null) {
+ return null;
+ }
+ return ComponentName.unflattenFromString(flatComponentName);
+ }
+
+ @VisibleForTesting
+ protected boolean settingUiEnabled() {
+ return DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
+ ContentCaptureManager.DEVICE_CONFIG_PROPERTY_ENABLE_CONTENT_PROTECTION_RECEIVER,
+ ContentCaptureManager.DEFAULT_ENABLE_CONTENT_PROTECTION_RECEIVER);
}
}
diff --git a/src/com/android/settings/security/ContentProtectionPreferenceFragment.java b/src/com/android/settings/security/ContentProtectionPreferenceFragment.java
index a58f6e5..476d93e 100644
--- a/src/com/android/settings/security/ContentProtectionPreferenceFragment.java
+++ b/src/com/android/settings/security/ContentProtectionPreferenceFragment.java
@@ -16,26 +16,35 @@
package com.android.settings.security;
-import android.content.Context;
import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.UserManager;
-import com.android.settings.dashboard.DashboardFragment;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.SwitchPreference;
+
import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
+import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
-import android.os.Bundle;
-
@SearchIndexable
public class ContentProtectionPreferenceFragment extends DashboardFragment {
private static final String TAG = "ContentProtectionPreferenceFragment";
+ @VisibleForTesting
+ static final String KEY_WORK_PROFILE_SWITCH =
+ "content_protection_preference_user_consent_work_profile_switch";
+
// Required by @SearchIndexable to make the fragment and preferences to be indexed.
// Do not rename.
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.layout.content_protection_preference_fragment);
+ private SwitchPreference mWorkProfileSwitch;
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -44,7 +53,14 @@
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- // TODO(b/304681048): Update the toggles' behavior according to user's profile
+
+ mWorkProfileSwitch = getPreferenceScreen().findPreference(KEY_WORK_PROFILE_SWITCH);
+ // If any work profile on the device, display the disable toggle unchecked
+ if (Utils.getManagedProfile(getContext().getSystemService(UserManager.class)) != null) {
+ mWorkProfileSwitch.setVisible(true);
+ mWorkProfileSwitch.setEnabled(false);
+ mWorkProfileSwitch.setChecked(false);
+ }
}
@Override
diff --git a/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java b/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java
new file mode 100644
index 0000000..686b25b
--- /dev/null
+++ b/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2023 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.security;
+
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.widget.Switch;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.widget.SettingsMainSwitchPreference;
+import com.android.settingslib.widget.OnMainSwitchChangeListener;
+
+/** Preference controller for content protection toggle switch bar. */
+public class ContentProtectionTogglePreferenceController extends TogglePreferenceController
+ implements OnMainSwitchChangeListener {
+
+ @VisibleForTesting
+ static final String KEY_CONTENT_PROTECTION_PREFERENCE = "content_protection_user_consent";
+
+ private SettingsMainSwitchPreference mSwitchBar;
+ private final ContentResolver mContentResolver;
+ private final boolean isFullyManagedDevice = Utils.getDeviceOwnerComponent(mContext) != null;
+
+ public ContentProtectionTogglePreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ mContentResolver = context.getContentResolver();
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ if (isFullyManagedDevice) {
+ // If fully managed device, it should always unchecked
+ return false;
+ }
+ return Settings.Global.getInt(mContentResolver, KEY_CONTENT_PROTECTION_PREFERENCE, 0) >= 0;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ mSwitchBar.setChecked(isChecked);
+ Settings.Global.putInt(
+ mContentResolver, KEY_CONTENT_PROTECTION_PREFERENCE, isChecked ? 1 : -1);
+ return true;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+
+ mSwitchBar = screen.findPreference(getPreferenceKey());
+ mSwitchBar.addOnSwitchChangeListener(this);
+ if (isFullyManagedDevice) {
+ // If fully managed device, the switch bar is greyed out
+ mSwitchBar.setEnabled(false);
+ }
+ }
+
+ @Override
+ public void onSwitchChanged(Switch switchView, boolean isChecked) {
+ if (isChecked != isChecked()) {
+ setChecked(isChecked);
+ }
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return R.string.menu_key_security;
+ }
+}
diff --git a/src/com/android/settings/spa/SettingsSpaEnvironment.kt b/src/com/android/settings/spa/SettingsSpaEnvironment.kt
index 40cc9a2..6b96460 100644
--- a/src/com/android/settings/spa/SettingsSpaEnvironment.kt
+++ b/src/com/android/settings/spa/SettingsSpaEnvironment.kt
@@ -30,12 +30,15 @@
import com.android.settings.spa.app.specialaccess.AllFilesAccessAppListProvider
import com.android.settings.spa.app.specialaccess.DisplayOverOtherAppsAppListProvider
import com.android.settings.spa.app.specialaccess.InstallUnknownAppsListProvider
+import com.android.settings.spa.app.specialaccess.LongBackgroundTasksAppListProvider
import com.android.settings.spa.app.specialaccess.MediaManagementAppsAppListProvider
import com.android.settings.spa.app.specialaccess.ModifySystemSettingsAppListProvider
import com.android.settings.spa.app.specialaccess.NfcTagAppsSettingsProvider
import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider
import com.android.settings.spa.app.specialaccess.SpecialAppAccessPageProvider
+import com.android.settings.spa.app.specialaccess.TurnScreenOnAppsAppListProvider
import com.android.settings.spa.app.specialaccess.UseFullScreenIntentAppListProvider
+import com.android.settings.spa.app.specialaccess.VoiceActivationAppsListProvider
import com.android.settings.spa.app.specialaccess.WifiControlAppListProvider
import com.android.settings.spa.app.storage.StorageAppListPageProvider
import com.android.settings.spa.core.instrumentation.SpaLogProvider
@@ -66,8 +69,11 @@
PictureInPictureListProvider,
InstallUnknownAppsListProvider,
AlarmsAndRemindersAppListProvider,
+ VoiceActivationAppsListProvider,
WifiControlAppListProvider,
NfcTagAppsSettingsProvider,
+ LongBackgroundTasksAppListProvider,
+ TurnScreenOnAppsAppListProvider,
)
}
diff --git a/src/com/android/settings/spa/about/AboutPhone.kt b/src/com/android/settings/spa/about/AboutPhone.kt
index 7343da0..5f9aa97 100644
--- a/src/com/android/settings/spa/about/AboutPhone.kt
+++ b/src/com/android/settings/spa/about/AboutPhone.kt
@@ -29,7 +29,6 @@
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -56,7 +55,7 @@
val deviceNamePresenter = remember { DeviceNamePresenter(context) }
Preference(object : PreferenceModel {
override val title = stringResource(R.string.about_settings)
- override val summary = deviceNamePresenter.deviceName.toState()
+ override val summary = { deviceNamePresenter.deviceName }
override val onClick = navigator(name)
override val icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.PermDeviceInformation)
diff --git a/src/com/android/settings/spa/about/DeviceName.kt b/src/com/android/settings/spa/about/DeviceName.kt
index c481e32..86a9512 100644
--- a/src/com/android/settings/spa/about/DeviceName.kt
+++ b/src/com/android/settings/spa/about/DeviceName.kt
@@ -24,7 +24,6 @@
import androidx.compose.ui.res.stringResource
import com.android.settings.R
import com.android.settings.deviceinfo.DeviceNamePreferenceController
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.dialog.AlertDialogButton
import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter
import com.android.settingslib.spa.widget.preference.Preference
@@ -48,7 +47,7 @@
Preference(object : PreferenceModel {
override val title =
stringResource(R.string.my_device_info_device_name_preference_title)
- override val summary = deviceNamePresenter.deviceName.toState()
+ override val summary = { deviceNamePresenter.deviceName }
override val onClick = dialogPresenter::open
})
diff --git a/src/com/android/settings/spa/app/AllAppList.kt b/src/com/android/settings/spa/app/AllAppList.kt
index 383a0e8..5b13211 100644
--- a/src/com/android/settings/spa/app/AllAppList.kt
+++ b/src/com/android/settings/spa/app/AllAppList.kt
@@ -21,8 +21,6 @@
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
-import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import com.android.settings.R
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
@@ -116,7 +114,7 @@
option: Int,
recordListFlow: Flow<List<AppRecordWithSize>>,
): Flow<List<AppRecordWithSize>> = recordListFlow.filterItem(
- when (SpinnerItem.values().getOrNull(option)) {
+ when (SpinnerItem.entries.getOrNull(option)) {
SpinnerItem.Enabled -> ({ it.app.enabled && !it.app.isInstantApp })
SpinnerItem.Disabled -> isDisabled
SpinnerItem.Instant -> isInstant
@@ -130,22 +128,20 @@
private val isInstant: (AppRecordWithSize) -> Boolean = { it.app.isInstantApp }
@Composable
- override fun getSummary(option: Int, record: AppRecordWithSize): State<String> {
+ override fun getSummary(option: Int, record: AppRecordWithSize): () -> String {
val storageSummary = record.app.getStorageSummary()
- return remember {
- derivedStateOf {
- storageSummary.value +
- when {
- !record.app.installed && !record.app.isArchived -> {
- System.lineSeparator() + context.getString(R.string.not_installed)
- }
- isDisabled(record) -> {
- System.lineSeparator() +
- context.getString(com.android.settingslib.R.string.disabled)
- }
- else -> ""
- }
+ return {
+ val summaryList = mutableListOf(storageSummary.value)
+ when {
+ !record.app.installed && !record.app.isArchived -> {
+ summaryList += context.getString(R.string.not_installed)
+ }
+
+ isDisabled(record) -> {
+ summaryList += context.getString(com.android.settingslib.R.string.disabled)
+ }
}
+ summaryList.joinToString(separator = System.lineSeparator())
}
}
diff --git a/src/com/android/settings/spa/app/AppsMain.kt b/src/com/android/settings/spa/app/AppsMain.kt
index 2dea9c5..83b3080 100644
--- a/src/com/android/settings/spa/app/AppsMain.kt
+++ b/src/com/android/settings/spa/app/AppsMain.kt
@@ -30,7 +30,6 @@
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -54,10 +53,10 @@
fun buildInjectEntry() =
SettingsEntryBuilder.createInject(owner = owner)
.setUiLayoutFn {
+ val summary = stringResource(R.string.app_and_notification_dashboard_summary)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.apps_dashboard_title)
- override val summary =
- stringResource(R.string.app_and_notification_dashboard_summary).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
override val icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.Apps)
diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt
index 61098e8..1e6e545 100644
--- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt
+++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -40,11 +41,12 @@
val presenter = remember { UserAspectRatioAppPresenter(context, app) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.aspect_ratio_experimental_title)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
+ override val summary = { summary }
override val onClick = presenter::startActivity
})
}
@@ -61,18 +63,18 @@
}.flowOn(Dispatchers.IO)
fun startActivity() =
- navigateToAppAspectRatioSettings(context, app)
+ navigateToAppAspectRatioSettings(context, app, AppInfoSettingsProvider.METRICS_CATEGORY)
val summaryFlow = flow {
emit(manager.getUserMinAspectRatioEntry(app.packageName, context.userId))
}.flowOn(Dispatchers.IO)
}
-fun navigateToAppAspectRatioSettings(context: Context, app: ApplicationInfo) {
+fun navigateToAppAspectRatioSettings(context: Context, app: ApplicationInfo, metricsCategory: Int) {
AppInfoDashboardFragment.startAppInfoFragment(
UserAspectRatioDetails::class.java,
app,
context,
- AppInfoSettingsProvider.METRICS_CATEGORY,
+ metricsCategory,
)
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
index deea745..7368750f 100644
--- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
+++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
@@ -16,6 +16,7 @@
package com.android.settings.spa.app.appcompat
+import android.app.settings.SettingsEnums
import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
@@ -28,7 +29,7 @@
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
@@ -41,15 +42,14 @@
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.rememberContext
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.util.asyncMap
import com.android.settingslib.spa.framework.util.filterItem
-import com.android.settingslib.spa.widget.preference.Preference
-import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.illustration.Illustration
import com.android.settingslib.spa.widget.illustration.IllustrationModel
import com.android.settingslib.spa.widget.illustration.ResourceType
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.ui.SettingsBody
import com.android.settingslib.spa.widget.ui.SpinnerOption
import com.android.settingslib.spaprivileged.model.app.AppListModel
@@ -80,12 +80,14 @@
@Composable
@VisibleForTesting
- fun EntryItem() =
+ fun EntryItem() {
+ val summary = getSummary()
Preference(object : PreferenceModel {
override val title = stringResource(R.string.aspect_ratio_experimental_title)
- override val summary = getSummary().toState()
+ override val summary = { summary }
override val onClick = navigator(name)
})
+ }
@VisibleForTesting
fun buildInjectEntry() = SettingsEntryBuilder
@@ -154,7 +156,13 @@
override fun AppListItemModel<UserAspectRatioAppListItemModel>.AppItem() {
val app = record.app
AppListItem(
- onClick = { navigateToAppAspectRatioSettings(context, app) }
+ onClick = {
+ navigateToAppAspectRatioSettings(
+ context,
+ app,
+ SettingsEnums.USER_ASPECT_RATIO_APP_LIST_SETTINGS
+ )
+ }
)
}
@@ -177,7 +185,7 @@
option: Int,
recordListFlow: Flow<List<UserAspectRatioAppListItemModel>>
): Flow<List<UserAspectRatioAppListItemModel>> = recordListFlow.filterItem(
- when (SpinnerItem.values().getOrNull(option)) {
+ when (SpinnerItem.entries.getOrNull(option)) {
SpinnerItem.Suggested -> ({ it.canDisplay && it.suggested })
SpinnerItem.Overridden -> ({ it.userOverride != USER_MIN_ASPECT_RATIO_UNSET })
else -> ({ it.canDisplay })
@@ -185,13 +193,15 @@
)
@Composable
- override fun getSummary(option: Int, record: UserAspectRatioAppListItemModel) : State<String> =
- remember(record.userOverride) {
+ override fun getSummary(option: Int, record: UserAspectRatioAppListItemModel): () -> String {
+ val summary by remember(record.userOverride) {
flow {
emit(userAspectRatioManager.getUserMinAspectRatioEntry(record.userOverride,
record.app.packageName))
}.flowOn(Dispatchers.IO)
}.collectAsStateWithLifecycle(initialValue = stringResource(R.string.summary_placeholder))
+ return { summary }
+ }
private fun getPackageAndActivityInfo(app: ApplicationInfo): PackageInfo? = try {
packageManager.getPackageInfoAsUser(app.packageName, GET_ACTIVITIES_FLAGS, app.userId)
diff --git a/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt b/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt
index 34272d4..31e068c 100644
--- a/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt
@@ -24,6 +24,7 @@
import android.os.Bundle
import android.util.Log
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
@@ -52,11 +53,12 @@
val presenter = remember { AppAllServicesPresenter(context, app, coroutineScope) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.app_info_all_services_label)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
+ override val summary = { summary }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt b/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt
index 7dd78a9..c707b44b 100644
--- a/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt
@@ -21,7 +21,6 @@
import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -91,16 +90,17 @@
}
}
- val enabled = derivedStateOf { batteryDiffEntryState is LoadingState.Done }
+ val enabled = { batteryDiffEntryState is LoadingState.Done }
- val summary = derivedStateOf<String> {
- if (!app.installed) return@derivedStateOf ""
- batteryDiffEntryState.let { batteryDiffEntryState ->
- when (batteryDiffEntryState) {
- is LoadingState.Loading -> context.getString(R.string.summary_placeholder)
- is LoadingState.Done -> batteryDiffEntryState.result.getSummary()
+ val summary = {
+ if (app.installed) {
+ batteryDiffEntryState.let { batteryDiffEntryState ->
+ when (batteryDiffEntryState) {
+ is LoadingState.Loading -> context.getString(R.string.summary_placeholder)
+ is LoadingState.Done -> batteryDiffEntryState.result.getSummary()
+ }
}
- }
+ } else ""
}
private fun BatteryDiffEntry?.getSummary(): String =
@@ -155,7 +155,7 @@
}
private sealed class LoadingState<out T> {
- object Loading : LoadingState<Nothing>()
+ data object Loading : LoadingState<Nothing>()
data class Done<T>(val result: T) : LoadingState<T>()
diff --git a/src/com/android/settings/spa/app/appinfo/AppButtons.kt b/src/com/android/settings/spa/app/appinfo/AppButtons.kt
index 3200b81..307ff11 100644
--- a/src/com/android/settings/spa/app/appinfo/AppButtons.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppButtons.kt
@@ -17,6 +17,8 @@
package com.android.settings.spa.app.appinfo
import android.content.pm.ApplicationInfo
+import android.content.pm.FeatureFlags
+import android.content.pm.FeatureFlagsImpl
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -25,16 +27,22 @@
import com.android.settingslib.spa.widget.button.ActionButtons
@Composable
-fun AppButtons(packageInfoPresenter: PackageInfoPresenter) {
+/**
+ * @param featureFlags can be overridden in tests
+ */
+fun AppButtons(packageInfoPresenter: PackageInfoPresenter, featureFlags: FeatureFlags = FeatureFlagsImpl()) {
if (remember(packageInfoPresenter) { packageInfoPresenter.isMainlineModule() }) return
- val presenter = remember { AppButtonsPresenter(packageInfoPresenter) }
+ val presenter = remember { AppButtonsPresenter(packageInfoPresenter, featureFlags) }
ActionButtons(actionButtons = presenter.getActionButtons())
}
private fun PackageInfoPresenter.isMainlineModule(): Boolean =
AppUtils.isMainlineModule(userPackageManager, packageName)
-private class AppButtonsPresenter(private val packageInfoPresenter: PackageInfoPresenter) {
+private class AppButtonsPresenter(
+ private val packageInfoPresenter: PackageInfoPresenter,
+ private val featureFlags: FeatureFlags
+) {
private val appLaunchButton = AppLaunchButton(packageInfoPresenter)
private val appInstallButton = AppInstallButton(packageInfoPresenter)
private val appDisableButton = AppDisableButton(packageInfoPresenter)
@@ -50,7 +58,7 @@
@Composable
private fun getActionButtons(app: ApplicationInfo): List<ActionButton> = listOfNotNull(
- appLaunchButton.getActionButton(app),
+ if (featureFlags.archiving()) null else appLaunchButton.getActionButton(app),
appInstallButton.getActionButton(app),
appDisableButton.getActionButton(app),
appUninstallButton.getActionButton(app),
diff --git a/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt b/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt
index ceb3986..057f911 100644
--- a/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt
@@ -20,6 +20,7 @@
import android.content.pm.ApplicationInfo
import android.net.NetworkTemplate
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
@@ -34,7 +35,6 @@
import com.android.settings.datausage.lib.INetworkTemplates
import com.android.settings.datausage.lib.NetworkTemplates
import com.android.settings.datausage.lib.NetworkTemplates.getTitleResId
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.model.app.hasFlag
@@ -64,16 +64,17 @@
}
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.computing_size),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(
presenter.titleResIdFlow.collectAsStateWithLifecycle(
initialValue = R.string.summary_placeholder,
).value
)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.computing_size),
- )
- override val enabled = presenter.isEnabled().toState()
+ override val summary = { summary }
+ override val enabled = { presenter.isEnabled() }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt b/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt
index 086f59e..7615442 100644
--- a/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppForceStopButton.kt
@@ -20,7 +20,7 @@
import android.content.pm.ApplicationInfo
import android.os.UserManager
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.WarningAmber
+import androidx.compose.material.icons.outlined.Report
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
@@ -48,7 +48,7 @@
val dialogPresenter = confirmDialogPresenter()
return ActionButton(
text = context.getString(R.string.force_stop),
- imageVector = Icons.Outlined.WarningAmber,
+ imageVector = Icons.Outlined.Report,
enabled = isForceStopButtonEnable(app),
) { onForceStopButtonClicked(app, dialogPresenter) }
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt
index a9d16ae..3b7f579 100644
--- a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt
@@ -18,6 +18,8 @@
import android.app.settings.SettingsEnums
import android.content.pm.ApplicationInfo
+import android.content.pm.FeatureFlags
+import android.content.pm.FeatureFlagsImpl
import android.os.Bundle
import android.os.UserHandle
import android.util.FeatureFlagUtils
@@ -30,6 +32,7 @@
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavType
import androidx.navigation.navArgument
+import com.android.settings.flags.Flags
import com.android.settings.R
import com.android.settings.applications.AppInfoBase
import com.android.settings.applications.appinfo.AppInfoDashboardFragment
@@ -40,6 +43,7 @@
import com.android.settings.spa.app.specialaccess.InstallUnknownAppsListProvider
import com.android.settings.spa.app.specialaccess.ModifySystemSettingsAppListProvider
import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider
+import com.android.settings.spa.app.specialaccess.VoiceActivationAppsListProvider
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.LifecycleEffect
import com.android.settingslib.spa.framework.compose.navigator
@@ -119,9 +123,11 @@
LifecycleEffect(onStart = { packageInfoPresenter.reloadPackageInfo() })
val packageInfo = packageInfoPresenter.flow.collectAsStateWithLifecycle().value ?: return
val app = checkNotNull(packageInfo.applicationInfo)
+ val featureFlags: FeatureFlags = FeatureFlagsImpl()
RegularScaffold(
title = stringResource(R.string.application_info_label),
actions = {
+ if (featureFlags.archiving()) TopBarAppLaunchButton(packageInfoPresenter, app)
AppInfoSettingsMoreOptions(packageInfoPresenter, app)
}
) {
@@ -156,6 +162,9 @@
InstallUnknownAppsListProvider.InfoPageEntryItem(app)
InteractAcrossProfilesDetailsPreference(app)
AlarmsAndRemindersAppListProvider.InfoPageEntryItem(app)
+ if (Flags.enableVoiceActivationAppsInSettings()) {
+ VoiceActivationAppsListProvider.InfoPageEntryItem(app)
+ }
}
Category(title = stringResource(R.string.app_install_details_group_title)) {
diff --git a/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt b/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt
index 5a348f7..62e714a 100644
--- a/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt
@@ -19,15 +19,16 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.Utils
import com.android.settings.applications.AppStoreUtil
import com.android.settingslib.applications.AppUtils
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.framework.common.asUser
@@ -49,13 +50,14 @@
val presenter = remember { AppInstallerInfoPresenter(context, app, coroutineScope) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
+ val enabled by presenter.enabledFlow.collectAsStateWithLifecycle(initialValue = false)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.app_install_details_title)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
- override val enabled =
- presenter.enabledFlow.collectAsStateWithLifecycle(initialValue = false)
+ override val summary = { summary }
+ override val enabled = { enabled }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt b/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt
index 2d6fbb6..3b2aace 100644
--- a/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt
@@ -23,15 +23,16 @@
import android.content.pm.PackageManager.ResolveInfoFlags
import android.net.Uri
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.applications.AppInfoBase
import com.android.settings.applications.AppLocaleUtil
import com.android.settings.applications.appinfo.AppLocaleDetails
import com.android.settings.localepicker.AppLocalePickerActivity
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.model.app.userHandle
@@ -46,11 +47,12 @@
val presenter = remember { AppLocalePresenter(context, app) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.app_locale_preference_title)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
+ override val summary = { summary }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt b/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt
index 45033e7..28527c1 100644
--- a/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -29,7 +30,6 @@
import com.android.settings.spa.notification.AppNotificationRepository
import com.android.settings.spa.notification.IAppNotificationRepository
import com.android.settingslib.spa.framework.compose.rememberContext
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.model.app.installed
@@ -43,17 +43,17 @@
repository: IAppNotificationRepository = rememberContext(::AppNotificationRepository),
) {
val context = LocalContext.current
- val summaryFlow = remember(app) {
+ val summary by remember(app) {
flow {
emit(repository.getNotificationSummary(app))
- }.flowOn(Dispatchers.IO)
- }
+ }.flowOn(Dispatchers.Default)
+ }.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder)
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.notifications_label)
- override val summary = summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder)
- )
- override val enabled = stateOf(app.installed)
+ override val summary = { summary }
+ override val enabled = { app.installed }
override val onClick = { navigateToAppNotificationSettings(context, app) }
})
}
@@ -65,4 +65,4 @@
context,
AppInfoSettingsProvider.METRICS_CATEGORY,
)
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt b/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt
index 757ddc2..aae9569 100644
--- a/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -28,7 +29,6 @@
import com.android.settings.applications.intentpicker.AppLaunchSettings
import com.android.settings.applications.intentpicker.IntentPickerUtils
import com.android.settingslib.applications.AppUtils
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.framework.common.asUser
@@ -46,12 +46,13 @@
val presenter = remember(app) { AppOpenByDefaultPresenter(context, app) }
if (remember(presenter) { !presenter.isAvailable() }) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.launch_by_default)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
- override val enabled = stateOf(presenter.isEnabled())
+ override val summary = { summary }
+ override val enabled = { presenter.isEnabled() }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt b/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt
index ad666dc..ec1780f 100644
--- a/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt
@@ -22,7 +22,6 @@
import android.content.pm.ApplicationInfo
import android.util.Log
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
@@ -52,8 +51,8 @@
model = remember {
object : PreferenceModel {
override val title = context.getString(R.string.permissions_label)
- override val summary = derivedStateOf { summaryState.value.summary }
- override val enabled = derivedStateOf { summaryState.value.enabled }
+ override val summary = { summaryState.value.summary }
+ override val enabled = { summaryState.value.enabled }
override val onClick = { startManagePermissionsActivity(context, app) }
}
},
diff --git a/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt b/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt
index e8b1018..2b96454 100644
--- a/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt
@@ -19,9 +19,6 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
-import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.android.settings.R
@@ -47,12 +44,13 @@
}
@Composable
-private fun getSummary(context: Context, app: ApplicationInfo): State<String> {
+private fun getSummary(context: Context, app: ApplicationInfo): () -> String {
val sizeState = app.getStorageSize()
- return remember {
- derivedStateOf {
- val size = sizeState.value
- if (size.isBlank()) return@derivedStateOf context.getString(R.string.computing_size)
+ return {
+ val size = sizeState.value
+ if (size.isBlank()) {
+ context.getString(R.string.computing_size)
+ } else {
val storageType = context.getString(
when (app.hasFlag(ApplicationInfo.FLAG_EXTERNAL_STORAGE)) {
true -> R.string.storage_type_external
diff --git a/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt b/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt
index 21b3d73..7ba61dc 100644
--- a/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt
@@ -22,6 +22,7 @@
import android.content.pm.PackageManager.ResolveInfoFlags
import android.provider.Settings
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
@@ -29,7 +30,6 @@
import androidx.lifecycle.liveData
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.model.app.hasFlag
@@ -43,12 +43,13 @@
val presenter = remember { AppTimeSpentPresenter(context, app) }
if (!presenter.isAvailable()) return
+ val summary by presenter.summaryLiveData.observeAsState(
+ initial = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.time_spent_in_app_pref_title)
- override val summary = presenter.summaryLiveData.observeAsState(
- initial = stringResource(R.string.summary_placeholder),
- )
- override val enabled = stateOf(presenter.isEnabled())
+ override val summary = { summary }
+ override val enabled = { presenter.isEnabled() }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt b/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt
index 74c0aa4..51f6845 100644
--- a/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt
@@ -22,6 +22,7 @@
import android.content.pm.ApplicationInfo
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
@@ -57,11 +58,12 @@
if (remember(presenter) { !presenter.isAvailable() }) return
if (presenter.isVisible().observeAsState().value != true) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(shortcut.titleResId)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
+ override val summary = { summary }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
index f62a3be..78ca15b 100644
--- a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
@@ -28,15 +28,14 @@
import android.provider.DeviceConfig
import android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED
import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS
import com.android.settingslib.spa.framework.compose.OverridableFlow
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.settingslib.spaprivileged.framework.common.appHibernationManager
@@ -44,12 +43,12 @@
import com.android.settingslib.spaprivileged.framework.common.asUser
import com.android.settingslib.spaprivileged.framework.common.permissionControllerManager
import com.android.settingslib.spaprivileged.model.app.userHandle
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.withContext
-import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
@Composable
fun HibernationSwitchPreference(app: ApplicationInfo) {
@@ -57,18 +56,14 @@
val presenter = remember { HibernationSwitchPresenter(context, app) }
if (!presenter.isAvailable()) return
- val isEligibleState = presenter.isEligibleFlow.collectAsStateWithLifecycle(initialValue = false)
+ val isEligibleState by presenter.isEligibleFlow.collectAsStateWithLifecycle(initialValue = false)
val isCheckedState = presenter.isCheckedFlow.collectAsStateWithLifecycle(initialValue = null)
SwitchPreference(remember {
object : SwitchPreferenceModel {
override val title = context.getString(R.string.unused_apps_switch)
- override val summary = stateOf(context.getString(R.string.unused_apps_switch_summary))
- override val changeable = isEligibleState
-
- override val checked = derivedStateOf {
- if (!changeable.value) false else isCheckedState.value
- }
-
+ override val summary = { context.getString(R.string.unused_apps_switch_summary) }
+ override val changeable = { isEligibleState }
+ override val checked = { if (changeable()) isCheckedState.value else false }
override val onCheckedChange = presenter::onCheckedChange
}
})
diff --git a/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt b/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt
index 7b9480d..9c3ec97 100644
--- a/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt
@@ -32,9 +32,9 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.Utils
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -53,11 +53,12 @@
val presenter = remember { InstantAppDomainsPresenter(context, app) }
var openDialog by rememberSaveable { mutableStateOf(false) }
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.app_launch_supported_domain_urls_title)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
+ override val summary = { summary }
override val onClick = { openDialog = true }
})
diff --git a/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt b/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt
index 12f6907..905e057 100644
--- a/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt
@@ -19,13 +19,14 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.applications.appinfo.AppInfoDashboardFragment
import com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetails
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.framework.common.crossProfileApps
@@ -39,11 +40,12 @@
val presenter = remember { InteractAcrossProfilesDetailsPresenter(context, app) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
+ val summary by presenter.summaryFlow.collectAsStateWithLifecycle(
+ initialValue = stringResource(R.string.summary_placeholder),
+ )
Preference(object : PreferenceModel {
override val title = stringResource(R.string.interact_across_profiles_title)
- override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
- initialValue = stringResource(R.string.summary_placeholder),
- )
+ override val summary = { summary }
override val onClick = presenter::startActivity
})
}
diff --git a/src/com/android/settings/spa/app/appinfo/TopBarAppLaunchButton.kt b/src/com/android/settings/spa/app/appinfo/TopBarAppLaunchButton.kt
new file mode 100644
index 0000000..92ad139
--- /dev/null
+++ b/src/com/android/settings/spa/app/appinfo/TopBarAppLaunchButton.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2023 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.spa.app.appinfo
+
+import android.content.ActivityNotFoundException
+import android.content.Intent
+import android.content.pm.ApplicationInfo
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.outlined.Launch
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.res.stringResource
+import com.android.settings.R
+import com.android.settingslib.spaprivileged.model.app.userHandle
+
+@Composable
+fun TopBarAppLaunchButton(packageInfoPresenter: PackageInfoPresenter, app: ApplicationInfo) {
+ val intent = packageInfoPresenter.launchIntent(app = app) ?: return
+ IconButton({ launchButtonAction(intent, app, packageInfoPresenter) }) {
+ Icon(
+ imageVector = Icons.AutoMirrored.Outlined.Launch,
+ contentDescription = stringResource(R.string.launch_instant_app),
+ )
+ }
+}
+
+private fun PackageInfoPresenter.launchIntent(
+ app: ApplicationInfo
+): Intent? {
+ return userPackageManager.getLaunchIntentForPackage(app.packageName)
+}
+
+private fun launchButtonAction(
+ intent: Intent,
+ app: ApplicationInfo,
+ packageInfoPresenter: PackageInfoPresenter
+) {
+ try {
+ packageInfoPresenter.context.startActivityAsUser(intent, app.userHandle)
+ } catch (_: ActivityNotFoundException) {
+ // Only happens after package changes like uninstall, and before page auto refresh or
+ // close, so ignore this exception is safe.
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt b/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt
index 6e0643b..89f473b 100644
--- a/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt
+++ b/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt
@@ -32,6 +32,7 @@
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
@@ -88,9 +89,10 @@
@Composable
fun EntryItem() {
if(featureIsDisabled) return
+ val summary by generatePreferenceSummary()
Preference(object : PreferenceModel {
override val title = stringResource(R.string.background_install_title)
- override val summary = generatePreferenceSummary()
+ override val summary = { summary }
override val onClick = navigator(name)
})
}
diff --git a/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt b/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt
index c31eb7a..c990927 100644
--- a/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt
+++ b/src/com/android/settings/spa/app/specialaccess/AlarmsAndRemindersAppList.kt
@@ -24,10 +24,9 @@
import android.content.pm.ApplicationInfo
import android.os.PowerExemptionManager
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.R
-import com.android.settingslib.spa.framework.compose.stateOf
+import com.android.settingslib.spa.livedata.observeAsCallback
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.model.app.PackageManagers
@@ -79,9 +78,10 @@
}
@Composable
- override fun isAllowed(record: AlarmsAndRemindersAppRecord) =
- if (record.isTrumped) stateOf(true)
- else record.controller.isAllowed.observeAsState()
+ override fun isAllowed(record: AlarmsAndRemindersAppRecord): () -> Boolean? = when {
+ record.isTrumped -> ({ true })
+ else -> record.controller.isAllowed.observeAsCallback()
+ }
override fun isChangeable(record: AlarmsAndRemindersAppRecord) = record.isChangeable
diff --git a/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt b/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt
index c98b2ee..7f63e38 100644
--- a/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt
+++ b/src/com/android/settings/spa/app/specialaccess/InstallUnknownApps.kt
@@ -24,8 +24,8 @@
import android.content.pm.ApplicationInfo
import android.os.UserManager
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
import com.android.settings.R
+import com.android.settingslib.spa.livedata.observeAsCallback
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.userId
@@ -79,7 +79,7 @@
@Composable
override fun isAllowed(record: InstallUnknownAppsRecord) =
- record.appOpsController.isAllowed.observeAsState()
+ record.appOpsController.isAllowed.observeAsCallback()
override fun isChangeable(record: InstallUnknownAppsRecord) =
isChangeable(record, getPotentialPackageNames(record.app.userId))
diff --git a/src/com/android/settings/spa/app/specialaccess/LongBackgroundTasksApps.kt b/src/com/android/settings/spa/app/specialaccess/LongBackgroundTasksApps.kt
new file mode 100644
index 0000000..3ba9b08
--- /dev/null
+++ b/src/com/android/settings/spa/app/specialaccess/LongBackgroundTasksApps.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2023 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.spa.app.specialaccess
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.app.settings.SettingsEnums
+import android.content.Context
+import com.android.settings.R
+import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
+import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
+import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
+import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
+
+object LongBackgroundTasksAppListProvider : TogglePermissionAppListProvider {
+ override val permissionType = "LongBackgroundTasksApps"
+ override fun createModel(context: Context) = LongBackgroundTasksAppsListModel(context)
+}
+
+class LongBackgroundTasksAppsListModel(context: Context) : AppOpPermissionListModel(context) {
+ override val pageTitleResId = R.string.long_background_tasks_title
+ override val switchTitleResId = R.string.long_background_tasks_switch_title
+ override val footerResId = R.string.long_background_tasks_footer_title
+ override val appOp = AppOpsManager.OP_RUN_USER_INITIATED_JOBS
+ override val permission = Manifest.permission.RUN_USER_INITIATED_JOBS
+ override val setModeByUid = true
+
+ override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
+ super.setAllowed(record, newAllowed)
+ logPermissionChange(newAllowed)
+ }
+
+ private fun logPermissionChange(newAllowed: Boolean) {
+ featureFactory.metricsFeatureProvider.action(
+ context,
+ SettingsEnums.ACTION_LONG_BACKGROUND_TASKS_TOGGLE,
+ if (newAllowed) 1 else 0
+ )
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/specialaccess/NfcTagAppsSettings.kt b/src/com/android/settings/spa/app/specialaccess/NfcTagAppsSettings.kt
index 3dede42..f02a6a1 100644
--- a/src/com/android/settings/spa/app/specialaccess/NfcTagAppsSettings.kt
+++ b/src/com/android/settings/spa/app/specialaccess/NfcTagAppsSettings.kt
@@ -23,8 +23,8 @@
import android.nfc.NfcAdapter
import android.util.Log
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
import com.android.settings.R
+import com.android.settingslib.spa.livedata.observeAsCallback
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.userId
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListModel
@@ -100,7 +100,7 @@
@Composable
override fun isAllowed(record: NfcTagAppsSettingsRecord) =
- record.controller.isAllowed.observeAsState()
+ record.controller.isAllowed.observeAsCallback()
override fun isChangeable(record: NfcTagAppsSettingsRecord) = true
diff --git a/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt b/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt
index 5ed3615..cd615919 100644
--- a/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt
+++ b/src/com/android/settings/spa/app/specialaccess/PictureInPicture.kt
@@ -25,8 +25,8 @@
import android.content.pm.PackageManager.PackageInfoFlags
import android.util.Log
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
import com.android.settings.R
+import com.android.settingslib.spa.livedata.observeAsCallback
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.installed
@@ -90,7 +90,7 @@
@Composable
override fun isAllowed(record: PictureInPictureRecord) =
- record.appOpsController.isAllowed.observeAsState()
+ record.appOpsController.isAllowed.observeAsCallback()
override fun isChangeable(record: PictureInPictureRecord) = record.isSupport
diff --git a/src/com/android/settings/spa/app/specialaccess/SpecialAppAccess.kt b/src/com/android/settings/spa/app/specialaccess/SpecialAppAccess.kt
index b40e32b..fb05a38 100644
--- a/src/com/android/settings/spa/app/specialaccess/SpecialAppAccess.kt
+++ b/src/com/android/settings/spa/app/specialaccess/SpecialAppAccess.kt
@@ -66,7 +66,10 @@
PictureInPictureListProvider,
InstallUnknownAppsListProvider,
AlarmsAndRemindersAppListProvider,
+ VoiceActivationAppsListProvider,
WifiControlAppListProvider,
+ LongBackgroundTasksAppListProvider,
+ TurnScreenOnAppsAppListProvider,
)
.map { it.buildAppListInjectEntry().setLink(fromPage = owner).build() }
}
diff --git a/src/com/android/settings/spa/app/specialaccess/TurnScreenOnApps.kt b/src/com/android/settings/spa/app/specialaccess/TurnScreenOnApps.kt
new file mode 100644
index 0000000..262acb7
--- /dev/null
+++ b/src/com/android/settings/spa/app/specialaccess/TurnScreenOnApps.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2023 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.spa.app.specialaccess
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.app.settings.SettingsEnums
+import android.content.Context
+import com.android.settings.R
+import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
+import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
+import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
+import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
+
+object TurnScreenOnAppsAppListProvider : TogglePermissionAppListProvider {
+ override val permissionType = "TurnScreenOnApps"
+ override fun createModel(context: Context) = TurnScreenOnAppsListModel(context)
+}
+
+class TurnScreenOnAppsListModel(context: Context) : AppOpPermissionListModel(context) {
+ override val pageTitleResId = com.android.settingslib.R.string.turn_screen_on_title
+ override val switchTitleResId = com.android.settingslib.R.string.allow_turn_screen_on
+ override val footerResId = com.android.settingslib.R.string.allow_turn_screen_on_description
+ override val appOp = AppOpsManager.OP_TURN_SCREEN_ON
+ override val permission = Manifest.permission.TURN_SCREEN_ON
+ override val setModeByUid = true
+
+ override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
+ super.setAllowed(record, newAllowed)
+ logPermissionChange(newAllowed)
+ }
+
+ private fun logPermissionChange(newAllowed: Boolean) {
+ featureFactory.metricsFeatureProvider.action(
+ context,
+ SettingsEnums.SETTINGS_MANAGE_TURN_SCREEN_ON,
+ if (newAllowed) 1 else 0
+ )
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/specialaccess/VoiceActivationApps.kt b/src/com/android/settings/spa/app/specialaccess/VoiceActivationApps.kt
new file mode 100644
index 0000000..de5f3b7
--- /dev/null
+++ b/src/com/android/settings/spa/app/specialaccess/VoiceActivationApps.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2023 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.spa.app.specialaccess
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.app.settings.SettingsEnums
+import android.content.Context
+import android.content.res.Resources
+import com.android.settings.R
+import com.android.settings.overlay.FeatureFactory
+import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
+import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
+import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
+
+
+object VoiceActivationAppsListProvider : TogglePermissionAppListProvider {
+ override val permissionType = "VoiceActivationApps"
+ override fun createModel(context: Context) = VoiceActivationAppsListModel(context)
+}
+
+class VoiceActivationAppsListModel(context: Context) : AppOpPermissionListModel(context) {
+ override val pageTitleResId = R.string.voice_activation_apps_title
+ override val switchTitleResId = R.string.permit_voice_activation_apps
+ override val footerResId = R.string.allow_voice_activation_apps_description
+ override val appOp = AppOpsManager.OP_RECEIVE_SANDBOX_TRIGGER_AUDIO
+ override val permission = Manifest.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO
+ override val setModeByUid = true
+
+ override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
+ super.setAllowed(record, newAllowed)
+ logPermissionChange(newAllowed)
+ }
+
+ private fun logPermissionChange(newAllowed: Boolean) {
+ val category = when {
+ newAllowed -> SettingsEnums.APP_SPECIAL_PERMISSION_RECEIVE_SANDBOX_TRIGGER_AUDIO_ALLOW
+ else -> SettingsEnums.APP_SPECIAL_PERMISSION_RECEIVE_SANDBOX_TRIGGER_AUDIO_DENY
+ }
+ /**
+ * Leave the package string empty as we should not log the package names for the collected
+ * metrics.
+ */
+ FeatureFactory.featureFactory.metricsFeatureProvider.action(context, category, "")
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsPreferenceController.kt b/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsPreferenceController.kt
new file mode 100644
index 0000000..27d4b4b
--- /dev/null
+++ b/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsPreferenceController.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2023 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.spa.app.specialaccess
+
+import android.content.Context
+import androidx.preference.Preference
+import com.android.settings.core.BasePreferenceController
+import com.android.settings.flags.Flags
+import com.android.settings.spa.SpaActivity.Companion.startSpaActivity
+
+class VoiceActivationAppsPreferenceController(context: Context, preferenceKey: String) :
+ BasePreferenceController(context, preferenceKey) {
+ override fun getAvailabilityStatus() =
+ if (Flags.enableVoiceActivationAppsInSettings()) AVAILABLE
+ else CONDITIONALLY_UNAVAILABLE
+
+ override fun handlePreferenceTreeClick(preference: Preference): Boolean {
+ if (preference.key == mPreferenceKey) {
+ mContext.startSpaActivity(VoiceActivationAppsListProvider.getAppListRoute())
+ return true
+ }
+ return false
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/storage/StorageAppList.kt b/src/com/android/settings/spa/app/storage/StorageAppList.kt
index 8fc3eb5..c33de33 100644
--- a/src/com/android/settings/spa/app/storage/StorageAppList.kt
+++ b/src/com/android/settings/spa/app/storage/StorageAppList.kt
@@ -22,7 +22,7 @@
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -121,13 +121,9 @@
): Flow<List<AppRecordWithSize>> = recordListFlow.filterItem { type.filter(it) }
@Composable
- override fun getSummary(option: Int, record: AppRecordWithSize): State<String> {
- val storageSummary = record.app.getStorageSummary()
- return remember {
- derivedStateOf {
- storageSummary.value
- }
- }
+ override fun getSummary(option: Int, record: AppRecordWithSize): () -> String {
+ val storageSummary by record.app.getStorageSummary()
+ return { storageSummary }
}
@Composable
diff --git a/src/com/android/settings/spa/development/UsageStatsListModel.kt b/src/com/android/settings/spa/development/UsageStatsListModel.kt
index 61c24ac..d27796d 100644
--- a/src/com/android/settings/spa/development/UsageStatsListModel.kt
+++ b/src/com/android/settings/spa/development/UsageStatsListModel.kt
@@ -22,10 +22,8 @@
import android.content.pm.ApplicationInfo
import android.text.format.DateUtils
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
import com.android.settings.R
import com.android.settings.spa.development.UsageStatsListModel.SpinnerItem.Companion.toSpinnerItem
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.widget.ui.SpinnerOption
import com.android.settingslib.spaprivileged.model.app.AppEntry
import com.android.settingslib.spaprivileged.model.app.AppListModel
@@ -55,7 +53,7 @@
}
override fun getSpinnerOptions(recordList: List<UsageStatsAppRecord>): List<SpinnerOption> =
- SpinnerItem.values().map {
+ SpinnerItem.entries.map {
SpinnerOption(
id = it.ordinal,
text = context.getString(it.stringResId),
@@ -77,7 +75,7 @@
}.then(super.getComparator(option))
@Composable
- override fun getSummary(option: Int, record: UsageStatsAppRecord): State<String>? {
+ override fun getSummary(option: Int, record: UsageStatsAppRecord): (() -> String)? {
val usageStats = record.usageStats ?: return null
val lastTimeUsed = DateUtils.formatSameDayTime(
usageStats.lastTimeUsed, now, DateFormat.MEDIUM, DateFormat.MEDIUM
@@ -85,7 +83,7 @@
val lastTimeUsedLine = "${context.getString(R.string.last_time_used_label)}: $lastTimeUsed"
val usageTime = DateUtils.formatElapsedTime(usageStats.totalTimeInForeground / 1000)
val usageTimeLine = "${context.getString(R.string.usage_time_label)}: $usageTime"
- return stateOf("$lastTimeUsedLine\n$usageTimeLine")
+ return { "$lastTimeUsedLine\n$usageTimeLine" }
}
private fun getUsageStats(): Map<String, UsageStats> {
@@ -101,7 +99,7 @@
AppName(R.string.usage_stats_sort_by_app_name);
companion object {
- fun Int.toSpinnerItem(): SpinnerItem = values()[this]
+ fun Int.toSpinnerItem(): SpinnerItem = entries[this]
}
}
}
diff --git a/src/com/android/settings/spa/development/compat/PlatformCompatAppListModel.kt b/src/com/android/settings/spa/development/compat/PlatformCompatAppListModel.kt
index c6752b9..8f53698 100644
--- a/src/com/android/settings/spa/development/compat/PlatformCompatAppListModel.kt
+++ b/src/com/android/settings/spa/development/compat/PlatformCompatAppListModel.kt
@@ -24,7 +24,6 @@
import androidx.core.os.bundleOf
import com.android.settings.core.SubSettingLauncher
import com.android.settings.development.compat.PlatformCompatDashboard
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.framework.util.filterItem
import com.android.settingslib.spa.framework.util.mapItem
import com.android.settingslib.spaprivileged.model.app.AppListModel
@@ -53,8 +52,9 @@
}
@Composable
- override fun getSummary(option: Int, record: PlatformCompatAppRecord) =
- stateOf(record.app.packageName)
+ override fun getSummary(option: Int, record: PlatformCompatAppRecord): () -> String = {
+ record.app.packageName
+ }
@Composable
override fun AppListItemModel<PlatformCompatAppRecord>.AppItem() {
diff --git a/src/com/android/settings/spa/network/AirplaneModePreference.kt b/src/com/android/settings/spa/network/AirplaneModePreference.kt
index 462c121..27261b6 100644
--- a/src/com/android/settings/spa/network/AirplaneModePreference.kt
+++ b/src/com/android/settings/spa/network/AirplaneModePreference.kt
@@ -20,8 +20,9 @@
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.AirplanemodeActive
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
@@ -37,11 +38,12 @@
val context = LocalContext.current
val controller = remember { AirplaneModeController(context) }
if (!controller.isAvailable()) return
+ val checked by controller.airplaneModeState.observeAsState(
+ initial = controller.isAirplaneModeOn()
+ )
SwitchPreference(object : SwitchPreferenceModel {
override val title = context.getString(R.string.airplane_mode)
- override val checked = controller.airplaneModeState.observeAsState(
- initial = controller.isAirplaneModeOn()
- )
+ override val checked = { checked }
override val onCheckedChange = { newChecked: Boolean ->
controller.setChecked(newChecked)
}
diff --git a/src/com/android/settings/spa/network/NetworkAndInternet.kt b/src/com/android/settings/spa/network/NetworkAndInternet.kt
index 777133e..f985237 100644
--- a/src/com/android/settings/spa/network/NetworkAndInternet.kt
+++ b/src/com/android/settings/spa/network/NetworkAndInternet.kt
@@ -34,7 +34,6 @@
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -60,9 +59,10 @@
fun buildInjectEntry(): SettingsEntryBuilder {
return SettingsEntryBuilder.createInject(owner = owner)
.setUiLayoutFn {
+ val summary = stringResource(getSummaryResId())
Preference(object : PreferenceModel {
override val title = stringResource(R.string.network_dashboard_title)
- override val summary = stringResource(getSummaryResId()).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
override val icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.Wifi)
diff --git a/src/com/android/settings/spa/notification/AppListNotifications.kt b/src/com/android/settings/spa/notification/AppListNotifications.kt
index c1e5d64..00e4394 100644
--- a/src/com/android/settings/spa/notification/AppListNotifications.kt
+++ b/src/com/android/settings/spa/notification/AppListNotifications.kt
@@ -23,7 +23,6 @@
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.rememberContext
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.template.app.AppListPage
@@ -41,9 +40,10 @@
@Composable
fun EntryItem() {
+ val summary = stringResource(R.string.app_notification_field_summary)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.app_notifications_title)
- override val summary = stringResource(R.string.app_notification_field_summary).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
})
}
diff --git a/src/com/android/settings/spa/notification/AppNotificationsListModel.kt b/src/com/android/settings/spa/notification/AppNotificationsListModel.kt
index 0b9b676..2f3de3a 100644
--- a/src/com/android/settings/spa/notification/AppNotificationsListModel.kt
+++ b/src/com/android/settings/spa/notification/AppNotificationsListModel.kt
@@ -21,15 +21,15 @@
import android.content.pm.ApplicationInfo
import android.icu.text.RelativeDateTimeFormatter
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import com.android.settings.R
import com.android.settings.applications.AppInfoBase
import com.android.settings.notification.app.AppNotificationSettings
import com.android.settings.spa.notification.SpinnerItem.Companion.toSpinnerItem
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.framework.util.asyncFilter
import com.android.settingslib.spa.framework.util.asyncForEach
+import com.android.settingslib.spa.livedata.observeAsCallback
import com.android.settingslib.spa.widget.ui.SpinnerOption
import com.android.settingslib.spaprivileged.model.app.AppEntry
import com.android.settingslib.spaprivileged.model.app.AppListModel
@@ -37,9 +37,11 @@
import com.android.settingslib.spaprivileged.template.app.AppListItemModel
import com.android.settingslib.spaprivileged.template.app.AppListTwoTargetSwitchItem
import com.android.settingslib.utils.StringUtil
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.withContext
data class AppNotificationsRecord(
override val app: ApplicationInfo,
@@ -91,16 +93,17 @@
}.then(super.getComparator(option))
@Composable
- override fun getSummary(option: Int, record: AppNotificationsRecord) = record.sentState?.let {
- when (option.toSpinnerItem()) {
- SpinnerItem.MostRecent -> stateOf(formatLastSent(it.lastSent))
- SpinnerItem.MostFrequent -> stateOf(repository.calculateFrequencySummary(it.sentCount))
- else -> null
+ override fun getSummary(option: Int, record: AppNotificationsRecord): (() -> String)? =
+ record.sentState?.let {
+ when (option.toSpinnerItem()) {
+ SpinnerItem.MostRecent -> ({ formatLastSent(it.lastSent) })
+ SpinnerItem.MostFrequent -> ({ repository.calculateFrequencySummary(it.sentCount) })
+ else -> null
+ }
}
- }
override fun getSpinnerOptions(recordList: List<AppNotificationsRecord>): List<SpinnerOption> =
- SpinnerItem.values().map {
+ SpinnerItem.entries.map {
SpinnerOption(
id = it.ordinal,
text = context.getString(it.stringResId),
@@ -117,12 +120,15 @@
@Composable
override fun AppListItemModel<AppNotificationsRecord>.AppItem() {
+ val changeable by produceState(initialValue = false) {
+ withContext(Dispatchers.Default) {
+ value = repository.isChangeable(record.app)
+ }
+ }
AppListTwoTargetSwitchItem(
onClick = { navigateToAppNotificationSettings(app = record.app) },
- checked = record.controller.isEnabled.observeAsState(),
- changeable = produceState(initialValue = false) {
- value = repository.isChangeable(record.app)
- },
+ checked = record.controller.isEnabled.observeAsCallback(),
+ changeable = { changeable },
onCheckedChange = record.controller::setEnabled,
)
}
@@ -145,6 +151,6 @@
TurnedOff(R.string.filter_notif_blocked_apps);
companion object {
- fun Int.toSpinnerItem(): SpinnerItem = values()[this]
+ fun Int.toSpinnerItem(): SpinnerItem = entries[this]
}
}
diff --git a/src/com/android/settings/spa/notification/NotificationMain.kt b/src/com/android/settings/spa/notification/NotificationMain.kt
index 305f201..b3c7a55 100644
--- a/src/com/android/settings/spa/notification/NotificationMain.kt
+++ b/src/com/android/settings/spa/notification/NotificationMain.kt
@@ -25,13 +25,12 @@
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
+import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
import com.android.settingslib.spa.widget.ui.SettingsIcon
-import com.android.settingslib.spa.framework.common.createSettingsPage
object NotificationMainPageProvider : SettingsPageProvider {
override val name = "NotificationMain"
@@ -53,9 +52,10 @@
fun buildInjectEntry(): SettingsEntryBuilder {
return SettingsEntryBuilder.createInject(owner = owner)
.setUiLayoutFn {
+ val summary = stringResource(R.string.notification_dashboard_summary)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.configure_notification_settings)
- override val summary = stringResource(R.string.notification_dashboard_summary).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
override val icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.Notifications)
diff --git a/src/com/android/settings/spa/system/AppLanguages.kt b/src/com/android/settings/spa/system/AppLanguages.kt
index b878aa7..d836a32 100644
--- a/src/com/android/settings/spa/system/AppLanguages.kt
+++ b/src/com/android/settings/spa/system/AppLanguages.kt
@@ -26,7 +26,6 @@
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.rememberContext
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -52,9 +51,10 @@
@Composable
fun EntryItem() {
+ val summary = stringResource(R.string.app_locale_picker_summary)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.app_locales_picker_menu_title)
- override val summary = stringResource(R.string.app_locale_picker_summary).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
})
}
diff --git a/src/com/android/settings/spa/system/AppLanguagesListModel.kt b/src/com/android/settings/spa/system/AppLanguagesListModel.kt
index 3413ff0..3573e25 100644
--- a/src/com/android/settings/spa/system/AppLanguagesListModel.kt
+++ b/src/com/android/settings/spa/system/AppLanguagesListModel.kt
@@ -23,7 +23,7 @@
import android.net.Uri
import android.os.UserHandle
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -79,12 +79,14 @@
) = recordListFlow.filterItem { it.isAppLocaleSupported }
@Composable
- override fun getSummary(option: Int, record: AppLanguagesRecord): State<String> =
- remember(record.app) {
+ override fun getSummary(option: Int, record: AppLanguagesRecord): () -> String {
+ val summary by remember(record.app) {
flow {
emit(getSummary(record.app))
}.flowOn(Dispatchers.IO)
}.collectAsStateWithLifecycle(initialValue = stringResource(R.string.summary_placeholder))
+ return { summary }
+ }
private fun getSummary(app: ApplicationInfo): String =
AppLocaleDetails.getSummary(context, app).toString()
diff --git a/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt b/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt
index b5cd299..5c1038d 100644
--- a/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt
+++ b/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt
@@ -24,7 +24,6 @@
import com.android.settings.R
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -42,9 +41,10 @@
@Composable
fun EntryItem() {
+ val summary = stringResource(R.string.language_settings)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.language_settings)
- override val summary = stringResource(R.string.language_settings).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
override val icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.Language)
diff --git a/src/com/android/settings/spa/system/SystemMain.kt b/src/com/android/settings/spa/system/SystemMain.kt
index 04ae512..c9aa8cc 100644
--- a/src/com/android/settings/spa/system/SystemMain.kt
+++ b/src/com/android/settings/spa/system/SystemMain.kt
@@ -27,7 +27,6 @@
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -53,9 +52,10 @@
fun buildInjectEntry(): SettingsEntryBuilder {
return SettingsEntryBuilder.createInject(owner = owner)
.setUiLayoutFn {
+ val summary = stringResource(R.string.system_dashboard_summary)
Preference(object : PreferenceModel {
override val title = stringResource(R.string.header_category_system)
- override val summary = stringResource(R.string.system_dashboard_summary).toState()
+ override val summary = { summary }
override val onClick = navigator(name)
override val icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.Info)
diff --git a/src/com/android/settings/wifi/WifiEntryPreference.java b/src/com/android/settings/wifi/WifiEntryPreference.java
index c78f28c..e1add15 100644
--- a/src/com/android/settings/wifi/WifiEntryPreference.java
+++ b/src/com/android/settings/wifi/WifiEntryPreference.java
@@ -38,7 +38,6 @@
import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.Utils;
import com.android.settingslib.wifi.WifiUtils;
-import com.android.wifitrackerlib.BaseWifiTracker;
import com.android.wifitrackerlib.HotspotNetworkEntry;
import com.android.wifitrackerlib.WifiEntry;
@@ -108,7 +107,7 @@
@Override
public void onBindViewHolder(final PreferenceViewHolder view) {
super.onBindViewHolder(view);
- if (BaseWifiTracker.isVerboseLoggingEnabled()) {
+ if (mWifiEntry.isVerboseSummaryEnabled()) {
TextView summary = (TextView) view.findViewById(android.R.id.summary);
if (summary != null) {
summary.setMaxLines(100);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
index 5d3557f..d6a2492 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
@@ -32,11 +32,15 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.view.View;
import androidx.appcompat.app.AlertDialog;
import androidx.test.core.app.ApplicationProvider;
+import com.android.server.accessibility.Flags;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -59,6 +63,8 @@
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Mock
private DialogInterface.OnClickListener mOnClickListener;
@Mock
@@ -90,6 +96,19 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ public void createTutorialPages_turnOnTwoFingerTripleTapShortcut_hasOnePage() {
+ mShortcutTypes |= UserShortcutType.TWOFINGERTRIPLETAP;
+
+ final AlertDialog alertDialog =
+ createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+
+ assertThat(createShortcutTutorialPages(mContext,
+ mShortcutTypes)).hasSize(/* expectedSize= */ 1);
+ assertThat(alertDialog).isNotNull();
+ }
+
+ @Test
public void createTutorialPages_turnOnSoftwareShortcut_hasOnePage() {
mShortcutTypes |= UserShortcutType.SOFTWARE;
diff --git a/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java
index d98b0e7..b615163 100644
--- a/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java
@@ -21,21 +21,27 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.RemoteException;
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowActivityManager;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -56,6 +62,7 @@
private RadioWithImagePreference mRadioButtonPref;
private Context mContext;
private UserAspectRatioDetails mFragment;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
@Before
public void setUp() {
@@ -67,6 +74,8 @@
when(mFragment.getAspectRatioManager()).thenReturn(mUserAspectRatioManager);
ShadowActivityManager.setService(mAm);
mRadioButtonPref = new RadioWithImagePreference(mContext);
+ final FakeFeatureFactory featureFactory = FakeFeatureFactory.setupForTest();
+ mMetricsFeatureProvider = featureFactory.metricsFeatureProvider;
}
@Test
@@ -93,4 +102,31 @@
verify(mUserAspectRatioManager).setUserMinAspectRatio(
any(), anyInt(), anyInt());
}
+
+ @Test
+ public void onRadioButtonClicked_prefChange_logMetrics() throws NullPointerException {
+ // Default was already selected
+ mRadioButtonPref.setKey(KEY_PREF_DEFAULT);
+ mFragment.onRadioButtonClicked(mRadioButtonPref);
+ // Preference changed
+ mRadioButtonPref.setKey(KEY_PREF_3_2);
+ mFragment.onRadioButtonClicked(mRadioButtonPref);
+ InOrder inOrder = inOrder(mMetricsFeatureProvider);
+ // Check the old aspect ratio value is logged as having been unselected
+ inOrder.verify(mMetricsFeatureProvider)
+ .action(
+ eq(SettingsEnums.PAGE_UNKNOWN),
+ eq(SettingsEnums.ACTION_USER_ASPECT_RATIO_APP_DEFAULT_UNSELECTED),
+ eq(SettingsEnums.USER_ASPECT_RATIO_APP_INFO_SETTINGS),
+ any(),
+ anyInt());
+ // Check the new aspect ratio value is logged as having been selected
+ inOrder.verify(mMetricsFeatureProvider)
+ .action(
+ eq(SettingsEnums.PAGE_UNKNOWN),
+ eq(SettingsEnums.ACTION_USER_ASPECT_RATIO_3_2_SELECTED),
+ eq(SettingsEnums.USER_ASPECT_RATIO_APP_INFO_SETTINGS),
+ any(),
+ anyInt());
+ }
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
index cea6676..024f346 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
@@ -33,12 +33,15 @@
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.runner.AndroidJUnit4
import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.shared.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.google.android.setupdesign.GlifLayout
import com.google.android.setupdesign.template.RequireScrollMixin
@@ -65,9 +68,12 @@
backgroundDispatcher,
interactor,
gatekeeperViewModel,
- canSkipConfirm = true,
+ Intro,
+ NavState(true),
+ Default,
)
- private var fingerprintViewModel = FingerprintEnrollViewModel(interactor, backgroundDispatcher)
+ private var fingerprintViewModel =
+ FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel)
private var fingerprintScrollViewModel = FingerprintScrollViewModel()
@Before
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.kt b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.kt
index 90bb048..39b8446 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.kt
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.kt
@@ -23,22 +23,18 @@
import android.os.UserManager
import android.provider.Settings
import androidx.preference.Preference
-import androidx.preference.PreferenceManager
import androidx.test.core.app.ApplicationProvider
import com.android.settings.datausage.DataUsageListTest.ShadowDataUsageBaseFragment
import com.android.settings.datausage.TemplatePreference.NetworkServices
import com.android.settings.datausage.lib.BillingCycleRepository
-import com.android.settings.network.MobileDataEnabledListener
import com.android.settings.testutils.FakeFeatureFactory
import com.android.settingslib.NetworkPolicyEditor
import com.android.settingslib.core.AbstractPreferenceController
-import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.Mockito.doNothing
import org.mockito.Mockito.doReturn
@@ -62,9 +58,6 @@
val mockito: MockitoRule = MockitoJUnit.rule()
@Mock
- private lateinit var mobileDataEnabledListener: MobileDataEnabledListener
-
- @Mock
private lateinit var networkServices: NetworkServices
@Mock
@@ -86,7 +79,6 @@
fun setUp() {
FakeFeatureFactory.setupForTest()
networkServices.mPolicyEditor = mock(NetworkPolicyEditor::class.java)
- dataUsageList.dataStateListener = mobileDataEnabledListener
doReturn(context).`when`(dataUsageList).context
doReturn(userManager).`when`(context).getSystemService(UserManager::class.java)
doReturn(false).`when`(userManager).isGuestUser
@@ -113,46 +105,6 @@
}
@Test
- fun resume_shouldListenDataStateChange() {
- dataUsageList.template = mock(NetworkTemplate::class.java)
- dataUsageList.onCreate(null)
- dataUsageList.dataStateListener = mobileDataEnabledListener
- ReflectionHelpers.setField(
- dataUsageList,
- "mVisibilityLoggerMixin",
- mock(VisibilityLoggerMixin::class.java),
- )
- ReflectionHelpers.setField(
- dataUsageList,
- "mPreferenceManager",
- mock(PreferenceManager::class.java),
- )
- dataUsageList.onResume()
- verify(mobileDataEnabledListener).start(ArgumentMatchers.anyInt())
- dataUsageList.onPause()
- }
-
- @Test
- fun pause_shouldUnlistenDataStateChange() {
- dataUsageList.template = mock(NetworkTemplate::class.java)
- dataUsageList.onCreate(null)
- dataUsageList.dataStateListener = mobileDataEnabledListener
- ReflectionHelpers.setField(
- dataUsageList, "mVisibilityLoggerMixin", mock(
- VisibilityLoggerMixin::class.java
- )
- )
- ReflectionHelpers.setField(
- dataUsageList, "mPreferenceManager", mock(
- PreferenceManager::class.java
- )
- )
- dataUsageList.onResume()
- dataUsageList.onPause()
- verify(mobileDataEnabledListener).stop()
- }
-
- @Test
fun processArgument_shouldGetTemplateFromArgument() {
val args = Bundle()
args.putParcelable(
diff --git a/tests/robotests/src/com/android/settings/development/ShowHdrSdrRatioPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ShowHdrSdrRatioPreferenceControllerTest.java
new file mode 100644
index 0000000..2234754
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/ShowHdrSdrRatioPreferenceControllerTest.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright (C) 2023 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;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+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.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+
+import com.android.settings.flags.Flags;
+import com.android.settings.testutils.shadow.ShadowParcel;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+public class ShowHdrSdrRatioPreferenceControllerTest {
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private TwoStatePreference mPreference;
+ @Mock
+ private IBinder mSurfaceFlinger;
+
+ private ShowHdrSdrRatioPreferenceController mController;
+
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = new ShowHdrSdrRatioPreferenceController(mContext, mSurfaceFlinger, true);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ mController.displayPreference(mScreen);
+ }
+
+ @Test
+ @Config(shadows = ShadowParcel.class)
+ public void onPreferenceChange_settingEnabled_shouldChecked() throws RemoteException {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ assertTrue(mController.isAvailable());
+ ShadowParcel.sReadBoolResult = true;
+ doReturn(true).when(mSurfaceFlinger)
+ .transact(anyInt(), any(), any(), eq(0 /* flags */));
+ mController.onPreferenceChange(mPreference, true /* new value */);
+ verify(mPreference).setChecked(true);
+ }
+
+ @Test
+ @Config(shadows = ShadowParcel.class)
+ public void onPreferenceChange_settingDisabled_shouldUnchecked() throws RemoteException {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ assertTrue(mController.isAvailable());
+ ShadowParcel.sReadBoolResult = false;
+ doReturn(true).when(mSurfaceFlinger)
+ .transact(anyInt(), any(), any(), eq(0 /* flags */));
+ mController.onPreferenceChange(mPreference, false /* new value */);
+ verify(mPreference).setChecked(false);
+ }
+
+ @Test
+ @Config(shadows = ShadowParcel.class)
+ public void updateState_settingEnabled_shouldChecked() throws RemoteException {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ assertTrue(mController.isAvailable());
+ ShadowParcel.sReadBoolResult = true;
+ doReturn(true).when(mSurfaceFlinger)
+ .transact(anyInt(), any(), any(), eq(0 /* flags */));
+ mController.updateState(mPreference);
+ verify(mPreference).setChecked(true);
+ }
+
+ @Test
+ @Config(shadows = ShadowParcel.class)
+ public void updateState_settingDisabled_shouldUnchecked() throws RemoteException {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ assertTrue(mController.isAvailable());
+ ShadowParcel.sReadBoolResult = false;
+ doReturn(true).when(mSurfaceFlinger)
+ .transact(anyInt(), any(), any(), eq(0 /* flags */));
+ mController.updateState(mPreference);
+ verify(mPreference).setChecked(false);
+ }
+
+ @Test
+ public void settingNotAvailable_isHdrSdrRatioAvailableFalse_flagsOff() {
+ mSetFlagsRule.disableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ mController = new ShowHdrSdrRatioPreferenceController(mContext, mSurfaceFlinger, true);
+ assertFalse(mController.isAvailable());
+ }
+
+ @Test
+ public void settingNotAvailable_isHdrSdrRatioAvailableTrue_flagsOn() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ mController = new ShowHdrSdrRatioPreferenceController(mContext, mSurfaceFlinger, false);
+ assertFalse(mController.isAvailable());
+ }
+
+ @Test
+ @Config(shadows = ShadowParcel.class)
+ public void onDeveloperOptionsSwitchDisabled_preferenceUnchecked_shouldNotTurnOffPreference()
+ throws RemoteException {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ assertTrue(mController.isAvailable());
+ ShadowParcel.sReadBoolResult = false;
+ doReturn(true).when(mSurfaceFlinger)
+ .transact(anyInt(), any(), any(), eq(0 /* flags */));
+ when(mPreference.isChecked()).thenReturn(false);
+ mController.onDeveloperOptionsSwitchDisabled();
+
+ mController.writeShowHdrSdrRatioSetting(true);
+ verify(mPreference).setChecked(false);
+ verify(mPreference).setEnabled(false);
+ }
+
+ @Test
+ @Config(shadows = ShadowParcel.class)
+ public void onDeveloperOptionsSwitchDisabled_preferenceChecked_shouldTurnOffPreference()
+ throws RemoteException {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
+ assertTrue(mController.isAvailable());
+ ShadowParcel.sReadBoolResult = true;
+ doReturn(true).when(mSurfaceFlinger)
+ .transact(anyInt(), any(), any(), eq(0 /* flags */));
+ when(mPreference.isChecked()).thenReturn(true);
+ mController.onDeveloperOptionsSwitchDisabled();
+
+ mController.writeShowHdrSdrRatioSetting(false);
+ verify(mPreference).setChecked(false);
+ verify(mPreference).setEnabled(false);
+ }
+}
+
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 9131051..d01d7e0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -17,6 +17,7 @@
package com.android.settings.fuelgauge;
import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
+import static com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
import static com.google.common.truth.Truth.assertThat;
@@ -53,13 +54,12 @@
import com.android.settings.testutils.shadow.ShadowActivityManager;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.LayoutPreference;
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.After;
import org.junit.Before;
@@ -78,11 +78,12 @@
import java.util.concurrent.TimeUnit;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {
- ShadowEntityHeaderController.class,
- ShadowActivityManager.class,
- com.android.settings.testutils.shadow.ShadowFragment.class,
-})
+@Config(
+ shadows = {
+ ShadowEntityHeaderController.class,
+ ShadowActivityManager.class,
+ com.android.settings.testutils.shadow.ShadowFragment.class,
+ })
public class AdvancedPowerUsageDetailTest {
private static final String APP_LABEL = "app label";
private static final String SUMMARY = "summary";
@@ -95,42 +96,26 @@
private static final long FOREGROUND_SERVICE_TIME_MS = 444;
private static final long FOREGROUND_TIME_MS =
FOREGROUND_ACTIVITY_TIME_MS + FOREGROUND_SERVICE_TIME_MS;
- private static final String KEY_PREF_UNRESTRICTED = "unrestricted_pref";
- private static final String KEY_PREF_OPTIMIZED = "optimized_pref";
- private static final String KEY_PREF_RESTRICTED = "restricted_pref";
+ private static final String KEY_ALLOW_BACKGROUND_USAGE = "allow_background_usage";
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private FragmentActivity mActivity;
- @Mock
- private EntityHeaderController mEntityHeaderController;
- @Mock
- private LayoutPreference mHeaderPreference;
- @Mock
- private ApplicationsState mState;
- @Mock
- private ApplicationsState.AppEntry mAppEntry;
- @Mock
- private Bundle mBundle;
- @Mock
- private BatteryEntry mBatteryEntry;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private InstallSourceInfo mInstallSourceInfo;
- @Mock
- private AppOpsManager mAppOpsManager;
- @Mock
- private LoaderManager mLoaderManager;
- @Mock
- private BatteryOptimizeUtils mBatteryOptimizeUtils;
- @Mock
- private BackupManager mBackupManager;
+
+ @Mock private EntityHeaderController mEntityHeaderController;
+ @Mock private LayoutPreference mHeaderPreference;
+ @Mock private ApplicationsState mState;
+ @Mock private ApplicationsState.AppEntry mAppEntry;
+ @Mock private Bundle mBundle;
+ @Mock private BatteryEntry mBatteryEntry;
+ @Mock private PackageManager mPackageManager;
+ @Mock private InstallSourceInfo mInstallSourceInfo;
+ @Mock private AppOpsManager mAppOpsManager;
+ @Mock private LoaderManager mLoaderManager;
+ @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @Mock private BackupManager mBackupManager;
private Context mContext;
- private FooterPreference mFooterPreference;
- private SelectorWithWidgetPreference mRestrictedPreference;
- private SelectorWithWidgetPreference mOptimizePreference;
- private SelectorWithWidgetPreference mUnrestrictedPreference;
+ private PrimarySwitchPreference mAllowBackgroundUsagePreference;
private AdvancedPowerUsageDetail mFragment;
private SettingsActivity mTestActivity;
private FakeFeatureFactory mFeatureFactory;
@@ -154,19 +139,26 @@
doReturn(mLoaderManager).when(mFragment).getLoaderManager();
ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
- doReturn(mEntityHeaderController).when(mEntityHeaderController)
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
.setButtonActions(anyInt(), anyInt());
- doReturn(mEntityHeaderController).when(mEntityHeaderController)
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
.setIcon(nullable(Drawable.class));
- doReturn(mEntityHeaderController).when(mEntityHeaderController).setIcon(nullable(
- ApplicationsState.AppEntry.class));
- doReturn(mEntityHeaderController).when(mEntityHeaderController)
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setIcon(nullable(ApplicationsState.AppEntry.class));
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
.setLabel(nullable(String.class));
- doReturn(mEntityHeaderController).when(mEntityHeaderController)
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
.setLabel(nullable(String.class));
- doReturn(mEntityHeaderController).when(mEntityHeaderController)
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
.setLabel(nullable(ApplicationsState.AppEntry.class));
- doReturn(mEntityHeaderController).when(mEntityHeaderController)
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
.setSummary(nullable(String.class));
when(mBatteryEntry.getUid()).thenReturn(UID);
@@ -189,23 +181,20 @@
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- Answer<Void> callable = invocation -> {
- mBundle = captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
- System.out.println("mBundle = " + mBundle);
- return null;
- };
- doAnswer(callable).when(mActivity).startActivityAsUser(captor.capture(),
- nullable(UserHandle.class));
+ Answer<Void> callable =
+ invocation -> {
+ mBundle = captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ System.out.println("mBundle = " + mBundle);
+ return null;
+ };
+ doAnswer(callable)
+ .when(mActivity)
+ .startActivityAsUser(captor.capture(), nullable(UserHandle.class));
doAnswer(callable).when(mActivity).startActivity(captor.capture());
- mFooterPreference = new FooterPreference(mContext);
- mRestrictedPreference = new SelectorWithWidgetPreference(mContext);
- mOptimizePreference = new SelectorWithWidgetPreference(mContext);
- mUnrestrictedPreference = new SelectorWithWidgetPreference(mContext);
- mFragment.mFooterPreference = mFooterPreference;
- mFragment.mRestrictedPreference = mRestrictedPreference;
- mFragment.mOptimizePreference = mOptimizePreference;
- mFragment.mUnrestrictedPreference = mUnrestrictedPreference;
+ mAllowBackgroundUsagePreference = new PrimarySwitchPreference(mContext);
+ mAllowBackgroundUsagePreference.setKey(KEY_ALLOW_BACKGROUND_USAGE);
+ mFragment.mAllowBackgroundUsagePreference = mAllowBackgroundUsagePreference;
}
@After
@@ -229,7 +218,9 @@
@Test
public void initHeader_HasAppEntry_BuildByAppEntry() {
- ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+ ReflectionHelpers.setStaticField(
+ AppUtils.class,
+ "sInstantAppDataProvider",
new InstantAppDataProvider() {
@Override
public boolean isInstantApp(ApplicationInfo info) {
@@ -246,7 +237,9 @@
@Test
public void initHeader_HasAppEntry_InstantApp() {
- ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+ ReflectionHelpers.setStaticField(
+ AppUtils.class,
+ "sInstantAppDataProvider",
new InstantAppDataProvider() {
@Override
public boolean isInstantApp(ApplicationInfo info) {
@@ -263,16 +256,13 @@
@Test
public void startBatteryDetailPage_invalidToShowSummary_noFGBDData() {
- AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment,
- mBatteryEntry, USAGE_PERCENT);
+ AdvancedPowerUsageDetail.startBatteryDetailPage(
+ mActivity, mFragment, mBatteryEntry, USAGE_PERCENT);
assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
- assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME))
- .isEqualTo(0);
- assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME))
- .isEqualTo(0);
- assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME))
- .isEqualTo(0);
+ assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(0);
+ assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(0);
+ assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME)).isEqualTo(0);
assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
.isEqualTo(USAGE_PERCENT);
}
@@ -286,18 +276,22 @@
verify(mActivity).startActivity(captor.capture());
- assertThat(captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
- .getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME))
+ assertThat(
+ captor.getValue()
+ .getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
+ .getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME))
.isEqualTo(PACKAGE_NAME[0]);
- assertThat(captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
- .getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
+ assertThat(
+ captor.getValue()
+ .getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
+ .getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
.isEqualTo("0%");
}
@Test
- public void startBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName() throws
- PackageManager.NameNotFoundException {
+ public void startBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName()
+ throws PackageManager.NameNotFoundException {
doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
AdvancedPowerUsageDetail.startBatteryDetailPage(
@@ -307,70 +301,60 @@
}
@Test
- public void initPreferenceForTriState_isValidPackageName_hasCorrectString() {
+ public void initFooter_isValidPackageName_hasCorrectString() {
when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
- mFragment.initPreferenceForTriState(mContext);
+ mFragment.initFooter();
- assertThat(mFooterPreference.getTitle().toString())
+ assertThat(mAllowBackgroundUsagePreference.getSummary().toString())
.isEqualTo("This app requires optimized battery usage.");
}
@Test
- public void initPreferenceForTriState_isSystemOrDefaultApp_hasCorrectString() {
+ public void initFooter_isSystemOrDefaultApp_hasCorrectString() {
when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
- mFragment.initPreferenceForTriState(mContext);
+ mFragment.initFooter();
- assertThat(mFooterPreference.getTitle()
- .toString()).isEqualTo("This app requires unrestricted battery usage.");
+ assertThat(mAllowBackgroundUsagePreference.getSummary().toString())
+ .isEqualTo("This app requires unrestricted battery usage.");
}
@Test
- public void initPreferenceForTriState_hasCorrectString() {
+ public void initFooter_hasCorrectString() {
when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false);
- mFragment.initPreferenceForTriState(mContext);
+ mFragment.initFooter();
- assertThat(mFooterPreference.getTitle().toString())
- .isEqualTo("Changing how an app uses your battery can affect its performance.");
- }
-
- @Test
- public void onRadioButtonClicked_clickOptimizePref_optimizePreferenceChecked() {
- mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
- mRestrictedPreference.setKey(KEY_PREF_RESTRICTED);
- mUnrestrictedPreference.setKey(KEY_PREF_UNRESTRICTED);
- mFragment.onRadioButtonClicked(mOptimizePreference);
-
- assertThat(mOptimizePreference.isChecked()).isTrue();
- assertThat(mRestrictedPreference.isChecked()).isFalse();
- assertThat(mUnrestrictedPreference.isChecked()).isFalse();
+ assertThat(mAllowBackgroundUsagePreference.getSummary().toString())
+ .isEqualTo("Enable for real-time updates, disable to save battery");
}
@Test
public void onPause_optimizationModeChanged_logPreference()
throws PackageManager.NameNotFoundException, InterruptedException {
final String packageName = "testPackageName";
- final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
- mFragment.mOptimizationMode = mode;
- when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+ final int restrictedMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ final int optimizedMode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+ mFragment.mOptimizationMode = restrictedMode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(restrictedMode);
when(mBatteryOptimizeUtils.getPackageName()).thenReturn(packageName);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.getInstallSourceInfo(anyString())).thenReturn(mInstallSourceInfo);
when(mInstallSourceInfo.getInitiatingPackageName()).thenReturn("com.android.vending");
- mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
- mFragment.onRadioButtonClicked(mOptimizePreference);
+ mFragment.onPreferenceChange(mAllowBackgroundUsagePreference, true);
+ verify(mBatteryOptimizeUtils).setAppUsageState(optimizedMode, Action.APPLY);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(optimizedMode);
mFragment.onPause();
TimeUnit.SECONDS.sleep(1);
verify(mMetricsFeatureProvider)
.action(
SettingsEnums.OPEN_APP_BATTERY_USAGE,
- SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
+ SettingsEnums.ACTION_APP_BATTERY_USAGE_ALLOW_BACKGROUND,
SettingsEnums.OPEN_APP_BATTERY_USAGE,
packageName,
/* consumed battery */ 0);
@@ -379,15 +363,20 @@
@Test
public void onPause_optimizationModeIsNotChanged_notInvokeLogging()
throws PackageManager.NameNotFoundException, InterruptedException {
- final int mode = BatteryOptimizeUtils.MODE_OPTIMIZED;
- mFragment.mOptimizationMode = mode;
- when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+ final int restrictedMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ final int optimizedMode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+ mFragment.mOptimizationMode = restrictedMode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(restrictedMode);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.getInstallSourceInfo(anyString())).thenReturn(mInstallSourceInfo);
when(mInstallSourceInfo.getInitiatingPackageName()).thenReturn("com.android.vending");
- mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
- mFragment.onRadioButtonClicked(mOptimizePreference);
+ mFragment.onPreferenceChange(mAllowBackgroundUsagePreference, true);
+ verify(mBatteryOptimizeUtils).setAppUsageState(optimizedMode, Action.APPLY);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(optimizedMode);
+ mFragment.onPreferenceChange(mAllowBackgroundUsagePreference, false);
+ verify(mBatteryOptimizeUtils).setAppUsageState(restrictedMode, Action.APPLY);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(restrictedMode);
mFragment.onPause();
TimeUnit.SECONDS.sleep(1);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AllowBackgroundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AllowBackgroundPreferenceControllerTest.java
new file mode 100644
index 0000000..261a315
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AllowBackgroundPreferenceControllerTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import com.android.settingslib.widget.MainSwitchPreference;
+
+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 AllowBackgroundPreferenceControllerTest {
+ private static final int UID = 12345;
+ private static final String PACKAGE_NAME = "com.android.app";
+
+ private AllowBackgroundPreferenceController mController;
+ private MainSwitchPreference mMainSwitchPreference;
+ private BatteryOptimizeUtils mBatteryOptimizeUtils;
+
+ @Mock private PackageManager mMockPackageManager;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ Context context = spy(RuntimeEnvironment.application);
+ BatteryUtils.getInstance(context).reset();
+ doReturn(UID)
+ .when(mMockPackageManager)
+ .getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA);
+
+ mController = new AllowBackgroundPreferenceController(context, UID, PACKAGE_NAME);
+ mMainSwitchPreference = new MainSwitchPreference(RuntimeEnvironment.application);
+ mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(context, UID, PACKAGE_NAME));
+ mController.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
+ }
+
+ @Test
+ public void testUpdateState_isValidPackage_prefEnabled() {
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false);
+
+ mController.updateState(mMainSwitchPreference);
+
+ assertThat(mBatteryOptimizeUtils.isOptimizeModeMutable()).isTrue();
+ assertThat(mMainSwitchPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void testUpdateState_invalidPackage_prefDisabled() {
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false);
+
+ mController.updateState(mMainSwitchPreference);
+
+ assertThat(mBatteryOptimizeUtils.isOptimizeModeMutable()).isFalse();
+ assertThat(mMainSwitchPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testUpdateState_isSystemOrDefaultAppAndRestrictedStates_prefChecked() {
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_RESTRICTED);
+
+ mController.updateState(mMainSwitchPreference);
+
+ assertThat(mMainSwitchPreference.isEnabled()).isFalse();
+ assertThat(mMainSwitchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() {
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED);
+
+ mController.updateState(mMainSwitchPreference);
+
+ assertThat(mMainSwitchPreference.isEnabled()).isFalse();
+ assertThat(mMainSwitchPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void testUpdateState_isRestrictedStates_prefChecked() {
+ when(mBatteryOptimizeUtils.isOptimizeModeMutable()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_RESTRICTED);
+
+ mController.updateState(mMainSwitchPreference);
+
+ assertThat(mMainSwitchPreference.isEnabled()).isTrue();
+ assertThat(mMainSwitchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void testUpdateState_prefUnchecked() {
+ when(mBatteryOptimizeUtils.isOptimizeModeMutable()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED);
+
+ mController.updateState(mMainSwitchPreference);
+
+ assertThat(mMainSwitchPreference.isEnabled()).isTrue();
+ assertThat(mMainSwitchPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() {
+ mMainSwitchPreference.setKey(
+ AllowBackgroundPreferenceController.KEY_ALLOW_BACKGROUND_USAGE);
+ mController.handlePreferenceTreeClick(mMainSwitchPreference);
+
+ assertThat(mController.handlePreferenceTreeClick(mMainSwitchPreference)).isTrue();
+ }
+
+ @Test
+ public void testHandlePreferenceTreeClick_incorrectPrefKey_noAction() {
+ assertThat(mController.handlePreferenceTreeClick(mMainSwitchPreference)).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java
index 0b6051b..5c3addf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java
@@ -91,26 +91,25 @@
public void testGetAvailabilityStatus_smartBatterySupported_returnDisabled() {
doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isSmartBatterySupported();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
}
@Test
public void testGetAvailabilityStatus_smartBatteryUnSupported_returnAvailable() {
doReturn(false).when(mFeatureFactory.powerUsageFeatureProvider).isSmartBatterySupported();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
}
private void putAutoRestrictionValue(int value) {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.APP_AUTO_RESTRICTION_ENABLED,
- value);
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.APP_AUTO_RESTRICTION_ENABLED, value);
}
private int getAutoRestrictionValue() {
- return Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON);
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
index b8c72ee..8980800 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
@@ -94,33 +94,24 @@
private BatteryBackupHelper mBatteryBackupHelper;
private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private BackupDataOutput mBackupDataOutput;
- @Mock
- private BackupDataInputStream mBackupDataInputStream;
- @Mock
- private IDeviceIdleController mDeviceController;
- @Mock
- private IPackageManager mIPackageManager;
- @Mock
- private AppOpsManager mAppOpsManager;
- @Mock
- private UserManager mUserManager;
- @Mock
- private PowerAllowlistBackend mPowerAllowlistBackend;
- @Mock
- private BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @Mock private PackageManager mPackageManager;
+ @Mock private BackupDataOutput mBackupDataOutput;
+ @Mock private BackupDataInputStream mBackupDataInputStream;
+ @Mock private IDeviceIdleController mDeviceController;
+ @Mock private IPackageManager mIPackageManager;
+ @Mock private AppOpsManager mAppOpsManager;
+ @Mock private UserManager mUserManager;
+ @Mock private PowerAllowlistBackend mPowerAllowlistBackend;
+ @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mPowerUsageFeatureProvider =
- FakeFeatureFactory.setupForTest().powerUsageFeatureProvider;
+ mPowerUsageFeatureProvider = FakeFeatureFactory.setupForTest().powerUsageFeatureProvider;
mContext = spy(RuntimeEnvironment.application);
mStringWriter = new StringWriter();
mPrintWriter = new PrintWriter(mStringWriter);
+ BatteryUtils.getInstance(mContext).reset();
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
@@ -172,7 +163,7 @@
public void backupOptimizationMode_nullInstalledApps_ignoreBackupOptimization()
throws Exception {
final UserInfo userInfo =
- new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ new UserInfo(/* userId= */ 0, /* userName= */ "google", /* flag= */ 0);
doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
doThrow(new RuntimeException())
.when(mIPackageManager)
@@ -198,8 +189,7 @@
}
@Test
- public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp()
- throws Exception {
+ public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp() throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, UID1, PACKAGE_NAME2, PACKAGE_NAME3);
// Sets "com.android.testing.1" as system app.
@@ -293,8 +283,7 @@
// Invoke the restoreEntity() method 2nd time.
mBatteryBackupHelper.restoreEntity(mBackupDataInputStream);
- assertThat(TestUtils.getScheduledLevel(mContext))
- .isEqualTo(invalidScheduledLevel);
+ assertThat(TestUtils.getScheduledLevel(mContext)).isEqualTo(invalidScheduledLevel);
}
@Test
@@ -312,9 +301,14 @@
@Test
public void restoreOptimizationMode_invalidModeFormat_skipRestore() throws Exception {
final String invalidNumberFormat = "google";
- final String packageModes =
- PACKAGE_NAME1 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER +
- PACKAGE_NAME2 + DELIMITER_MODE + invalidNumberFormat;
+ final String package1Mode = PACKAGE_NAME1
+ + DELIMITER_MODE
+ + MODE_RESTRICTED
+ + DELIMITER;
+ final String package2Mode = PACKAGE_NAME2
+ + DELIMITER_MODE
+ + invalidNumberFormat;
+ final String packageModes = package1Mode + package2Mode;
mBatteryBackupHelper.restoreOptimizationMode(packageModes.getBytes());
TimeUnit.SECONDS.sleep(1);
@@ -327,10 +321,19 @@
@Test
public void restoreOptimizationMode_restoreExpectedModes() throws Exception {
- final String packageModes =
- PACKAGE_NAME1 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER +
- PACKAGE_NAME2 + DELIMITER_MODE + MODE_UNRESTRICTED + DELIMITER +
- PACKAGE_NAME3 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER;
+ final String package1Mode = PACKAGE_NAME1
+ + DELIMITER_MODE
+ + MODE_RESTRICTED
+ + DELIMITER;
+ final String package2Mode = PACKAGE_NAME2
+ + DELIMITER_MODE
+ + MODE_UNRESTRICTED
+ + DELIMITER;
+ final String package3Mode = PACKAGE_NAME3
+ + DELIMITER_MODE
+ + MODE_RESTRICTED
+ + DELIMITER;
+ final String packageModes = package1Mode + package2Mode + package3Mode;
mBatteryBackupHelper.restoreOptimizationMode(packageModes.getBytes());
TimeUnit.SECONDS.sleep(1);
@@ -357,13 +360,14 @@
verifyBackupData(inOrder, BatteryBackupHelper.KEY_BUILD_PRODUCT, Build.PRODUCT);
verifyBackupData(inOrder, BatteryBackupHelper.KEY_BUILD_MANUFACTURER, Build.MANUFACTURER);
verifyBackupData(inOrder, BatteryBackupHelper.KEY_BUILD_FINGERPRINT, Build.FINGERPRINT);
- inOrder.verify(mBackupDataOutput, never()).writeEntityHeader(
- eq(BatteryBackupHelper.KEY_BUILD_METADATA_1), anyInt());
+ inOrder.verify(mBackupDataOutput, never())
+ .writeEntityHeader(eq(BatteryBackupHelper.KEY_BUILD_METADATA_1), anyInt());
verifyBackupData(inOrder, BatteryBackupHelper.KEY_BUILD_METADATA_2, deviceMetadata);
}
private void mockUid(int uid, String packageName) throws Exception {
- doReturn(uid).when(mPackageManager)
+ doReturn(uid)
+ .when(mPackageManager)
.getPackageUid(packageName, PackageManager.GET_META_DATA);
}
@@ -383,8 +387,8 @@
final Set<String> expectedResultSet =
Set.of(expectedResult.split(BatteryBackupHelper.DELIMITER));
- verify(mBackupDataOutput).writeEntityHeader(
- BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);
+ verify(mBackupDataOutput)
+ .writeEntityHeader(BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);
verify(mBackupDataOutput).writeEntityData(captor.capture(), eq(expectedBytes.length));
final String actualResult = new String(captor.getValue());
final Set<String> actualResultSet =
@@ -392,11 +396,12 @@
assertThat(actualResultSet).isEqualTo(expectedResultSet);
}
- private void createTestingData(String packageName1, int uid1, String packageName2,
- String packageName3) throws Exception {
+ private void createTestingData(
+ String packageName1, int uid1, String packageName2, String packageName3)
+ throws Exception {
// Sets the getInstalledApplications() method for testing.
final UserInfo userInfo =
- new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ new UserInfo(/* userId= */ 0, /* userName= */ "google", /* flag= */ 0);
doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
final ApplicationInfo applicationInfo1 = new ApplicationInfo();
applicationInfo1.enabled = true;
@@ -412,10 +417,12 @@
applicationInfo3.uid = 3;
applicationInfo3.packageName = packageName3;
applicationInfo3.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
- doReturn(new ParceledListSlice<ApplicationInfo>(
- Arrays.asList(applicationInfo1, applicationInfo2, applicationInfo3)))
- .when(mIPackageManager)
- .getInstalledApplications(anyLong(), anyInt());
+ doReturn(
+ new ParceledListSlice<ApplicationInfo>(
+ Arrays.asList(
+ applicationInfo1, applicationInfo2, applicationInfo3)))
+ .when(mIPackageManager)
+ .getInstalledApplications(anyLong(), anyInt());
// Sets the AppOpsManager for checkOpNoThrow() method.
doReturn(AppOpsManager.MODE_ALLOWED)
.when(mAppOpsManager)
@@ -433,8 +440,8 @@
new ArraySet<>(Arrays.asList(applicationInfo1, applicationInfo2, applicationInfo3));
}
- private void verifyBackupData(
- InOrder inOrder, String dataKey, String dataContent) throws Exception {
+ private void verifyBackupData(InOrder inOrder, String dataKey, String dataContent)
+ throws Exception {
final byte[] expectedBytes = dataContent.getBytes();
inOrder.verify(mBackupDataOutput).writeEntityHeader(dataKey, expectedBytes.length);
inOrder.verify(mBackupDataOutput).writeEntityData(expectedBytes, expectedBytes.length);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
index 62f812d..2f3f5c5 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
@@ -54,8 +54,7 @@
private static final int BATTERY_INTENT_LEVEL = 80;
private static final int BATTERY_INTENT_SCALE = 100;
- @Mock
- private BatteryBroadcastReceiver.OnBatteryChangedListener mBatteryListener;
+ @Mock private BatteryBroadcastReceiver.OnBatteryChangedListener mBatteryListener;
private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
private Context mContext;
private Intent mChargingIntent;
@@ -75,8 +74,8 @@
mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
mChargingIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_INTENT_LEVEL);
mChargingIntent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_INTENT_SCALE);
- mChargingIntent
- .putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
+ mChargingIntent.putExtra(
+ BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
}
@Test
@@ -85,8 +84,10 @@
assertThat(mBatteryBroadcastReceiver.mBatteryLevel)
.isEqualTo(Utils.getBatteryPercentage(mChargingIntent));
- assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(
- Utils.getBatteryStatus(mContext, mChargingIntent, /* compactStatus= */ false));
+ assertThat(mBatteryBroadcastReceiver.mBatteryStatus)
+ .isEqualTo(
+ Utils.getBatteryStatus(
+ mContext, mChargingIntent, /* compactStatus= */ false));
verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL);
}
@@ -103,7 +104,8 @@
@Test
public void onReceive_chargingStatusChanged_dataUpdated() {
- mChargingIntent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
+ mChargingIntent.putExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS,
BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
@@ -123,8 +125,8 @@
@Test
public void onReceive_powerSaveModeChanged_listenerInvoked() {
- mBatteryBroadcastReceiver.onReceive(mContext,
- new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
+ mBatteryBroadcastReceiver.onReceive(
+ mContext, new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_SAVER);
}
@@ -150,16 +152,16 @@
@Test
public void onReceive_dockDefenderBypassed_listenerInvoked() {
- mBatteryBroadcastReceiver.onReceive(mContext,
- new Intent(BatteryUtils.BYPASS_DOCK_DEFENDER_ACTION));
+ mBatteryBroadcastReceiver.onReceive(
+ mContext, new Intent(BatteryUtils.BYPASS_DOCK_DEFENDER_ACTION));
verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_STATUS);
}
@Test
public void onReceive_usbPortComplianceChanged_listenerInvoked() {
- mBatteryBroadcastReceiver.onReceive(mContext,
- new Intent(UsbManager.ACTION_USB_PORT_COMPLIANCE_CHANGED));
+ mBatteryBroadcastReceiver.onReceive(
+ mContext, new Intent(UsbManager.ACTION_USB_PORT_COMPLIANCE_CHANGED));
verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_STATUS);
}
@@ -173,8 +175,10 @@
assertThat(mBatteryBroadcastReceiver.mBatteryLevel)
.isEqualTo(Utils.getBatteryPercentage(mChargingIntent));
- assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(
- Utils.getBatteryStatus(mContext, mChargingIntent, /* compactStatus= */ false));
+ assertThat(mBatteryBroadcastReceiver.mBatteryStatus)
+ .isEqualTo(
+ Utils.getBatteryStatus(
+ mContext, mChargingIntent, /* compactStatus= */ false));
assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
.isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
assertThat(mBatteryBroadcastReceiver.mChargingStatus)
@@ -188,10 +192,11 @@
mBatteryBroadcastReceiver.register();
ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class);
- verify(mContext).registerReceiver(
- eq(mBatteryBroadcastReceiver),
- captor.capture(),
- eq(Context.RECEIVER_EXPORTED));
+ verify(mContext)
+ .registerReceiver(
+ eq(mBatteryBroadcastReceiver),
+ captor.capture(),
+ eq(Context.RECEIVER_EXPORTED));
assertAction(captor, Intent.ACTION_BATTERY_CHANGED);
assertAction(captor, PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
assertAction(captor, BatteryUtils.BYPASS_DOCK_DEFENDER_ACTION);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 04d5dbf..83ff582 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -68,22 +68,14 @@
private static final String TIME_LEFT = "2h30min";
private static final String BATTERY_STATUS = "Charging";
- @Mock
- private PreferenceScreen mPreferenceScreen;
- @Mock
- private BatteryInfo mBatteryInfo;
- @Mock
- private EntityHeaderController mEntityHeaderController;
- @Mock
- private UsageProgressBarPreference mBatteryUsageProgressBarPref;
- @Mock
- private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
- @Mock
- private UsbPort mUsbPort;
- @Mock
- private UsbManager mUsbManager;
- @Mock
- private UsbPortStatus mUsbPortStatus;
+ @Mock private PreferenceScreen mPreferenceScreen;
+ @Mock private BatteryInfo mBatteryInfo;
+ @Mock private EntityHeaderController mEntityHeaderController;
+ @Mock private UsageProgressBarPreference mBatteryUsageProgressBarPref;
+ @Mock private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
+ @Mock private UsbPort mUsbPort;
+ @Mock private UsbManager mUsbManager;
+ @Mock private UsbPortStatus mUsbPortStatus;
private BatteryHeaderPreferenceController mController;
private Context mContext;
@@ -104,8 +96,9 @@
mBatteryIntent.putExtra(BatteryManager.EXTRA_PLUGGED, 1);
doReturn(mBatteryIntent).when(mContext).registerReceiver(any(), any());
- doReturn(mBatteryUsageProgressBarPref).when(mPreferenceScreen)
- .findPreference(BatteryHeaderPreferenceController.KEY_BATTERY_HEADER);
+ doReturn(mBatteryUsageProgressBarPref)
+ .when(mPreferenceScreen)
+ .findPreference(BatteryHeaderPreferenceController.KEY_BATTERY_HEADER);
mBatteryInfo.batteryLevel = BATTERY_LEVEL;
@@ -235,8 +228,8 @@
@Test
public void updateHeaderByBatteryTips_lowBatteryTip_showLowBattery() {
setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
- BatteryTip lowBatteryTip = new LowBatteryTip(
- BatteryTip.StateType.NEW, /* powerSaveModeOn */false);
+ BatteryTip lowBatteryTip =
+ new LowBatteryTip(BatteryTip.StateType.NEW, /* powerSaveModeOn */ false);
mController.updateHeaderByBatteryTips(lowBatteryTip, mBatteryInfo);
@@ -265,8 +258,8 @@
@Test
public void updateHeaderByBatteryTips_noBatteryInfo_noAction() {
- BatteryTip lowBatteryTip = new LowBatteryTip(
- BatteryTip.StateType.NEW, /* powerSaveModeOn */false);
+ BatteryTip lowBatteryTip =
+ new LowBatteryTip(BatteryTip.StateType.NEW, /* powerSaveModeOn */ false);
mController.updateHeaderByBatteryTips(lowBatteryTip, null);
@@ -288,8 +281,10 @@
mController.updateHeaderPreference(mBatteryInfo);
- verify(mBatteryUsageProgressBarPref).setBottomSummary(mContext.getString(
- com.android.settingslib.R.string.battery_info_status_not_charging));
+ verify(mBatteryUsageProgressBarPref)
+ .setBottomSummary(
+ mContext.getString(
+ com.android.settingslib.R.string.battery_info_status_not_charging));
}
@Test
@@ -302,8 +297,8 @@
@Test
public void getAvailabilityStatus_returnAvailableUnsearchable() {
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
}
@Test
@@ -319,12 +314,13 @@
public void displayPreference_init_showLoading() {
mController.displayPreference(mPreferenceScreen);
- verify(mBatteryUsageProgressBarPref).setBottomSummary(
- mContext.getString(R.string.settings_license_activity_loading));
+ verify(mBatteryUsageProgressBarPref)
+ .setBottomSummary(mContext.getString(R.string.settings_license_activity_loading));
}
private CharSequence formatBatteryPercentageText() {
- return TextUtils.expandTemplate(mContext.getText(R.string.battery_header_title_alternate),
+ return TextUtils.expandTemplate(
+ mContext.getText(R.string.battery_header_title_alternate),
NumberFormat.getIntegerInstance().format(BATTERY_LEVEL));
}
@@ -333,7 +329,7 @@
mBatteryInfo.statusLabel = BATTERY_STATUS;
mBatteryInfo.discharging = isDischarging;
- when(mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(
- mController, mBatteryInfo)).thenReturn(updatedByStatusFeature);
+ when(mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(mController, mBatteryInfo))
+ .thenReturn(updatedByStatusFeature);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
index b787239..3685a1d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
@@ -46,10 +46,8 @@
private static final long TEST_TIME_REMAINING = 1000L;
- @Mock
- private BatteryStatsManager mBatteryStatsManager;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryStatsManager mBatteryStatsManager;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
index 2ba9f33..0339f57 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
@@ -72,21 +72,20 @@
private static final String ENHANCED_STRING_SUFFIX = "based on your usage";
private static final String BATTERY_RUN_OUT_PREFIX = "Battery may run out by";
private static final long TEST_CHARGE_TIME_REMAINING = TimeUnit.MINUTES.toMicros(1);
- private static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED =
- "1 min left until full";
+ private static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED = "1 min left until full";
private static final String TEST_BATTERY_LEVEL_10 = "10%";
private static final String FIFTEEN_MIN_FORMATTED = "15 min";
- private static final Estimate MOCK_ESTIMATE = new Estimate(
- 1000, /* estimateMillis */
- false, /* isBasedOnUsage */
- 1000 /* averageDischargeTime */);
+ private static final Estimate MOCK_ESTIMATE =
+ new Estimate(
+ 1000, /* estimateMillis */
+ false, /* isBasedOnUsage */
+ 1000 /* averageDischargeTime */);
private Intent mDisChargingBatteryBroadcast;
private Intent mChargingBatteryBroadcast;
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
@Before
public void setUp() {
@@ -99,17 +98,22 @@
mChargingBatteryBroadcast = BatteryTestUtils.getChargingIntent();
doReturn(false).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend();
- Settings.Global.putInt(mContext.getContentResolver(),
- BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS,
+ 0);
}
@Test
public void testGetBatteryInfo_hasStatusLabel() {
doReturn(REMAINING_TIME_NULL).when(mBatteryUsageStats).getBatteryTimeRemainingMs();
- BatteryInfo info = BatteryInfo.getBatteryInfoOld(mContext,
- mDisChargingBatteryBroadcast, mBatteryUsageStats,
- SystemClock.elapsedRealtime() * 1000,
- true /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfoOld(
+ mContext,
+ mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ SystemClock.elapsedRealtime() * 1000,
+ true /* shortString */);
assertThat(info.statusLabel).isEqualTo(STATUS_NOT_CHARGING);
}
@@ -117,8 +121,13 @@
@Test
public void testGetBatteryInfo_doNotShowChargingMethod_hasRemainingTime() {
doReturn(REMAINING_TIME).when(mBatteryUsageStats).getChargeTimeRemainingMs();
- BatteryInfo info = BatteryInfo.getBatteryInfoOld(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfoOld(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.chargeLabel.toString()).isEqualTo(STATUS_CHARGING_TIME);
}
@@ -126,8 +135,13 @@
@Test
public void testGetBatteryInfo_doNotShowChargingMethod_noRemainingTime() {
doReturn(REMAINING_TIME_NULL).when(mBatteryUsageStats).getChargeTimeRemainingMs();
- BatteryInfo info = BatteryInfo.getBatteryInfoOld(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfoOld(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.chargeLabel.toString()).ignoringCase().isEqualTo(STATUS_CHARGING_NO_TIME);
}
@@ -135,9 +149,15 @@
@Test
public void testGetBatteryInfo_pluggedInUsingShortString_usesCorrectData() {
doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
- .when(mBatteryUsageStats).getChargeTimeRemainingMs();
- BatteryInfo info = BatteryInfo.getBatteryInfoOld(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */);
+ .when(mBatteryUsageStats)
+ .getChargeTimeRemainingMs();
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfoOld(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ SystemClock.elapsedRealtime() * 1000,
+ true /* shortString */);
assertThat(info.discharging).isEqualTo(false);
assertThat(info.chargeLabel.toString()).isEqualTo("50% - 1 min left until full");
@@ -145,15 +165,27 @@
@Test
public void testGetBatteryInfo_basedOnUsageTrueMoreThanFifteenMinutes_usesCorrectString() {
- Estimate estimate = new Estimate(Duration.ofHours(4).toMillis(),
- true /* isBasedOnUsage */,
- 1000 /* averageDischargeTime */);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
- mBatteryUsageStats, estimate, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
- BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
- mBatteryUsageStats, estimate, SystemClock.elapsedRealtime() * 1000,
- true /* shortString */);
+ Estimate estimate =
+ new Estimate(
+ Duration.ofHours(4).toMillis(),
+ true /* isBasedOnUsage */,
+ 1000 /* averageDischargeTime */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ estimate,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
+ BatteryInfo info2 =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ estimate,
+ SystemClock.elapsedRealtime() * 1000,
+ true /* shortString */);
// Both long and short strings should not have extra text
assertThat(info.remainingLabel.toString()).doesNotContain(ENHANCED_STRING_SUFFIX);
@@ -165,24 +197,41 @@
@Test
@Ignore
public void getBatteryInfo_MoreThanOneDay_suggestionLabelIsCorrectString() {
- Estimate estimate = new Estimate(Duration.ofDays(3).toMillis(),
- true /* isBasedOnUsage */,
- 1000 /* averageDischargeTime */);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
- mBatteryUsageStats, estimate, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ Estimate estimate =
+ new Estimate(
+ Duration.ofDays(3).toMillis(),
+ true /* isBasedOnUsage */,
+ 1000 /* averageDischargeTime */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ estimate,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.suggestionLabel).doesNotContain(BATTERY_RUN_OUT_PREFIX);
}
@Test
public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
- BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- true /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
+ BatteryInfo info2 =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ true /* shortString */);
assertThat(info.remainingLabel.toString()).doesNotContain(ENHANCED_STRING_SUFFIX);
assertThat(info2.remainingLabel.toString()).doesNotContain(ENHANCED_STRING_SUFFIX);
@@ -191,11 +240,17 @@
@Test
public void testGetBatteryInfo_charging_usesChargeTime() {
doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
- .when(mBatteryUsageStats).getChargeTimeRemainingMs();
+ .when(mBatteryUsageStats)
+ .getChargeTimeRemainingMs();
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.remainingTimeUs).isEqualTo(TEST_CHARGE_TIME_REMAINING);
assertThat(info.remainingLabel.toString())
@@ -206,24 +261,33 @@
public void testGetBatteryInfo_pluggedInWithFullBattery_onlyShowBatteryLevel() {
mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_LEVEL, 100);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.chargeLabel).isEqualTo("100%");
}
@Test
public void testGetBatteryInfo_chargingWithDefender_updateChargeLabel() {
- doReturn(TEST_CHARGE_TIME_REMAINING)
- .when(mBatteryUsageStats)
- .getChargeTimeRemainingMs();
- mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
+ doReturn(TEST_CHARGE_TIME_REMAINING).when(mBatteryUsageStats).getChargeTimeRemainingMs();
+ mChargingBatteryBroadcast.putExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS,
BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.isBatteryDefender).isTrue();
assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_PAUSED);
@@ -231,30 +295,32 @@
@Test
public void testGetBatteryInfo_getChargeTimeRemaining_updateSettingsGlobal() {
- doReturn(TEST_CHARGE_TIME_REMAINING)
- .when(mBatteryUsageStats)
- .getChargeTimeRemainingMs();
+ doReturn(TEST_CHARGE_TIME_REMAINING).when(mBatteryUsageStats).getChargeTimeRemainingMs();
- BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
false /* shortString */);
- assertThat(BatteryInfo.getSettingsChargeTimeRemaining(mContext)).isEqualTo(
- TEST_CHARGE_TIME_REMAINING);
+ assertThat(BatteryInfo.getSettingsChargeTimeRemaining(mContext))
+ .isEqualTo(TEST_CHARGE_TIME_REMAINING);
}
@Test
public void testGetBatteryInfo_differentChargeTimeRemaining_updateSettingsGlobal() {
- doReturn(TEST_CHARGE_TIME_REMAINING)
- .when(mBatteryUsageStats)
- .getChargeTimeRemainingMs();
+ doReturn(TEST_CHARGE_TIME_REMAINING).when(mBatteryUsageStats).getChargeTimeRemainingMs();
final long newTimeToFull = 300L;
- doReturn(newTimeToFull)
- .when(mBatteryUsageStats)
- .getChargeTimeRemainingMs();
+ doReturn(newTimeToFull).when(mBatteryUsageStats).getChargeTimeRemainingMs();
- BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ mChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
false /* shortString */);
assertThat(BatteryInfo.getSettingsChargeTimeRemaining(mContext)).isEqualTo(newTimeToFull);
@@ -263,18 +329,27 @@
@Test
public void testGetBatteryInfo_dockDefenderActive_updateChargeString() {
doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
- .when(mBatteryUsageStats).getChargeTimeRemainingMs();
+ .when(mBatteryUsageStats)
+ .getChargeTimeRemainingMs();
doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend();
- Intent intent = BatteryTestUtils.getCustomBatteryIntent(BatteryManager.BATTERY_PLUGGED_DOCK,
- 50 /* level */,
- 100 /* scale */,
- BatteryManager.BATTERY_STATUS_CHARGING)
- .putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
- BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
+ Intent intent =
+ BatteryTestUtils.getCustomBatteryIntent(
+ BatteryManager.BATTERY_PLUGGED_DOCK,
+ 50 /* level */,
+ 100 /* scale */,
+ BatteryManager.BATTERY_STATUS_CHARGING)
+ .putExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS,
+ BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, intent,
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ intent,
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_PAUSED);
}
@@ -282,18 +357,25 @@
@Test
public void testGetBatteryInfo_dockDefenderTemporarilyBypassed_updateChargeLabel() {
doReturn(REMAINING_TIME).when(mBatteryUsageStats).getChargeTimeRemainingMs();
- mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
- BatteryManager.CHARGING_POLICY_DEFAULT);
- Settings.Global.putInt(mContext.getContentResolver(),
- BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 1);
+ mChargingBatteryBroadcast.putExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS,
+ 1);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext,
- BatteryTestUtils.getCustomBatteryIntent(BatteryManager.BATTERY_PLUGGED_DOCK,
- 50 /* level */,
- 100 /* scale */,
- BatteryManager.BATTERY_STATUS_CHARGING),
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ BatteryTestUtils.getCustomBatteryIntent(
+ BatteryManager.BATTERY_PLUGGED_DOCK,
+ 50 /* level */,
+ 100 /* scale */,
+ BatteryManager.BATTERY_STATUS_CHARGING),
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_TIME);
}
@@ -301,16 +383,21 @@
@Test
public void testGetBatteryInfo_dockDefenderFutureBypass_updateChargeLabel() {
doReturn(false).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend();
- mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
- BatteryManager.CHARGING_POLICY_DEFAULT);
+ mChargingBatteryBroadcast.putExtra(
+ BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext,
- BatteryTestUtils.getCustomBatteryIntent(BatteryManager.BATTERY_PLUGGED_DOCK,
- 50 /* level */,
- 100 /* scale */,
- BatteryManager.BATTERY_STATUS_CHARGING),
- mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
- false /* shortString */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ BatteryTestUtils.getCustomBatteryIntent(
+ BatteryManager.BATTERY_PLUGGED_DOCK,
+ 50 /* level */,
+ 100 /* scale */,
+ BatteryManager.BATTERY_STATUS_CHARGING),
+ mBatteryUsageStats,
+ MOCK_ESTIMATE,
+ SystemClock.elapsedRealtime() * 1000,
+ false /* shortString */);
assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_FUTURE_BYPASS);
}
@@ -318,15 +405,20 @@
// Make our battery stats return a sequence of battery events.
private void mockBatteryStatsHistory() {
// Mock out new data every time iterateBatteryStatsHistory is called.
- doAnswer(invocation -> {
- BatteryStatsHistoryIterator iterator = mock(BatteryStatsHistoryIterator.class);
- when(iterator.next()).thenReturn(
- makeHistoryIterm(1000, 99),
- makeHistoryIterm(1500, 98),
- makeHistoryIterm(2000, 97),
- null);
- return iterator;
- }).when(mBatteryUsageStats).iterateBatteryStatsHistory();
+ doAnswer(
+ invocation -> {
+ BatteryStatsHistoryIterator iterator =
+ mock(BatteryStatsHistoryIterator.class);
+ when(iterator.next())
+ .thenReturn(
+ makeHistoryIterm(1000, 99),
+ makeHistoryIterm(1500, 98),
+ makeHistoryIterm(2000, 97),
+ null);
+ return iterator;
+ })
+ .when(mBatteryUsageStats)
+ .iterateBatteryStatsHistory();
}
private BatteryStats.HistoryItem makeHistoryIterm(long time, int batteryLevel) {
@@ -373,7 +465,8 @@
pointsExpected.append(2000, 96);
pointsExpected.append(2500, 95);
pointsExpected.append(3000, 94);
- doReturn(pointsExpected).when(mFeatureFactory.powerUsageFeatureProvider)
+ doReturn(pointsExpected)
+ .when(mFeatureFactory.powerUsageFeatureProvider)
.getEnhancedBatteryPredictionCurve(any(Context.class), anyLong());
info.bindHistory(view);
@@ -390,14 +483,21 @@
} else {
doReturn(0L).when(mBatteryUsageStats).getChargeTimeRemainingMs();
}
- Estimate batteryEstimate = new Estimate(
- estimate ? 1000 : 0,
- false /* isBasedOnUsage */,
- 1000 /* averageDischargeTime */);
- BatteryInfo info = BatteryInfo.getBatteryInfo(mContext,
- charging ? mChargingBatteryBroadcast : mDisChargingBatteryBroadcast,
- mBatteryUsageStats, batteryEstimate, SystemClock.elapsedRealtime() * 1000, false);
- doReturn(enhanced).when(mFeatureFactory.powerUsageFeatureProvider)
+ Estimate batteryEstimate =
+ new Estimate(
+ estimate ? 1000 : 0,
+ false /* isBasedOnUsage */,
+ 1000 /* averageDischargeTime */);
+ BatteryInfo info =
+ BatteryInfo.getBatteryInfo(
+ mContext,
+ charging ? mChargingBatteryBroadcast : mDisChargingBatteryBroadcast,
+ mBatteryUsageStats,
+ batteryEstimate,
+ SystemClock.elapsedRealtime() * 1000,
+ false);
+ doReturn(enhanced)
+ .when(mFeatureFactory.powerUsageFeatureProvider)
.isEnhancedBatteryPredictionEnabled(mContext);
return info;
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryMeterViewTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryMeterViewTest.java
index 0aa702a..ec3cfcf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryMeterViewTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryMeterViewTest.java
@@ -39,12 +39,9 @@
private static final int BATTERY_CRITICAL_LEVEL = 15;
private static final int BATTERY_LOW_LEVEL = 3;
- @Mock
- private ColorFilter mErrorColorFilter;
- @Mock
- private ColorFilter mAccentColorFilter;
- @Mock
- private ColorFilter mForegroundColorFilter;
+ @Mock private ColorFilter mErrorColorFilter;
+ @Mock private ColorFilter mAccentColorFilter;
+ @Mock private ColorFilter mForegroundColorFilter;
private Context mContext;
private BatteryMeterView mBatteryMeterView;
private BatteryMeterView.BatteryMeterDrawable mDrawable;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtilsTest.java
index 87de62f..5f591eb 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeLogUtilsTest.java
@@ -57,8 +57,7 @@
BatteryOptimizeLogUtils.writeLog(mContext, Action.APPLY, "pkg1", "logs");
BatteryOptimizeLogUtils.printBatteryOptimizeHistoricalLog(mContext, mTestPrintWriter);
- assertThat(mTestStringWriter.toString()).contains(
- "pkg1\taction:APPLY\tevent:logs");
+ assertThat(mTestStringWriter.toString()).contains("pkg1\taction:APPLY\tevent:logs");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
index f9d3108..3551eeb 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
@@ -98,8 +98,7 @@
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_IGNORED);
- assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
- .isEqualTo(MODE_RESTRICTED);
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_RESTRICTED);
}
@Test
@@ -108,8 +107,7 @@
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED);
- assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
- .isEqualTo(MODE_UNRESTRICTED);
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_UNRESTRICTED);
}
@Test
@@ -118,8 +116,7 @@
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED);
- assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
- .isEqualTo(MODE_OPTIMIZED);
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_OPTIMIZED);
}
@Test
@@ -168,7 +165,6 @@
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_IGNORED);
-
mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED, Action.UNKNOWN);
TimeUnit.SECONDS.sleep(1);
@@ -205,18 +201,19 @@
@Test
public void testGetInstalledApplications_returnEmptyArray() {
- assertTrue(BatteryOptimizeUtils.getInstalledApplications(mContext, mMockIPackageManager)
- .isEmpty());
+ assertTrue(
+ BatteryOptimizeUtils.getInstalledApplications(mContext, mMockIPackageManager)
+ .isEmpty());
}
@Test
public void testGetInstalledApplications_returnNull() throws Exception {
final UserInfo userInfo =
- new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ new UserInfo(/* userId= */ 0, /* userName= */ "google", /* flag= */ 0);
doReturn(Arrays.asList(userInfo)).when(mMockUserManager).getProfiles(anyInt());
doThrow(new RuntimeException())
- .when(mMockIPackageManager)
- .getInstalledApplications(anyLong(), anyInt());
+ .when(mMockIPackageManager)
+ .getInstalledApplications(anyLong(), anyInt());
assertNull(BatteryOptimizeUtils.getInstalledApplications(mContext, mMockIPackageManager));
}
@@ -224,7 +221,7 @@
@Test
public void testGetInstalledApplications_returnInstalledApps() throws Exception {
final UserInfo userInfo =
- new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ new UserInfo(/* userId= */ 0, /* userName= */ "google", /* flag= */ 0);
doReturn(Arrays.asList(userInfo)).when(mMockUserManager).getProfiles(anyInt());
final ApplicationInfo applicationInfo1 = new ApplicationInfo();
@@ -242,10 +239,15 @@
applicationInfo4.enabled = true;
applicationInfo4.uid = 4;
applicationInfo4.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
- doReturn(new ParceledListSlice<ApplicationInfo>(
- Arrays.asList(applicationInfo1, applicationInfo2, applicationInfo3, applicationInfo4)))
- .when(mMockIPackageManager)
- .getInstalledApplications(anyLong(), anyInt());
+ doReturn(
+ new ParceledListSlice<ApplicationInfo>(
+ Arrays.asList(
+ applicationInfo1,
+ applicationInfo2,
+ applicationInfo3,
+ applicationInfo4)))
+ .when(mMockIPackageManager)
+ .getInstalledApplications(anyLong(), anyInt());
final ArraySet<ApplicationInfo> applications =
BatteryOptimizeUtils.getInstalledApplications(mContext, mMockIPackageManager);
@@ -260,7 +262,8 @@
@Test
public void testResetAppOptimizationMode_Optimized_verifyAction() throws Exception {
runTestForResetWithMode(
- AppOpsManager.MODE_ALLOWED, /* allowListed */ false,
+ AppOpsManager.MODE_ALLOWED, /* allowListed */
+ false,
/* isSystemOrDefaultApp */ false);
verifyNoInteractions(mMockBatteryUtils);
@@ -274,7 +277,8 @@
@Test
public void testResetAppOptimizationMode_SystemOrDefault_verifyAction() throws Exception {
runTestForResetWithMode(
- AppOpsManager.MODE_ALLOWED, /* allowListed */ true,
+ AppOpsManager.MODE_ALLOWED, /* allowListed */
+ true,
/* isSystemOrDefaultApp */ true);
verifyNoInteractions(mMockBatteryUtils);
@@ -289,7 +293,8 @@
@Test
public void testResetAppOptimizationMode_Restricted_verifyAction() throws Exception {
runTestForResetWithMode(
- AppOpsManager.MODE_IGNORED, /* allowListed */ false,
+ AppOpsManager.MODE_IGNORED, /* allowListed */
+ false,
/* isSystemOrDefaultApp */ false);
verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false);
@@ -298,7 +303,8 @@
@Test
public void testResetAppOptimizationMode_Unrestricted_verifyAction() throws Exception {
runTestForResetWithMode(
- AppOpsManager.MODE_ALLOWED, /* allowListed */ true,
+ AppOpsManager.MODE_ALLOWED, /* allowListed */
+ true,
/* isSystemOrDefaultApp */ false);
verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false);
@@ -308,32 +314,28 @@
int appStandbyMode, boolean allowListed, boolean isSystemOrDefaultApp)
throws Exception {
final UserInfo userInfo =
- new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ new UserInfo(/* userId= */ 0, /* userName= */ "google", /* flag= */ 0);
doReturn(Arrays.asList(userInfo)).when(mMockUserManager).getProfiles(anyInt());
final ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = UID;
applicationInfo.packageName = PACKAGE_NAME;
applicationInfo.enabled = true;
- doReturn(new ParceledListSlice<ApplicationInfo>(
- Arrays.asList(applicationInfo)))
+ doReturn(new ParceledListSlice<ApplicationInfo>(Arrays.asList(applicationInfo)))
.when(mMockIPackageManager)
.getInstalledApplications(anyLong(), anyInt());
doReturn(appStandbyMode)
.when(mMockAppOpsManager)
.checkOpNoThrow(anyInt(), anyInt(), anyString());
- doReturn(allowListed)
- .when(mMockBackend)
- .isAllowlisted(anyString(), anyInt());
- doReturn(isSystemOrDefaultApp)
- .when(mMockBackend)
- .isSysAllowlisted(anyString());
- doReturn(isSystemOrDefaultApp)
- .when(mMockBackend)
- .isDefaultActiveApp(anyString(), anyInt());
+ doReturn(allowListed).when(mMockBackend).isAllowlisted(anyString(), anyInt());
+ doReturn(isSystemOrDefaultApp).when(mMockBackend).isSysAllowlisted(anyString());
+ doReturn(isSystemOrDefaultApp).when(mMockBackend).isDefaultActiveApp(anyString(), anyInt());
BatteryOptimizeUtils.resetAppOptimizationMode(
- mContext, mMockIPackageManager, mMockAppOpsManager, mMockBackend,
+ mContext,
+ mMockIPackageManager,
+ mMockAppOpsManager,
+ mMockBackend,
mMockBatteryUtils);
TimeUnit.SECONDS.sleep(1);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index ddb9860..8d9a1c0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -21,11 +21,9 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.PowerManager;
import android.provider.Settings;
-import android.util.Pair;
import androidx.preference.Preference;
@@ -41,10 +39,8 @@
@RunWith(RobolectricTestRunner.class)
public class BatterySaverControllerTest {
- @Mock
- private Preference mBatterySaverPref;
- @Mock
- private PowerManager mPowerManager;
+ @Mock private Preference mBatterySaverPref;
+ @Mock private PowerManager mPowerManager;
private BatterySaverController mBatterySaverController;
private Context mContext;
@@ -58,8 +54,8 @@
ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
}
@Test
@@ -84,8 +80,8 @@
@Test
public void getSummary_batterySaverOffButScheduled_showSummaryScheduled() {
when(mPowerManager.isPowerSaveMode()).thenReturn(false);
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 15);
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 15);
assertThat(mBatterySaverController.getSummary()).isEqualTo("Will turn on at 15%");
}
@@ -93,8 +89,8 @@
@Test
public void getSummary_batterySaverOffButScheduledZeroPercent_showSummaryOff() {
when(mPowerManager.isPowerSaveMode()).thenReturn(false);
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
assertThat(mBatterySaverController.getSummary()).isEqualTo("Off");
}
@@ -107,8 +103,8 @@
Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
- assertThat(mBatterySaverController.getSummary()).
- isEqualTo("Will turn on based on your routine");
+ assertThat(mBatterySaverController.getSummary())
+ .isEqualTo("Will turn on based on your routine");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
index e411531..e3e00ec1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
@@ -32,10 +32,8 @@
@RunWith(RobolectricTestRunner.class)
public class BatterySaverReceiverTest {
- @Mock
- private BatterySaverReceiver.BatterySaverListener mBatterySaverListener;
- @Mock
- private Context mContext;
+ @Mock private BatterySaverReceiver.BatterySaverListener mBatterySaverListener;
+ @Mock private Context mContext;
private BatterySaverReceiver mBatterySaverReceiver;
@Before
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
index e2058e7..ba7e9cc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
@@ -31,10 +31,8 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.UserHandle;
-import android.os.UserManager;
import com.android.settings.TestUtils;
-import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry;
import com.android.settings.fuelgauge.batterysaver.BatterySaverScheduleRadioButtonsController;
import org.junit.After;
@@ -58,26 +56,25 @@
@Config(shadows = {BatterySettingsMigrateCheckerTest.ShadowUserHandle.class})
public final class BatterySettingsMigrateCheckerTest {
- private static final Intent BOOT_COMPLETED_INTENT =
- new Intent(Intent.ACTION_BOOT_COMPLETED);
+ private static final Intent BOOT_COMPLETED_INTENT = new Intent(Intent.ACTION_BOOT_COMPLETED);
private static final int UID = 2003;
private static final String PACKAGE_NAME = "com.android.test.app";
private Context mContext;
private BatterySettingsMigrateChecker mBatterySettingsMigrateChecker;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @Mock private PackageManager mPackageManager;
+ @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
+ BatteryUtils.getInstance(mContext).reset();
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mPackageManager).when(mContext).getPackageManager();
- doReturn(UID).when(mPackageManager)
+ doReturn(UID)
+ .when(mPackageManager)
.getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA);
BatterySettingsMigrateChecker.sBatteryOptimizeUtils = mBatteryOptimizeUtils;
mBatterySettingsMigrateChecker = new BatterySettingsMigrateChecker();
@@ -151,45 +148,42 @@
}
@Test
- public void verifyBatteryOptimizeModeApps_inAllowList_resetOptimizationMode()
- throws Exception {
- doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils)
+ public void verifyBatteryOptimizeModeApps_inAllowList_resetOptimizationMode() throws Exception {
+ doReturn(BatteryOptimizeUtils.MODE_RESTRICTED)
+ .when(mBatteryOptimizeUtils)
.getAppOptimizationMode();
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
- mContext,
- BatteryOptimizeUtils.MODE_OPTIMIZED,
- Arrays.asList(PACKAGE_NAME));
+ mContext, BatteryOptimizeUtils.MODE_OPTIMIZED, Arrays.asList(PACKAGE_NAME));
final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
inOrder.verify(mBatteryOptimizeUtils).getAppOptimizationMode();
- inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(
- BatteryOptimizeUtils.MODE_OPTIMIZED,
- BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET);
+ inOrder.verify(mBatteryOptimizeUtils)
+ .setAppUsageState(
+ BatteryOptimizeUtils.MODE_OPTIMIZED,
+ BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET);
}
@Test
public void verifyBatteryOptimizeModeApps_optimizedMode_noAction() throws Exception {
- doReturn(BatteryOptimizeUtils.MODE_OPTIMIZED).when(mBatteryOptimizeUtils)
+ doReturn(BatteryOptimizeUtils.MODE_OPTIMIZED)
+ .when(mBatteryOptimizeUtils)
.getAppOptimizationMode();
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
- mContext,
- BatteryOptimizeUtils.MODE_OPTIMIZED,
- Arrays.asList(PACKAGE_NAME));
+ mContext, BatteryOptimizeUtils.MODE_OPTIMIZED, Arrays.asList(PACKAGE_NAME));
verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt(), any());
}
@Test
public void verifyBatteryOptimizeModeApps_notInAllowList_noAction() throws Exception {
- doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils)
+ doReturn(BatteryOptimizeUtils.MODE_RESTRICTED)
+ .when(mBatteryOptimizeUtils)
.getAppOptimizationMode();
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
- mContext,
- BatteryOptimizeUtils.MODE_OPTIMIZED,
- new ArrayList<String>());
+ mContext, BatteryOptimizeUtils.MODE_OPTIMIZED, new ArrayList<String>());
verifyNoInteractions(mBatteryOptimizeUtils);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index 2fe0cec..0d8c669 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -106,32 +106,22 @@
private static final String INFO_EXCESSIVE = "anomaly_type=4,auto_restriction=false";
private static final String INFO_WAKELOCK = "anomaly_type=1,auto_restriction=false";
- @Mock
- private BatteryStats.Uid mUid;
- @Mock
- private BatteryStats.Timer mTimer;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
- @Mock
- private BatteryConsumer mAggregateBatteryConsumer;
- @Mock
- private BatteryInfo mBatteryInfo;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private AppOpsManager mAppOpsManager;
- @Mock
- private ApplicationInfo mApplicationInfo;
+ @Mock private BatteryStats.Uid mUid;
+ @Mock private BatteryStats.Timer mTimer;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryConsumer mAggregateBatteryConsumer;
+ @Mock private BatteryInfo mBatteryInfo;
+ @Mock private PackageManager mPackageManager;
+ @Mock private AppOpsManager mAppOpsManager;
+ @Mock private ApplicationInfo mApplicationInfo;
+
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private BatteryStatsManager mBatteryStatsManager;
- @Mock
- private ApplicationInfo mHighApplicationInfo;
- @Mock
- private ApplicationInfo mLowApplicationInfo;
- @Mock
- private PowerAllowlistBackend mPowerAllowlistBackend;
- @Mock
- private BatteryDatabaseManager mBatteryDatabaseManager;
+
+ @Mock private ApplicationInfo mHighApplicationInfo;
+ @Mock private ApplicationInfo mLowApplicationInfo;
+ @Mock private PowerAllowlistBackend mPowerAllowlistBackend;
+ @Mock private BatteryDatabaseManager mBatteryDatabaseManager;
private AnomalyInfo mAnomalyInfo;
private BatteryUtils mBatteryUtils;
private FakeFeatureFactory mFeatureFactory;
@@ -145,16 +135,21 @@
mFeatureFactory = FakeFeatureFactory.setupForTest();
mProvider = mFeatureFactory.powerUsageFeatureProvider;
- doReturn(TIME_STATE_TOP).when(mUid).getProcessStateTime(eq(PROCESS_STATE_TOP), anyLong(),
- anyInt());
- doReturn(TIME_STATE_FOREGROUND_SERVICE).when(mUid).getProcessStateTime(
- eq(PROCESS_STATE_FOREGROUND_SERVICE), anyLong(), anyInt());
- doReturn(TIME_STATE_TOP_SLEEPING).when(mUid).getProcessStateTime(
- eq(PROCESS_STATE_TOP_SLEEPING), anyLong(), anyInt());
- doReturn(TIME_STATE_FOREGROUND).when(mUid).getProcessStateTime(eq(PROCESS_STATE_FOREGROUND),
- anyLong(), anyInt());
- doReturn(TIME_STATE_BACKGROUND).when(mUid).getProcessStateTime(eq(PROCESS_STATE_BACKGROUND),
- anyLong(), anyInt());
+ doReturn(TIME_STATE_TOP)
+ .when(mUid)
+ .getProcessStateTime(eq(PROCESS_STATE_TOP), anyLong(), anyInt());
+ doReturn(TIME_STATE_FOREGROUND_SERVICE)
+ .when(mUid)
+ .getProcessStateTime(eq(PROCESS_STATE_FOREGROUND_SERVICE), anyLong(), anyInt());
+ doReturn(TIME_STATE_TOP_SLEEPING)
+ .when(mUid)
+ .getProcessStateTime(eq(PROCESS_STATE_TOP_SLEEPING), anyLong(), anyInt());
+ doReturn(TIME_STATE_FOREGROUND)
+ .when(mUid)
+ .getProcessStateTime(eq(PROCESS_STATE_FOREGROUND), anyLong(), anyInt());
+ doReturn(TIME_STATE_BACKGROUND)
+ .when(mUid)
+ .getProcessStateTime(eq(PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
when(mPackageManager.getApplicationInfo(eq(HIGH_SDK_PACKAGE), anyInt()))
.thenReturn(mHighApplicationInfo);
@@ -166,12 +161,14 @@
mContext = spy(RuntimeEnvironment.application);
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
- doReturn(mBatteryStatsManager).when(mContext)
+ doReturn(mBatteryStatsManager)
+ .when(mContext)
.getSystemService(Context.BATTERY_STATS_SERVICE);
mBatteryUtils = spy(new BatteryUtils(mContext));
mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
- doReturn(0L).when(mBatteryUtils)
- .getForegroundServiceTotalTimeUs(any(BatteryStats.Uid.class), anyLong());
+ doReturn(0L)
+ .when(mBatteryUtils)
+ .getForegroundServiceTotalTimeUs(any(BatteryStats.Uid.class), anyLong());
mAnomalyInfo = new AnomalyInfo(INFO_WAKELOCK);
BatteryDatabaseManager.setUpForTest(mBatteryDatabaseManager);
@@ -180,54 +177,62 @@
@Test
public void testGetProcessTimeMs_typeForeground_timeCorrect() {
- doReturn(TIME_STATE_FOREGROUND + 500).when(mBatteryUtils)
- .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
+ doReturn(TIME_STATE_FOREGROUND + 500)
+ .when(mBatteryUtils)
+ .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
- final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
- BatteryStats.STATS_SINCE_CHARGED);
+ final long time =
+ mBatteryUtils.getProcessTimeMs(
+ BatteryUtils.StatusType.FOREGROUND, mUid, BatteryStats.STATS_SINCE_CHARGED);
assertThat(time).isEqualTo(TIME_EXPECTED_FOREGROUND);
}
@Test
public void testGetProcessTimeMs_typeBackground_timeCorrect() {
- final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.BACKGROUND, mUid,
- BatteryStats.STATS_SINCE_CHARGED);
+ final long time =
+ mBatteryUtils.getProcessTimeMs(
+ BatteryUtils.StatusType.BACKGROUND, mUid, BatteryStats.STATS_SINCE_CHARGED);
assertThat(time).isEqualTo(TIME_EXPECTED_BACKGROUND);
}
@Test
public void testGetProcessTimeMs_typeAll_timeCorrect() {
- doReturn(TIME_STATE_FOREGROUND + 500).when(mBatteryUtils)
- .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
+ doReturn(TIME_STATE_FOREGROUND + 500)
+ .when(mBatteryUtils)
+ .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
- final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
- BatteryStats.STATS_SINCE_CHARGED);
+ final long time =
+ mBatteryUtils.getProcessTimeMs(
+ BatteryUtils.StatusType.ALL, mUid, BatteryStats.STATS_SINCE_CHARGED);
assertThat(time).isEqualTo(TIME_EXPECTED_ALL);
}
@Test
public void testGetProcessTimeMs_uidNull_returnZero() {
- final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, null,
- BatteryStats.STATS_SINCE_CHARGED);
+ final long time =
+ mBatteryUtils.getProcessTimeMs(
+ BatteryUtils.StatusType.ALL, null, BatteryStats.STATS_SINCE_CHARGED);
assertThat(time).isEqualTo(0);
}
@Test
public void testCalculateBatteryPercent() {
- assertThat(mBatteryUtils.calculateBatteryPercent(BATTERY_SYSTEM_USAGE, TOTAL_BATTERY_USAGE,
- DISCHARGE_AMOUNT))
- .isWithin(PRECISION).of(PERCENT_SYSTEM_USAGE);
+ assertThat(
+ mBatteryUtils.calculateBatteryPercent(
+ BATTERY_SYSTEM_USAGE, TOTAL_BATTERY_USAGE, DISCHARGE_AMOUNT))
+ .isWithin(PRECISION)
+ .of(PERCENT_SYSTEM_USAGE);
}
@Test
public void testCalculateLastFullChargeTime() {
final long currentTimeMs = System.currentTimeMillis();
- when(mBatteryUsageStats.getStatsStartTimestamp()).thenReturn(
- currentTimeMs - TIME_SINCE_LAST_FULL_CHARGE_MS);
+ when(mBatteryUsageStats.getStatsStartTimestamp())
+ .thenReturn(currentTimeMs - TIME_SINCE_LAST_FULL_CHARGE_MS);
assertThat(mBatteryUtils.calculateLastFullChargeTime(mBatteryUsageStats, currentTimeMs))
.isEqualTo(TIME_SINCE_LAST_FULL_CHARGE_MS);
@@ -237,49 +242,54 @@
public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() {
final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
doReturn(mTimer).when(mUid).getForegroundActivityTimer();
- doReturn(TIME_SINCE_LAST_FULL_CHARGE_US).when(mTimer)
+ doReturn(TIME_SINCE_LAST_FULL_CHARGE_US)
+ .when(mTimer)
.getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
- assertThat(mBatteryUtils.getForegroundActivityTotalTimeUs(mUid, rawRealtimeUs)).isEqualTo(
- TIME_SINCE_LAST_FULL_CHARGE_US);
+ assertThat(mBatteryUtils.getForegroundActivityTotalTimeUs(mUid, rawRealtimeUs))
+ .isEqualTo(TIME_SINCE_LAST_FULL_CHARGE_US);
}
@Test
- public void testGetTargetSdkVersion_packageExist_returnSdk() throws
- PackageManager.NameNotFoundException {
- doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
- PackageManager.GET_META_DATA);
+ public void testGetTargetSdkVersion_packageExist_returnSdk()
+ throws PackageManager.NameNotFoundException {
+ doReturn(mApplicationInfo)
+ .when(mPackageManager)
+ .getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
mApplicationInfo.targetSdkVersion = SDK_VERSION;
assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(SDK_VERSION);
}
@Test
- public void testGetTargetSdkVersion_packageNotExist_returnSdkNull() throws
- PackageManager.NameNotFoundException {
- doThrow(new PackageManager.NameNotFoundException()).when(
- mPackageManager).getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
+ public void testGetTargetSdkVersion_packageNotExist_returnSdkNull()
+ throws PackageManager.NameNotFoundException {
+ doThrow(new PackageManager.NameNotFoundException())
+ .when(mPackageManager)
+ .getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
- assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(
- BatteryUtils.SDK_NULL);
+ assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME))
+ .isEqualTo(BatteryUtils.SDK_NULL);
}
@Test
public void testBackgroundRestrictionOn_restrictionOn_returnTrue() {
- doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
- AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+ doReturn(AppOpsManager.MODE_IGNORED)
+ .when(mAppOpsManager)
+ .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
- assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID,
- PACKAGE_NAME)).isTrue();
+ assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID, PACKAGE_NAME))
+ .isTrue();
}
@Test
public void testBackgroundRestrictionOn_restrictionOff_returnFalse() {
- doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager).checkOpNoThrow(
- AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+ doReturn(AppOpsManager.MODE_ALLOWED)
+ .when(mAppOpsManager)
+ .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID, PACKAGE_NAME))
- .isFalse();
+ .isFalse();
}
@Test
@@ -294,13 +304,13 @@
@Test
public void testIsPreOApp_containPreOApp_ReturnTrue() {
- assertThat(
- mBatteryUtils.isPreOApp(new String[]{HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE})).isTrue();
+ assertThat(mBatteryUtils.isPreOApp(new String[] {HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE}))
+ .isTrue();
}
@Test
public void testIsPreOApp_emptyList_ReturnFalse() {
- assertThat(mBatteryUtils.isPreOApp(new String[]{})).isFalse();
+ assertThat(mBatteryUtils.isPreOApp(new String[] {})).isFalse();
}
@Ignore
@@ -309,10 +319,18 @@
mBatteryUtils.setForceAppStandby(UID, LOW_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
// Restrict both OP_RUN_IN_BACKGROUND and OP_RUN_ANY_IN_BACKGROUND
- verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, LOW_SDK_PACKAGE,
- AppOpsManager.MODE_IGNORED);
- verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, LOW_SDK_PACKAGE,
- AppOpsManager.MODE_IGNORED);
+ verify(mAppOpsManager)
+ .setMode(
+ AppOpsManager.OP_RUN_IN_BACKGROUND,
+ UID,
+ LOW_SDK_PACKAGE,
+ AppOpsManager.MODE_IGNORED);
+ verify(mAppOpsManager)
+ .setMode(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ UID,
+ LOW_SDK_PACKAGE,
+ AppOpsManager.MODE_IGNORED);
}
@Ignore
@@ -321,42 +339,53 @@
mBatteryUtils.setForceAppStandby(UID, HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
// Don't restrict OP_RUN_IN_BACKGROUND because it is already been restricted for O app
- verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID,
- HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
+ verify(mAppOpsManager, never())
+ .setMode(
+ AppOpsManager.OP_RUN_IN_BACKGROUND,
+ UID,
+ HIGH_SDK_PACKAGE,
+ AppOpsManager.MODE_IGNORED);
// Restrict OP_RUN_ANY_IN_BACKGROUND
- verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
+ verify(mAppOpsManager)
+ .setMode(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ UID,
+ HIGH_SDK_PACKAGE,
+ AppOpsManager.MODE_IGNORED);
}
@Test
public void testSetForceAppStandby_restrictApp_recordTime() {
mBatteryUtils.setForceAppStandby(UID, HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
- verify(mBatteryDatabaseManager).insertAction(
- eq(AnomalyDatabaseHelper.ActionType.RESTRICTION), eq(UID),
- eq(HIGH_SDK_PACKAGE), anyLong());
+ verify(mBatteryDatabaseManager)
+ .insertAction(
+ eq(AnomalyDatabaseHelper.ActionType.RESTRICTION), eq(UID),
+ eq(HIGH_SDK_PACKAGE), anyLong());
}
@Test
public void testSetForceAppStandby_unrestrictApp_deleteTime() {
mBatteryUtils.setForceAppStandby(UID, HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
- verify(mBatteryDatabaseManager).deleteAction(AnomalyDatabaseHelper.ActionType.RESTRICTION,
- UID, HIGH_SDK_PACKAGE);
+ verify(mBatteryDatabaseManager)
+ .deleteAction(AnomalyDatabaseHelper.ActionType.RESTRICTION, UID, HIGH_SDK_PACKAGE);
}
@Test
public void testIsForceAppStandbyEnabled_enabled_returnTrue() {
- when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- PACKAGE_NAME)).thenReturn(AppOpsManager.MODE_IGNORED);
+ when(mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, PACKAGE_NAME))
+ .thenReturn(AppOpsManager.MODE_IGNORED);
assertThat(mBatteryUtils.isForceAppStandbyEnabled(UID, PACKAGE_NAME)).isTrue();
}
@Test
public void testIsForceAppStandbyEnabled_disabled_returnFalse() {
- when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- PACKAGE_NAME)).thenReturn(AppOpsManager.MODE_ALLOWED);
+ when(mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, PACKAGE_NAME))
+ .thenReturn(AppOpsManager.MODE_ALLOWED);
assertThat(mBatteryUtils.isForceAppStandbyEnabled(UID, PACKAGE_NAME)).isFalse();
}
@@ -369,77 +398,85 @@
resolveInfo.activityInfo.packageName = HIGH_SDK_PACKAGE;
doReturn(resolveInfos).when(mPackageManager).queryIntentActivities(any(), anyInt());
- doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+ doReturn(new String[] {HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
- mAnomalyInfo)).isTrue();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, mAnomalyInfo))
+ .isTrue();
}
@Test
public void testShouldHideAnomaly_systemAppWithoutLauncher_returnTrue() {
doReturn(new ArrayList<>()).when(mPackageManager).queryIntentActivities(any(), anyInt());
- doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+ doReturn(new String[] {HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
- mAnomalyInfo)).isTrue();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, mAnomalyInfo))
+ .isTrue();
}
@Test
public void testShouldHideAnomaly_systemUid_returnTrue() {
final int systemUid = Process.ROOT_UID;
- doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(systemUid);
+ doReturn(new String[] {HIGH_SDK_PACKAGE})
+ .when(mPackageManager)
+ .getPackagesForUid(systemUid);
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, systemUid,
- mAnomalyInfo)).isTrue();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, systemUid, mAnomalyInfo))
+ .isTrue();
}
@Test
public void testShouldHideAnomaly_AppInDozeList_returnTrue() {
- doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
- doReturn(true).when(mPowerAllowlistBackend)
- .isAllowlisted(new String[]{HIGH_SDK_PACKAGE}, UID);
+ doReturn(new String[] {HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+ doReturn(true)
+ .when(mPowerAllowlistBackend)
+ .isAllowlisted(new String[] {HIGH_SDK_PACKAGE}, UID);
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
- mAnomalyInfo)).isTrue();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, mAnomalyInfo))
+ .isTrue();
}
@Test
public void testShouldHideAnomaly_normalApp_returnFalse() {
- doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+ doReturn(new String[] {HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
- mAnomalyInfo)).isFalse();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, mAnomalyInfo))
+ .isFalse();
}
@Test
public void testShouldHideAnomaly_excessivePriorOApp_returnFalse() {
- doReturn(new String[]{LOW_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+ doReturn(new String[] {LOW_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
mAnomalyInfo = new AnomalyInfo(INFO_EXCESSIVE);
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
- mAnomalyInfo)).isFalse();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, mAnomalyInfo))
+ .isFalse();
}
@Test
public void testShouldHideAnomaly_excessiveOApp_returnTrue() {
- doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+ doReturn(new String[] {HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
mAnomalyInfo = new AnomalyInfo(INFO_EXCESSIVE);
- assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
- mAnomalyInfo)).isTrue();
+ assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, mAnomalyInfo))
+ .isTrue();
}
@Test
public void clearForceAppStandby_appRestricted_clearAndReturnTrue() {
when(mBatteryUtils.getPackageUid(HIGH_SDK_PACKAGE)).thenReturn(UID);
- when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- HIGH_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
+ when(mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, HIGH_SDK_PACKAGE))
+ .thenReturn(AppOpsManager.MODE_IGNORED);
assertThat(mBatteryUtils.clearForceAppStandby(HIGH_SDK_PACKAGE)).isTrue();
- verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+ verify(mAppOpsManager)
+ .setMode(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ UID,
+ HIGH_SDK_PACKAGE,
+ AppOpsManager.MODE_ALLOWED);
}
@Test
@@ -447,29 +484,38 @@
when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(BatteryUtils.UID_NULL);
assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
- verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+ verify(mAppOpsManager, never())
+ .setMode(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ UID,
+ PACKAGE_NAME,
+ AppOpsManager.MODE_ALLOWED);
}
@Test
public void clearForceAppStandby_appUnrestricted_returnFalse() {
when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(UID);
- when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- PACKAGE_NAME)).thenReturn(AppOpsManager.MODE_ALLOWED);
+ when(mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, PACKAGE_NAME))
+ .thenReturn(AppOpsManager.MODE_ALLOWED);
assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
- verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
- PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+ verify(mAppOpsManager, never())
+ .setMode(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ UID,
+ PACKAGE_NAME,
+ AppOpsManager.MODE_ALLOWED);
}
@Test
public void getBatteryInfo_providerNull_shouldNotCrash() {
when(mProvider.isEnhancedBatteryPredictionEnabled(mContext)).thenReturn(true);
when(mProvider.getEnhancedBatteryPrediction(mContext)).thenReturn(null);
- when(mContext.registerReceiver(nullable(BroadcastReceiver.class),
- any(IntentFilter.class))).thenReturn(new Intent());
+ when(mContext.registerReceiver(nullable(BroadcastReceiver.class), any(IntentFilter.class)))
+ .thenReturn(new Intent());
- //Should not crash
+ // Should not crash
assertThat(mBatteryUtils.getBatteryInfo(TAG)).isNotNull();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java
index 3097a70..46d2d01 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java
@@ -51,10 +51,8 @@
private HighPowerDetail mFragment;
private Context mContext;
- @Mock
- private PowerAllowlistBackend mPowerAllowlistBackend;
- @Mock
- private BatteryUtils mBatteryUtils;
+ @Mock private PowerAllowlistBackend mPowerAllowlistBackend;
+ @Mock private BatteryUtils mBatteryUtils;
@Before
public void setUp() {
@@ -73,13 +71,19 @@
public void logSpecialPermissionChange() {
// Deny means app is allowlisted to opt out of power save restrictions
HighPowerDetail.logSpecialPermissionChange(true, "app", RuntimeEnvironment.application);
- verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
- eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_BATTERY_DENY), eq("app"));
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ any(Context.class),
+ eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_BATTERY_DENY),
+ eq("app"));
// Allow means app is NOT allowlisted to opt out of power save restrictions
HighPowerDetail.logSpecialPermissionChange(false, "app", RuntimeEnvironment.application);
- verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
- eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_BATTERY_ALLOW), eq("app"));
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ any(Context.class),
+ eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_BATTERY_ALLOW),
+ eq("app"));
}
@Test
@@ -87,15 +91,17 @@
mFragment.mIsEnabled = true;
when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE, TEST_UID)).thenReturn(false);
mFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
- verify(mBatteryUtils).setForceAppStandby(TEST_UID, TEST_PACKAGE,
- AppOpsManager.MODE_ALLOWED);
+ verify(mBatteryUtils)
+ .setForceAppStandby(TEST_UID, TEST_PACKAGE, AppOpsManager.MODE_ALLOWED);
}
@Test
public void getSummary_defaultActivePackage_returnUnavailable() {
doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(TEST_PACKAGE, TEST_UID);
- assertThat(HighPowerDetail.getSummary(mContext, mPowerAllowlistBackend, TEST_PACKAGE,
- TEST_UID)).isEqualTo(mContext.getString(R.string.high_power_system));
+ assertThat(
+ HighPowerDetail.getSummary(
+ mContext, mPowerAllowlistBackend, TEST_PACKAGE, TEST_UID))
+ .isEqualTo(mContext.getString(R.string.high_power_system));
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
index 71bb998..6656471 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
@@ -18,8 +18,13 @@
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.pm.PackageManager;
+
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
@@ -37,35 +42,42 @@
private OptimizedPreferenceController mController;
private SelectorWithWidgetPreference mPreference;
+ private BatteryOptimizeUtils mBatteryOptimizeUtils;
- @Mock BatteryOptimizeUtils mockBatteryOptimizeUtils;
+ @Mock PackageManager mMockPackageManager;
@Before
- public void setUp() {
+ public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mController = new OptimizedPreferenceController(
- RuntimeEnvironment.application, UID, PACKAGE_NAME);
+ Context context = spy(RuntimeEnvironment.application);
+ BatteryUtils.getInstance(context).reset();
+ doReturn(UID)
+ .when(mMockPackageManager)
+ .getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA);
+
+ mController = new OptimizedPreferenceController(context, UID, PACKAGE_NAME);
mPreference = new SelectorWithWidgetPreference(RuntimeEnvironment.application);
- mController.mBatteryOptimizeUtils = mockBatteryOptimizeUtils;
+ mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(context, UID, PACKAGE_NAME));
+ mController.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
}
@Test
public void testUpdateState_invalidPackage_prefEnabled() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
mController.updateState(mPreference);
- assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(mPreference.isEnabled()).isFalse();
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void testUpdateState_isSystemOrDefaultAppAndOptimizeStates_prefChecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
- when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
- BatteryOptimizeUtils.MODE_OPTIMIZED);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED);
mController.updateState(mPreference);
@@ -74,8 +86,8 @@
@Test
public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
mController.updateState(mPreference);
@@ -85,9 +97,9 @@
@Test
public void testUpdateState_isOptimizedStates_prefChecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
- BatteryOptimizeUtils.MODE_OPTIMIZED);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED);
mController.updateState(mPreference);
@@ -96,7 +108,7 @@
@Test
public void testUpdateState_prefUnchecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
mController.updateState(mPreference);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java
new file mode 100644
index 0000000..e50edec
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
+import static com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.doAnswer;
+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.AppOpsManager;
+import android.app.backup.BackupManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.widget.Switch;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.loader.app.LoaderManager;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.fuelgauge.batteryusage.BatteryEntry;
+import com.android.settings.testutils.shadow.ShadowActivityManager;
+import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
+import com.android.settingslib.widget.FooterPreference;
+import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.MainSwitchPreference;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(
+ shadows = {
+ ShadowEntityHeaderController.class,
+ ShadowActivityManager.class,
+ com.android.settings.testutils.shadow.ShadowFragment.class,
+ })
+public class PowerBackgroundUsageDetailTest {
+ private static final String APP_LABEL = "app label";
+ private static final String SUMMARY = "summary";
+ private static final int ICON_ID = 123;
+ private static final int UID = 1;
+ private static final String KEY_PREF_UNRESTRICTED = "unrestricted_preference";
+ private static final String KEY_PREF_OPTIMIZED = "optimized_preference";
+ private static final String KEY_ALLOW_BACKGROUND_USAGE = "allow_background_usage";
+
+ private Context mContext;
+ private PowerBackgroundUsageDetail mFragment;
+ private FooterPreference mFooterPreference;
+ private MainSwitchPreference mMainSwitchPreference;
+ private SelectorWithWidgetPreference mOptimizePreference;
+ private SelectorWithWidgetPreference mUnrestrictedPreference;
+ private SettingsActivity mTestActivity;
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private FragmentActivity mActivity;
+
+ @Mock private EntityHeaderController mEntityHeaderController;
+ @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @Mock private LayoutPreference mHeaderPreference;
+ @Mock private ApplicationsState mState;
+ @Mock private Bundle mBundle;
+ @Mock private LoaderManager mLoaderManager;
+ @Mock private ApplicationsState.AppEntry mAppEntry;
+ @Mock private BatteryEntry mBatteryEntry;
+ @Mock private BackupManager mBackupManager;
+ @Mock private PackageManager mPackageManager;
+ @Mock private AppOpsManager mAppOpsManager;
+ @Mock private Switch mMockSwitch;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageName()).thenReturn("foo");
+
+ mFragment = spy(new PowerBackgroundUsageDetail());
+ doReturn(mContext).when(mFragment).getContext();
+ doReturn(mActivity).when(mFragment).getActivity();
+ doReturn(SUMMARY).when(mFragment).getString(anyInt());
+ doReturn(APP_LABEL).when(mBundle).getString(nullable(String.class));
+ when(mFragment.getArguments()).thenReturn(mBundle);
+ doReturn(mLoaderManager).when(mFragment).getLoaderManager();
+
+ ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setButtonActions(anyInt(), anyInt());
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setIcon(nullable(Drawable.class));
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setIcon(nullable(ApplicationsState.AppEntry.class));
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setLabel(nullable(String.class));
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setLabel(nullable(String.class));
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setLabel(nullable(ApplicationsState.AppEntry.class));
+ doReturn(mEntityHeaderController)
+ .when(mEntityHeaderController)
+ .setSummary(nullable(String.class));
+
+ when(mBatteryEntry.getUid()).thenReturn(UID);
+ when(mBatteryEntry.getLabel()).thenReturn(APP_LABEL);
+ mBatteryEntry.mIconId = ICON_ID;
+
+ mFragment.mHeaderPreference = mHeaderPreference;
+ mFragment.mState = mState;
+ mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
+ mFragment.mBackupManager = mBackupManager;
+ mAppEntry.info = mock(ApplicationInfo.class);
+
+ mTestActivity = spy(new SettingsActivity());
+ doReturn(mPackageManager).when(mTestActivity).getPackageManager();
+ doReturn(mPackageManager).when(mActivity).getPackageManager();
+ doReturn(mAppOpsManager).when(mTestActivity).getSystemService(Context.APP_OPS_SERVICE);
+
+ final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+
+ Answer<Void> callable =
+ invocation -> {
+ mBundle = captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ System.out.println("mBundle = " + mBundle);
+ return null;
+ };
+ doAnswer(callable)
+ .when(mActivity)
+ .startActivityAsUser(captor.capture(), nullable(UserHandle.class));
+ doAnswer(callable).when(mActivity).startActivity(captor.capture());
+
+ mFooterPreference = spy(new FooterPreference(mContext));
+ mMainSwitchPreference = spy(new MainSwitchPreference(mContext));
+ mMainSwitchPreference.setKey(KEY_ALLOW_BACKGROUND_USAGE);
+ mOptimizePreference = spy(new SelectorWithWidgetPreference(mContext));
+ mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+ mUnrestrictedPreference = spy(new SelectorWithWidgetPreference(mContext));
+ mUnrestrictedPreference.setKey(KEY_PREF_UNRESTRICTED);
+ mFragment.mFooterPreference = mFooterPreference;
+ mFragment.mMainSwitchPreference = mMainSwitchPreference;
+ mFragment.mOptimizePreference = mOptimizePreference;
+ mFragment.mUnrestrictedPreference = mUnrestrictedPreference;
+ }
+
+ @After
+ public void reset() {
+ ShadowEntityHeaderController.reset();
+ }
+
+ @Test
+ public void initHeader_NoAppEntry_BuildByBundle() {
+ mFragment.mAppEntry = null;
+ mFragment.initHeader();
+
+ verify(mEntityHeaderController).setIcon(nullable(Drawable.class));
+ verify(mEntityHeaderController).setLabel(APP_LABEL);
+ }
+
+ @Test
+ public void initHeader_HasAppEntry_BuildByAppEntry() {
+ ReflectionHelpers.setStaticField(
+ AppUtils.class,
+ "sInstantAppDataProvider",
+ new InstantAppDataProvider() {
+ @Override
+ public boolean isInstantApp(ApplicationInfo info) {
+ return false;
+ }
+ });
+ mFragment.mAppEntry = mAppEntry;
+ mFragment.initHeader();
+
+ verify(mEntityHeaderController).setIcon(mAppEntry);
+ verify(mEntityHeaderController).setLabel(mAppEntry);
+ verify(mEntityHeaderController).setIsInstantApp(false);
+ }
+
+ @Test
+ public void initHeader_HasAppEntry_InstantApp() {
+ ReflectionHelpers.setStaticField(
+ AppUtils.class,
+ "sInstantAppDataProvider",
+ new InstantAppDataProvider() {
+ @Override
+ public boolean isInstantApp(ApplicationInfo info) {
+ return true;
+ }
+ });
+ mFragment.mAppEntry = mAppEntry;
+ mFragment.initHeader();
+
+ verify(mEntityHeaderController).setIcon(mAppEntry);
+ verify(mEntityHeaderController).setLabel(mAppEntry);
+ verify(mEntityHeaderController).setIsInstantApp(true);
+ }
+
+ @Test
+ public void initFooter_hasCorrectString() {
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false);
+
+ mFragment.initFooter();
+
+ assertThat(mFooterPreference.getTitle().toString())
+ .isEqualTo("Changing how an app uses your battery can affect its performance.");
+ }
+
+ @Test
+ public void onSwitchChanged_fromUnrestrictedModeSetDisabled_becomeRestrictedMode() {
+ final int restrictedMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ final int optimizedMode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+ mFragment.mOptimizationMode = optimizedMode;
+
+ mFragment.onSwitchChanged(mMockSwitch, /* isChecked= */ false);
+
+ verify(mOptimizePreference).setEnabled(false);
+ verify(mUnrestrictedPreference).setEnabled(false);
+ verify(mFragment).onRadioButtonClicked(null);
+ verify(mMainSwitchPreference).setChecked(false);
+ assertThat(mFragment.getSelectedPreference()).isEqualTo(restrictedMode);
+ verify(mBatteryOptimizeUtils).setAppUsageState(restrictedMode, Action.APPLY);
+ }
+
+ @Test
+ public void onSwitchChanged_fromRestrictedModeSetEnabled_becomeOptimizedMode() {
+ final int restrictedMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ final int optimizedMode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+ mFragment.mOptimizationMode = restrictedMode;
+
+ mFragment.onSwitchChanged(mMockSwitch, /* isChecked= */ true);
+
+ verify(mOptimizePreference).setEnabled(true);
+ verify(mUnrestrictedPreference).setEnabled(true);
+ verify(mFragment).onRadioButtonClicked(mOptimizePreference);
+ verify(mMainSwitchPreference).setChecked(true);
+ verify(mOptimizePreference).setChecked(true);
+ assertThat(mFragment.getSelectedPreference()).isEqualTo(optimizedMode);
+ verify(mBatteryOptimizeUtils).setAppUsageState(optimizedMode, Action.APPLY);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
index a0b449a..0131330 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
@@ -46,8 +46,8 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
- @Mock
- private PackageManager mPackageManager;
+
+ @Mock private PackageManager mPackageManager;
private PowerUsageFeatureProviderImpl mPowerFeatureProvider;
@Before
@@ -117,16 +117,18 @@
@Test
public void testIsSmartBatterySupported_smartBatterySupported_returnTrue() {
- when(mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_smart_battery_available)).thenReturn(true);
+ when(mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_smart_battery_available))
+ .thenReturn(true);
assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isTrue();
}
@Test
public void testIsSmartBatterySupported_smartBatteryNotSupported_returnFalse() {
- when(mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_smart_battery_available)).thenReturn(false);
+ when(mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_smart_battery_available))
+ .thenReturn(false);
assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
index 2449040..22d4ba3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
@@ -46,12 +46,9 @@
private Context mContext;
private PowerUsageTimeController mPowerUsageTimeController;
- @Mock
- private PreferenceCategory mPowerUsageTimeCategory;
- @Mock
- private PowerUsageTimePreference mScreenTimePreference;
- @Mock
- private PowerUsageTimePreference mBackgroundTimePreference;
+ @Mock private PreferenceCategory mPowerUsageTimeCategory;
+ @Mock private PowerUsageTimePreference mScreenTimePreference;
+ @Mock private PowerUsageTimePreference mBackgroundTimePreference;
@Before
public void setUp() {
@@ -67,18 +64,24 @@
@Test
public void handleScreenTimeUpdated_noInfo_prefInvisible() {
- mPowerUsageTimeController.handleScreenTimeUpdated(/*slotTime=*/ null,
- /*screenOnTimeInMs=*/ 0, /*backgroundTimeInMs=*/ 0,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ /* slotTime= */ null,
+ /* screenOnTimeInMs= */ 0,
+ /* backgroundTimeInMs= */ 0,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(false);
}
@Test
public void handleScreenTimeUpdated_onlySlotTime_prefInvisible() {
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- /*screenOnTimeInMs=*/ 0, /*backgroundTimeInMs=*/ 0,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ /* screenOnTimeInMs= */ 0,
+ /* backgroundTimeInMs= */ 0,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(false);
}
@@ -88,9 +91,12 @@
final long screenOnTimeAMinute = 60000;
final long backgroundTimeZero = 0;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeAMinute, backgroundTimeZero,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeAMinute,
+ backgroundTimeZero,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyOnePreferenceInvisible(mBackgroundTimePreference);
verify(mScreenTimePreference).setTimeTitle("Screen time");
@@ -103,9 +109,12 @@
final long screenOnTimeZero = 0;
final long backgroundTimeTwoMinutes = 120000;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeZero, backgroundTimeTwoMinutes,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeZero,
+ backgroundTimeTwoMinutes,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyOnePreferenceInvisible(mScreenTimePreference);
verify(mBackgroundTimePreference).setTimeTitle("Background time");
@@ -118,9 +127,12 @@
final long screenOnTimeAMinute = 60000;
final long backgroundTimeTwoMinutes = 120000;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeAMinute, backgroundTimeTwoMinutes,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeAMinute,
+ backgroundTimeTwoMinutes,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeTitle("Screen time");
@@ -137,9 +149,12 @@
final long backgroundTimeTwoMinutes = 120000;
final long screenOnTimeAMinute = 60000;
- mPowerUsageTimeController.handleScreenTimeUpdated(/*slotTime=*/ null,
- screenOnTimeAMinute, backgroundTimeTwoMinutes,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ /* slotTime= */ null,
+ screenOnTimeAMinute,
+ backgroundTimeTwoMinutes,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mPowerUsageTimeCategory).setTitle("App usage since last full charge");
@@ -150,9 +165,12 @@
final long screenOnTimeAMinute = 60000;
final long backgroundTimeLessThanAMinute = 59999;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeAMinute, backgroundTimeLessThanAMinute,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeAMinute,
+ backgroundTimeLessThanAMinute,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("1 min");
@@ -164,9 +182,12 @@
final long screenOnTimeLessThanAMinute = 59999;
final long backgroundTimeTwoMinutes = 120000;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeLessThanAMinute, backgroundTimeTwoMinutes,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeLessThanAMinute,
+ backgroundTimeTwoMinutes,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("Less than a min");
@@ -178,9 +199,12 @@
final long screenOnTimeLessThanAMinute = 59999;
final long backgroundTimeLessThanAMinute = 59999;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeLessThanAMinute, backgroundTimeLessThanAMinute,
- /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeLessThanAMinute,
+ backgroundTimeLessThanAMinute,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("Less than a min");
@@ -192,9 +216,12 @@
final long screenOnTimeAMinute = 60000;
final long backgroundTimeTwoMinutes = 120000;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeAMinute, backgroundTimeTwoMinutes,
- KEY_SCREEN_ON_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeAMinute,
+ backgroundTimeTwoMinutes,
+ KEY_SCREEN_ON_TIME_PREF,
+ TEST_ANOMALY_HINT_TEXT);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
@@ -206,9 +233,12 @@
final long screenOnTimeAMinute = 60000;
final long backgroundTimeTwoMinutes = 120000;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeAMinute, backgroundTimeTwoMinutes,
- KEY_BACKGROUND_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeAMinute,
+ backgroundTimeTwoMinutes,
+ KEY_BACKGROUND_TIME_PREF,
+ TEST_ANOMALY_HINT_TEXT);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
@@ -220,9 +250,12 @@
final long screenOnTimeZero = 0;
final long backgroundTimeTwoMinutes = 120000;
- mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
- screenOnTimeZero, backgroundTimeTwoMinutes,
- KEY_SCREEN_ON_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+ mPowerUsageTimeController.handleScreenTimeUpdated(
+ SLOT_TIME,
+ screenOnTimeZero,
+ backgroundTimeTwoMinutes,
+ KEY_SCREEN_ON_TIME_PREF,
+ TEST_ANOMALY_HINT_TEXT);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("Less than a min");
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
index 0321483..64efb6a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
@@ -33,7 +33,6 @@
import android.content.Intent;
import android.os.UserHandle;
import android.os.UserManager;
-import android.util.Pair;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
@@ -65,12 +64,9 @@
private static final String RESTRICTED_PACKAGE_NAME = "com.android.restricted.package";
private static final int OTHER_USER_UID = UserHandle.PER_USER_RANGE + RESTRICTED_UID;
- @Mock
- private AppOpsManager mAppOpsManager;
- @Mock
- private InstrumentedPreferenceFragment mFragment;
- @Mock
- private UserManager mUserManager;
+ @Mock private AppOpsManager mAppOpsManager;
+ @Mock private InstrumentedPreferenceFragment mFragment;
+ @Mock private UserManager mUserManager;
private AppOpsManager.PackageOps mRestrictedPackageOps;
private AppOpsManager.PackageOps mAllowedPackageOps;
@@ -84,19 +80,25 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
final List<AppOpsManager.OpEntry> allowOps = new ArrayList<>();
- allowOps.add(new AppOpsManager.OpEntry(
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, AppOpsManager.MODE_ALLOWED,
- Collections.emptyMap()));
+ allowOps.add(
+ new AppOpsManager.OpEntry(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ AppOpsManager.MODE_ALLOWED,
+ Collections.emptyMap()));
final List<AppOpsManager.OpEntry> restrictedOps = new ArrayList<>();
- restrictedOps.add(new AppOpsManager.OpEntry(
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, AppOpsManager.MODE_IGNORED,
- Collections.emptyMap()));
- mAllowedPackageOps = new AppOpsManager.PackageOps(
- ALLOWED_PACKAGE_NAME, ALLOWED_UID, allowOps);
- mRestrictedPackageOps = new AppOpsManager.PackageOps(
- RESTRICTED_PACKAGE_NAME, RESTRICTED_UID, restrictedOps);
- mOtherUserPackageOps = new AppOpsManager.PackageOps(
- RESTRICTED_PACKAGE_NAME, OTHER_USER_UID, restrictedOps);
+ restrictedOps.add(
+ new AppOpsManager.OpEntry(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ AppOpsManager.MODE_IGNORED,
+ Collections.emptyMap()));
+ mAllowedPackageOps =
+ new AppOpsManager.PackageOps(ALLOWED_PACKAGE_NAME, ALLOWED_UID, allowOps);
+ mRestrictedPackageOps =
+ new AppOpsManager.PackageOps(
+ RESTRICTED_PACKAGE_NAME, RESTRICTED_UID, restrictedOps);
+ mOtherUserPackageOps =
+ new AppOpsManager.PackageOps(
+ RESTRICTED_PACKAGE_NAME, OTHER_USER_UID, restrictedOps);
mContext = spy(ApplicationProvider.getApplicationContext());
doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
@@ -109,8 +111,8 @@
mPreferenceScreen = spy(new PreferenceScreen(mContext, null));
when(mPreferenceScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
when(mPreferenceScreen.getContext()).thenReturn(mContext);
- when(mPreferenceScreen.findPreference(
- RestrictAppPreferenceController.KEY_RESTRICT_APP)).thenReturn(mPreference);
+ when(mPreferenceScreen.findPreference(RestrictAppPreferenceController.KEY_RESTRICT_APP))
+ .thenReturn(mPreference);
final List<UserHandle> userHandles = new ArrayList<>();
userHandles.add(new UserHandle(0));
@@ -122,8 +124,8 @@
mPackageOpsList.add(mRestrictedPackageOps);
doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any(int[].class));
- final RestrictAppPreferenceController controller = new RestrictAppPreferenceController(
- mFragment);
+ final RestrictAppPreferenceController controller =
+ new RestrictAppPreferenceController(mFragment);
controller.displayPreference(mPreferenceScreen);
controller.updateState(mPreference);
@@ -138,8 +140,8 @@
mPackageOpsList.add(mOtherUserPackageOps);
doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any(int[].class));
- final RestrictAppPreferenceController controller = new RestrictAppPreferenceController(
- mFragment);
+ final RestrictAppPreferenceController controller =
+ new RestrictAppPreferenceController(mFragment);
controller.displayPreference(mPreferenceScreen);
controller.updateState(mPreference);
@@ -154,17 +156,18 @@
mPackageOpsList.add(mOtherUserPackageOps);
doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any(int[].class));
- final RestrictAppPreferenceController controller = new RestrictAppPreferenceController(
- mFragment);
+ final RestrictAppPreferenceController controller =
+ new RestrictAppPreferenceController(mFragment);
controller.displayPreference(mPreferenceScreen);
controller.updateState(mPreference);
assertThat(mPreference.getSummary()).isEqualTo("Limiting battery usage for 1 app");
- assertThat(controller.mAppInfos).containsExactly(
- new AppInfo.Builder()
- .setUid(RESTRICTED_UID)
- .setPackageName(RESTRICTED_PACKAGE_NAME)
- .build());
+ assertThat(controller.mAppInfos)
+ .containsExactly(
+ new AppInfo.Builder()
+ .setUid(RESTRICTED_UID)
+ .setPackageName(RESTRICTED_PACKAGE_NAME)
+ .build());
}
@Test
@@ -172,8 +175,8 @@
mPackageOpsList.add(mAllowedPackageOps);
doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any(int[].class));
- final RestrictAppPreferenceController controller = new RestrictAppPreferenceController(
- mFragment);
+ final RestrictAppPreferenceController controller =
+ new RestrictAppPreferenceController(mFragment);
controller.displayPreference(mPreferenceScreen);
controller.updateState(mPreference);
@@ -185,8 +188,8 @@
public void handlePreferenceTreeClick_startFragment() {
final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
- final RestrictAppPreferenceController controller = new RestrictAppPreferenceController(
- mFragment);
+ final RestrictAppPreferenceController controller =
+ new RestrictAppPreferenceController(mFragment);
controller.handlePreferenceTreeClick(mPreference);
verify(mContext).startActivity(intent.capture());
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
index 2991e78..54b8808 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
@@ -72,17 +72,11 @@
private static final int UID = UserHandle.getUid(USER_ID, 234);
private static final String APP_NAME = "app";
-
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private ApplicationInfo mApplicationInfo;
- @Mock
- private IconDrawableFactory mIconDrawableFactory;
- @Mock
- private InstrumentedPreferenceFragment mFragment;
- @Mock
- private BatteryDatabaseManager mBatteryDatabaseManager;
+ @Mock private PackageManager mPackageManager;
+ @Mock private ApplicationInfo mApplicationInfo;
+ @Mock private IconDrawableFactory mIconDrawableFactory;
+ @Mock private InstrumentedPreferenceFragment mFragment;
+ @Mock private BatteryDatabaseManager mBatteryDatabaseManager;
private PreferenceManager mPreferenceManager;
private RestrictedAppDetails mRestrictedAppDetails;
private Context mContext;
@@ -96,10 +90,7 @@
mContext = spy(RuntimeEnvironment.application);
mRestrictedAppDetails = spy(new RestrictedAppDetails());
- mAppInfo = new AppInfo.Builder()
- .setPackageName(PACKAGE_NAME)
- .setUid(UID)
- .build();
+ mAppInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME).setUid(UID).build();
mPreferenceManager = new PreferenceManager(mContext);
@@ -113,8 +104,9 @@
mRestrictedAppDetails.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
mRestrictedAppDetails.mBatteryUtils = spy(new BatteryUtils(mContext));
mRestrictedAppDetails.mBatteryDatabaseManager = mBatteryDatabaseManager;
- doReturn(mPreferenceManager).when(
- mRestrictedAppDetails.mRestrictedAppListGroup).getPreferenceManager();
+ doReturn(mPreferenceManager)
+ .when(mRestrictedAppDetails.mRestrictedAppListGroup)
+ .getPreferenceManager();
mCheckBoxPreference = new CheckBoxPreference(mContext);
mCheckBoxPreference.setKey(mRestrictedAppDetails.getKeyFromAppInfo(mAppInfo));
@@ -122,14 +114,17 @@
@Test
public void refreshUi_displayPreference() throws Exception {
- doReturn(mApplicationInfo).when(mPackageManager)
+ doReturn(mApplicationInfo)
+ .when(mPackageManager)
.getApplicationInfoAsUser(PACKAGE_NAME, 0, USER_ID);
doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
- doReturn(true).when(mRestrictedAppDetails.mBatteryUtils).isForceAppStandbyEnabled(UID,
- PACKAGE_NAME);
+ doReturn(true)
+ .when(mRestrictedAppDetails.mBatteryUtils)
+ .isForceAppStandbyEnabled(UID, PACKAGE_NAME);
final SparseLongArray timestampArray = new SparseLongArray();
timestampArray.put(UID, System.currentTimeMillis() - TimeUnit.HOURS.toMillis(5));
- doReturn(timestampArray).when(mBatteryDatabaseManager)
+ doReturn(timestampArray)
+ .when(mBatteryDatabaseManager)
.queryActionTime(AnomalyDatabaseHelper.ActionType.RESTRICTION);
mRestrictedAppDetails.refreshUi();
@@ -145,30 +140,32 @@
@Test
public void startRestrictedAppDetails_startWithCorrectData() {
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- doAnswer(invocation -> {
- // Get the intent in which it has the app info bundle
- mIntent = captor.getValue();
- return true;
- }).when(mContext).startActivity(captor.capture());
+ doAnswer(
+ invocation -> {
+ // Get the intent in which it has the app info bundle
+ mIntent = captor.getValue();
+ return true;
+ })
+ .when(mContext)
+ .startActivity(captor.capture());
- RestrictedAppDetails.startRestrictedAppDetails(mFragment,
- mRestrictedAppDetails.mAppInfos);
+ RestrictedAppDetails.startRestrictedAppDetails(mFragment, mRestrictedAppDetails.mAppInfos);
- final Bundle bundle = mIntent.getBundleExtra(
- SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ final Bundle bundle =
+ mIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
// Verify the bundle has the correct info
- final List<AppInfo> appInfos = bundle.getParcelableArrayList(
- RestrictedAppDetails.EXTRA_APP_INFO_LIST);
+ final List<AppInfo> appInfos =
+ bundle.getParcelableArrayList(RestrictedAppDetails.EXTRA_APP_INFO_LIST);
assertThat(appInfos).containsExactly(mAppInfo);
}
@Test
public void createDialogFragment_toRestrict_createRestrictDialog() {
- final BatteryTipDialogFragment dialogFragment = mRestrictedAppDetails.createDialogFragment(
- mAppInfo, true);
+ final BatteryTipDialogFragment dialogFragment =
+ mRestrictedAppDetails.createDialogFragment(mAppInfo, true);
- FragmentController.setupFragment(dialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ dialogFragment, FragmentActivity.class, 0 /* containerViewId */, null /* bundle */);
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
@@ -177,11 +174,11 @@
@Test
public void createDialogFragment_toUnrestrict_createUnrestrictDialog() {
- final BatteryTipDialogFragment dialogFragment = mRestrictedAppDetails.createDialogFragment(
- mAppInfo, false);
+ final BatteryTipDialogFragment dialogFragment =
+ mRestrictedAppDetails.createDialogFragment(mAppInfo, false);
- FragmentController.setupFragment(dialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ dialogFragment, FragmentActivity.class, 0 /* containerViewId */, null /* bundle */);
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
@@ -190,8 +187,8 @@
@Test
public void onBatteryTipHandled_restrict_setChecked() {
- final RestrictAppTip restrictAppTip = new RestrictAppTip(BatteryTip.StateType.NEW,
- mAppInfo);
+ final RestrictAppTip restrictAppTip =
+ new RestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
mRestrictedAppDetails.mRestrictedAppListGroup.addPreference(mCheckBoxPreference);
mRestrictedAppDetails.onBatteryTipHandled(restrictAppTip);
@@ -201,8 +198,8 @@
@Test
public void onBatteryTipHandled_unrestrict_setUnchecked() {
- final UnrestrictAppTip unrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW,
- mAppInfo);
+ final UnrestrictAppTip unrestrictAppTip =
+ new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
mRestrictedAppDetails.mRestrictedAppListGroup.addPreference(mCheckBoxPreference);
mRestrictedAppDetails.onBatteryTipHandled(unrestrictAppTip);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
deleted file mode 100644
index bcddbc2..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
-
-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 RestrictedPreferenceControllerTest {
- private static final int UID = 12345;
- private static final String PACKAGE_NAME = "com.android.app";
-
- private RestrictedPreferenceController mController;
- private SelectorWithWidgetPreference mPreference;
-
- @Mock BatteryOptimizeUtils mockBatteryOptimizeUtils;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mController = new RestrictedPreferenceController(
- RuntimeEnvironment.application, UID, PACKAGE_NAME);
- mPreference = new SelectorWithWidgetPreference(RuntimeEnvironment.application);
- mController.mBatteryOptimizeUtils = mockBatteryOptimizeUtils;
- }
-
- @Test
- public void testUpdateState_isValidPackage_prefEnabled() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isTrue();
- }
-
- @Test
- public void testUpdateState_invalidPackage_prefDisabled() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void testUpdateState_isSystemOrDefaultAppAndRestrictedStates_prefChecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
- when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
- BatteryOptimizeUtils.MODE_RESTRICTED);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isChecked()).isFalse();
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void testUpdateState_isRestrictedStates_prefChecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
- BatteryOptimizeUtils.MODE_RESTRICTED);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isChecked()).isTrue();
- }
-
- @Test
- public void testUpdateState_prefUnchecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isChecked()).isFalse();
- }
-
- @Test
- public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() {
- mPreference.setKey(mController.KEY_RESTRICTED_PREF);
- mController.handlePreferenceTreeClick(mPreference);
-
- assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
- }
-
- @Test
- public void testHandlePreferenceTreeClick_incorrectPrefKey_noAction() {
- assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java
index 6691bd5..b03602d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java
@@ -54,7 +54,8 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- doReturn(mock(DevicePolicyManager.class)).when(mContext)
+ doReturn(mock(DevicePolicyManager.class))
+ .when(mContext)
.getSystemService(Context.DEVICE_POLICY_SERVICE);
mFeatureFactory = FakeFeatureFactory.setupForTest();
@@ -99,26 +100,26 @@
public void testGetAvailabilityStatus_smartBatterySupported_returnAvailable() {
doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isSmartBatterySupported();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
}
@Test
public void testGetAvailabilityStatus_smartBatteryUnSupported_returnDisabled() {
doReturn(false).when(mFeatureFactory.powerUsageFeatureProvider).isSmartBatterySupported();
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
}
private void putSmartBatteryValue(int value) {
- Settings.Global.putInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, value);
+ Settings.Global.putInt(
+ mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, value);
}
private int getSmartBatteryValue() {
- return Settings.Global.getInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON);
+ return Settings.Global.getInt(
+ mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 7a7a384..3435987 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -50,12 +50,9 @@
private TopLevelBatteryPreferenceController mController;
private BatterySettingsFeatureProvider mBatterySettingsFeatureProvider;
- @Mock
- private UsbPort mUsbPort;
- @Mock
- private UsbManager mUsbManager;
- @Mock
- private UsbPortStatus mUsbPortStatus;
+ @Mock private UsbPort mUsbPort;
+ @Mock private UsbManager mUsbManager;
+ @Mock private UsbPortStatus mUsbPortStatus;
@Before
public void setUp() {
@@ -125,8 +122,7 @@
info.discharging = false;
info.chargeLabel = "5% - charging";
- assertThat(mController.getDashboardLabel(mContext, info, true))
- .isEqualTo(info.chargeLabel);
+ assertThat(mController.getDashboardLabel(mContext, info, true)).isEqualTo(info.chargeLabel);
}
@Test
@@ -136,8 +132,9 @@
BatteryInfo info = new BatteryInfo();
assertThat(mController.getDashboardLabel(mContext, info, true))
- .isEqualTo(mContext.getString(
- com.android.settingslib.R.string.battery_info_status_not_charging));
+ .isEqualTo(
+ mContext.getString(
+ com.android.settingslib.R.string.battery_info_status_not_charging));
}
@Test
@@ -147,8 +144,7 @@
info.batteryStatus = BatteryManager.BATTERY_STATUS_NOT_CHARGING;
info.statusLabel = "expected returned label";
- assertThat(mController.getDashboardLabel(mContext, info, true))
- .isEqualTo(info.statusLabel);
+ assertThat(mController.getDashboardLabel(mContext, info, true)).isEqualTo(info.statusLabel);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
index 9bed9ba..0c6f7da 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
@@ -18,8 +18,13 @@
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.pm.PackageManager;
+
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
@@ -37,43 +42,54 @@
private UnrestrictedPreferenceController mController;
private SelectorWithWidgetPreference mPreference;
+ private BatteryOptimizeUtils mBatteryOptimizeUtils;
- @Mock BatteryOptimizeUtils mockBatteryOptimizeUtils;
+ @Mock PackageManager mMockPackageManager;
@Before
- public void setUp() {
+ public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mController = new UnrestrictedPreferenceController(
- RuntimeEnvironment.application, UID, PACKAGE_NAME);
+ Context context = spy(RuntimeEnvironment.application);
+ BatteryUtils.getInstance(context).reset();
+ doReturn(UID)
+ .when(mMockPackageManager)
+ .getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA);
+
+ mController = new UnrestrictedPreferenceController(context, UID, PACKAGE_NAME);
mPreference = new SelectorWithWidgetPreference(RuntimeEnvironment.application);
- mController.mBatteryOptimizeUtils = mockBatteryOptimizeUtils;
+ mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(context, UID, PACKAGE_NAME));
+ mController.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
}
@Test
public void testUpdateState_isValidPackage_prefEnabled() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false);
mController.updateState(mPreference);
+ assertThat(mBatteryOptimizeUtils.isOptimizeModeMutable()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
}
@Test
public void testUpdateState_invalidPackage_prefDisabled() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false);
mController.updateState(mPreference);
+ assertThat(mBatteryOptimizeUtils.isOptimizeModeMutable()).isFalse();
assertThat(mPreference.isEnabled()).isFalse();
}
@Test
public void testUpdateState_isSystemOrDefaultAppAndUnrestrictedStates_prefChecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
- when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
- BatteryOptimizeUtils.MODE_UNRESTRICTED);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
mController.updateState(mPreference);
@@ -82,32 +98,38 @@
@Test
public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED);
mController.updateState(mPreference);
- assertThat(mPreference.isChecked()).isFalse();
assertThat(mPreference.isEnabled()).isFalse();
+ assertThat(mPreference.isChecked()).isFalse();
}
@Test
public void testUpdateState_isUnrestrictedStates_prefChecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
- when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
- BatteryOptimizeUtils.MODE_UNRESTRICTED);
+ when(mBatteryOptimizeUtils.isOptimizeModeMutable()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
mController.updateState(mPreference);
+ assertThat(mPreference.isEnabled()).isTrue();
assertThat(mPreference.isChecked()).isTrue();
}
@Test
public void testUpdateState_prefUnchecked() {
- when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false);
+ when(mBatteryOptimizeUtils.isOptimizeModeMutable()).thenReturn(true);
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED);
mController.updateState(mPreference);
+ assertThat(mPreference.isEnabled()).isTrue();
assertThat(mPreference.isChecked()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
index 7398e5c..cdcb12f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
@@ -47,10 +47,8 @@
private Context mContext;
private MainSwitchPreference mPreference;
- @Mock
- private PowerManager mPowerManager;
- @Mock
- private PreferenceScreen mPreferenceScreen;
+ @Mock private PowerManager mPowerManager;
+ @Mock private PreferenceScreen mPreferenceScreen;
@Before
public void setUp() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceControllerTest.java
index 2bb8f28..cdde8f9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSchedulePreferenceControllerTest.java
@@ -59,10 +59,12 @@
@Test
public void testPreference_lowPowerLevelZero_percentageMode_summaryNoSchedule() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- Settings.Global.putInt(mContext.getContentResolver(),
- Global.AUTOMATIC_POWER_SAVE_MODE, PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
mController.updateState(mPreference);
@@ -71,10 +73,14 @@
@Test
public void testPreference_lowPowerLevelNonZero_percentageMode_summaryPercentage() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, TRIGGER_LEVEL);
- Settings.Global.putInt(mContext.getContentResolver(),
- Global.AUTOMATIC_POWER_SAVE_MODE, PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
+ TRIGGER_LEVEL);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
mController.updateState(mPreference);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java
index 9de3ada..f224c8a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java
@@ -34,8 +34,7 @@
private Context mContext;
private ContentResolver mResolver;
private BatterySaverScheduleSeekBarController mController;
- @Mock
- private PreferenceScreen mScreen;
+ @Mock private PreferenceScreen mScreen;
@Before
public void setUp() {
@@ -83,7 +82,9 @@
@Test
public void updateSeekBar_routineMode_hasCorrectProperties() {
- Settings.Global.putInt(mResolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+ Settings.Global.putInt(
+ mResolver,
+ Global.AUTOMATIC_POWER_SAVE_MODE,
PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
mController.updateSeekBar();
@@ -95,7 +96,9 @@
@Test
public void updateSeekBar_percentageMode_hasCorrectProperties() {
final CharSequence expectedTitle = "10%";
- Settings.Global.putInt(mResolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+ Settings.Global.putInt(
+ mResolver,
+ Global.AUTOMATIC_POWER_SAVE_MODE,
PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
setTriggerLevel(10);
@@ -108,7 +111,9 @@
@Test
public void updateSeekBar_noneMode_hasCorrectProperties() {
- Settings.Global.putInt(mResolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+ Settings.Global.putInt(
+ mResolver,
+ Global.AUTOMATIC_POWER_SAVE_MODE,
PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
setTriggerLevel(0);
@@ -120,7 +125,9 @@
@Test
public void addToScreen_addsToEnd() {
- Settings.Global.putInt(mResolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+ Settings.Global.putInt(
+ mResolver,
+ Global.AUTOMATIC_POWER_SAVE_MODE,
PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
setTriggerLevel(15);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
index dc9cac4..2138e64 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
@@ -1,6 +1,7 @@
package com.android.settings.fuelgauge.batterysaver;
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.verifyNoMoreInteractions;
@@ -90,18 +91,25 @@
}
private void setSchedule(int scheduleType, int schedulePercentage) {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.AUTOMATIC_POWER_SAVE_MODE, scheduleType);
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, schedulePercentage);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+ scheduleType);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
+ schedulePercentage);
}
private void verifySchedule(String scheduleTypeKey, int schedulePercentage) {
waitAWhile();
- verify(mMetricsFeatureProvider).action(SettingsEnums.FUELGAUGE_BATTERY_SAVER,
- SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
- SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
- scheduleTypeKey, schedulePercentage);
+ verify(mMetricsFeatureProvider)
+ .action(
+ SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+ scheduleTypeKey,
+ schedulePercentage);
}
private void waitAWhile() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettingsTest.java
index c858902..84af4e1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettingsTest.java
@@ -34,13 +34,13 @@
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {
- com.android.settings.testutils.shadow.ShadowFragment.class,
-})
+@Config(
+ shadows = {
+ com.android.settings.testutils.shadow.ShadowFragment.class,
+ })
public class BatterySaverSettingsTest {
BatterySaverSettings mFragment;
- @Mock
- PreferenceScreen mScreen;
+ @Mock PreferenceScreen mScreen;
@Before
public void setUp() {
@@ -50,7 +50,6 @@
doReturn(mScreen).when(mFragment).getPreferenceScreen();
}
-
@Test
public void setupFooter_linkAddedWhenAppropriate() {
doReturn("").when(mFragment).getText(anyInt());
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java
index 4c276ba..22c59b0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java
@@ -63,16 +63,15 @@
private Context mContext;
private JobScheduler mJobScheduler;
- @Mock
- private JobParameters mParams;
+ @Mock private JobParameters mParams;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- mJobScheduler = spy(new JobSchedulerImpl(mContext,
- IJobScheduler.Stub.asInterface(new Binder())));
+ mJobScheduler =
+ spy(new JobSchedulerImpl(mContext, IJobScheduler.Stub.asInterface(new Binder())));
when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
}
@@ -108,25 +107,31 @@
@Ignore
public void onStartJob_cleanUpDataBefore30days() {
final BatteryDatabaseManager databaseManager = BatteryDatabaseManager.getInstance(mContext);
- final AnomalyCleanupJobService service = spy(Robolectric.setupService(
- AnomalyCleanupJobService.class));
+ final AnomalyCleanupJobService service =
+ spy(Robolectric.setupService(AnomalyCleanupJobService.class));
doNothing().when(service).jobFinished(any(), anyBoolean());
// Insert two records, one is current and the other one is 31 days before
- databaseManager.insertAnomaly(UID, PACKAGE_NAME, ANOMALY_TYPE,
- AnomalyDatabaseHelper.State.NEW, TIMESTAMP_NOW);
- databaseManager.insertAnomaly(UID, PACKAGE_NAME_OLD, ANOMALY_TYPE,
- AnomalyDatabaseHelper.State.NEW, TIMESTAMP_31_DAYS_BEFORE);
+ databaseManager.insertAnomaly(
+ UID, PACKAGE_NAME, ANOMALY_TYPE, AnomalyDatabaseHelper.State.NEW, TIMESTAMP_NOW);
+ databaseManager.insertAnomaly(
+ UID,
+ PACKAGE_NAME_OLD,
+ ANOMALY_TYPE,
+ AnomalyDatabaseHelper.State.NEW,
+ TIMESTAMP_31_DAYS_BEFORE);
service.onStartJob(mParams);
// In database, it only contains the current record
- final List<AppInfo> appInfos = databaseManager.queryAllAnomalies(0,
- AnomalyDatabaseHelper.State.NEW);
- assertThat(appInfos).containsExactly(new AppInfo.Builder()
- .setUid(UID)
- .setPackageName(PACKAGE_NAME)
- .addAnomalyType(ANOMALY_TYPE)
- .build());
+ final List<AppInfo> appInfos =
+ databaseManager.queryAllAnomalies(0, AnomalyDatabaseHelper.State.NEW);
+ assertThat(appInfos)
+ .containsExactly(
+ new AppInfo.Builder()
+ .setUid(UID)
+ .setPackageName(PACKAGE_NAME)
+ .addAnomalyType(ANOMALY_TYPE)
+ .build());
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobServiceTest.java
index 3807be6..345b8a1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigJobServiceTest.java
@@ -57,8 +57,7 @@
private static final int ANOMALY_CONFIG_VERSION = 1;
private static final String ANOMALY_CONFIG = "X64s";
- @Mock
- private StatsManager mStatsManager;
+ @Mock private StatsManager mStatsManager;
private Context mContext;
private JobScheduler mJobScheduler;
@@ -69,14 +68,16 @@
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- mJobScheduler = spy(new JobSchedulerImpl(mContext,
- IJobScheduler.Stub.asInterface(new Binder())));
+ mJobScheduler =
+ spy(new JobSchedulerImpl(mContext, IJobScheduler.Stub.asInterface(new Binder())));
when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
mJobService = spy(new AnomalyConfigJobService());
- doReturn(application.getSharedPreferences(AnomalyConfigJobService.PREF_DB,
- Context.MODE_PRIVATE)).when(mJobService).getSharedPreferences(anyString(),
- anyInt());
+ doReturn(
+ application.getSharedPreferences(
+ AnomalyConfigJobService.PREF_DB, Context.MODE_PRIVATE))
+ .when(mJobService)
+ .getSharedPreferences(anyString(), anyInt());
doReturn(application.getContentResolver()).when(mJobService).getContentResolver();
}
@@ -105,11 +106,13 @@
@Test
public void checkAnomalyConfig_newConfigExist_removeOldConfig()
- throws StatsManager.StatsUnavailableException{
- Settings.Global.putInt(application.getContentResolver(),
- Settings.Global.ANOMALY_CONFIG_VERSION, ANOMALY_CONFIG_VERSION);
- Settings.Global.putString(application.getContentResolver(), Settings.Global.ANOMALY_CONFIG,
- ANOMALY_CONFIG);
+ throws StatsManager.StatsUnavailableException {
+ Settings.Global.putInt(
+ application.getContentResolver(),
+ Settings.Global.ANOMALY_CONFIG_VERSION,
+ ANOMALY_CONFIG_VERSION);
+ Settings.Global.putString(
+ application.getContentResolver(), Settings.Global.ANOMALY_CONFIG, ANOMALY_CONFIG);
mJobService.checkAnomalyConfig(mStatsManager);
@@ -118,11 +121,13 @@
@Test
public void checkAnomalyConfig_newConfigExist_uploadNewConfig()
- throws StatsManager.StatsUnavailableException{
- Settings.Global.putInt(application.getContentResolver(),
- Settings.Global.ANOMALY_CONFIG_VERSION, ANOMALY_CONFIG_VERSION);
- Settings.Global.putString(application.getContentResolver(), Settings.Global.ANOMALY_CONFIG,
- ANOMALY_CONFIG);
+ throws StatsManager.StatsUnavailableException {
+ Settings.Global.putInt(
+ application.getContentResolver(),
+ Settings.Global.ANOMALY_CONFIG_VERSION,
+ ANOMALY_CONFIG_VERSION);
+ Settings.Global.putString(
+ application.getContentResolver(), Settings.Global.ANOMALY_CONFIG, ANOMALY_CONFIG);
mJobService.checkAnomalyConfig(mStatsManager);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index 1c37d31..a67e5d3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -86,20 +86,13 @@
"anomaly_type=6,auto_restriction=false";
private static final int ANOMALY_TYPE = 6;
private static final long VERSION_CODE = 15;
- @Mock
- private UserManager mUserManager;
- @Mock
- private BatteryDatabaseManager mBatteryDatabaseManager;
- @Mock
- private BatteryUtils mBatteryUtils;
- @Mock
- private PowerAllowlistBackend mPowerAllowlistBackend;
- @Mock
- private StatsDimensionsValue mStatsDimensionsValue;
- @Mock
- private JobParameters mJobParameters;
- @Mock
- private JobWorkItem mJobWorkItem;
+ @Mock private UserManager mUserManager;
+ @Mock private BatteryDatabaseManager mBatteryDatabaseManager;
+ @Mock private BatteryUtils mBatteryUtils;
+ @Mock private PowerAllowlistBackend mPowerAllowlistBackend;
+ @Mock private StatsDimensionsValue mStatsDimensionsValue;
+ @Mock private JobParameters mJobParameters;
+ @Mock private JobWorkItem mJobWorkItem;
private BatteryTipPolicy mPolicy;
private Bundle mBundle;
@@ -113,8 +106,8 @@
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- mJobScheduler = spy(new JobSchedulerImpl(mContext,
- IJobScheduler.Stub.asInterface(new Binder())));
+ mJobScheduler =
+ spy(new JobSchedulerImpl(mContext, IJobScheduler.Stub.asInterface(new Binder())));
when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
mPolicy = new BatteryTipPolicy(mContext);
@@ -146,17 +139,24 @@
@Test
public void saveAnomalyToDatabase_systemAllowlisted_doNotSave() {
doReturn(UID).when(mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
- doReturn(true).when(mPowerAllowlistBackend)
+ doReturn(true)
+ .when(mPowerAllowlistBackend)
.isAllowlisted(any(String[].class), any(Integer.class));
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
- mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
- mPowerAllowlistBackend, mContext.getContentResolver(),
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(
+ mContext,
+ mUserManager,
+ mBatteryDatabaseManager,
+ mBatteryUtils,
+ mPolicy,
+ mPowerAllowlistBackend,
+ mContext.getContentResolver(),
mFeatureFactory.powerUsageFeatureProvider,
- mFeatureFactory.metricsFeatureProvider, mBundle);
+ mFeatureFactory.metricsFeatureProvider,
+ mBundle);
- verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
- anyInt(), anyLong());
+ verify(mBatteryDatabaseManager, never())
+ .insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(), anyLong());
}
@Test
@@ -166,53 +166,76 @@
mBundle.putStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES, cookies);
doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
doReturn(false).when(mPowerAllowlistBackend).isSysAllowlisted(SYSTEM_PACKAGE);
- doReturn(Process.FIRST_APPLICATION_UID).when(
- mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
+ doReturn(Process.FIRST_APPLICATION_UID)
+ .when(mAnomalyDetectionJobService)
+ .extractUidFromStatsDimensionsValue(any());
doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt(), any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
- mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
- mPowerAllowlistBackend, mContext.getContentResolver(),
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(
+ mContext,
+ mUserManager,
+ mBatteryDatabaseManager,
+ mBatteryUtils,
+ mPolicy,
+ mPowerAllowlistBackend,
+ mContext.getContentResolver(),
mFeatureFactory.powerUsageFeatureProvider,
- mFeatureFactory.metricsFeatureProvider, mBundle);
+ mFeatureFactory.metricsFeatureProvider,
+ mBundle);
- verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
- anyInt(), anyLong());
- verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
- SettingsEnums.PAGE_UNKNOWN,
- SYSTEM_PACKAGE + "/" + VERSION_CODE,
- ANOMALY_TYPE);
+ verify(mBatteryDatabaseManager, never())
+ .insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(), anyLong());
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
+ SettingsEnums.PAGE_UNKNOWN,
+ SYSTEM_PACKAGE + "/" + VERSION_CODE,
+ ANOMALY_TYPE);
}
@Test
public void saveAnomalyToDatabase_systemUid_doNotSave() {
- doReturn(Process.SYSTEM_UID).when(
- mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
+ doReturn(Process.SYSTEM_UID)
+ .when(mAnomalyDetectionJobService)
+ .extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
- mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
- mPowerAllowlistBackend, mContext.getContentResolver(),
- mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(
+ mContext,
+ mUserManager,
+ mBatteryDatabaseManager,
+ mBatteryUtils,
+ mPolicy,
+ mPowerAllowlistBackend,
+ mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider,
+ mFeatureFactory.metricsFeatureProvider,
mBundle);
- verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
- anyInt(), anyLong());
+ verify(mBatteryDatabaseManager, never())
+ .insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(), anyLong());
}
@Test
public void saveAnomalyToDatabase_uidNull_doNotSave() {
- doReturn(AnomalyDetectionJobService.UID_NULL).when(
- mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
+ doReturn(AnomalyDetectionJobService.UID_NULL)
+ .when(mAnomalyDetectionJobService)
+ .extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
- mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
- mPowerAllowlistBackend, mContext.getContentResolver(),
- mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(
+ mContext,
+ mUserManager,
+ mBatteryDatabaseManager,
+ mBatteryUtils,
+ mPolicy,
+ mPowerAllowlistBackend,
+ mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider,
+ mFeatureFactory.metricsFeatureProvider,
mBundle);
- verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
- anyInt(), anyLong());
+ verify(mBatteryDatabaseManager, never())
+ .insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(), anyLong());
}
@Test
@@ -222,22 +245,36 @@
mBundle.putStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES, cookies);
doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
doReturn(false).when(mPowerAllowlistBackend).isSysAllowlisted(SYSTEM_PACKAGE);
- doReturn(Process.FIRST_APPLICATION_UID).when(
- mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
+ doReturn(Process.FIRST_APPLICATION_UID)
+ .when(mAnomalyDetectionJobService)
+ .extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
- mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
- mPowerAllowlistBackend, mContext.getContentResolver(),
- mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(
+ mContext,
+ mUserManager,
+ mBatteryDatabaseManager,
+ mBatteryUtils,
+ mPolicy,
+ mPowerAllowlistBackend,
+ mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider,
+ mFeatureFactory.metricsFeatureProvider,
mBundle);
- verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
- eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong());
- verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
- SettingsEnums.PAGE_UNKNOWN,
- SYSTEM_PACKAGE + "/" + VERSION_CODE,
- ANOMALY_TYPE);
+ verify(mBatteryDatabaseManager)
+ .insertAnomaly(
+ anyInt(),
+ anyString(),
+ eq(6),
+ eq(AnomalyDatabaseHelper.State.AUTO_HANDLED),
+ anyLong());
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
+ SettingsEnums.PAGE_UNKNOWN,
+ SYSTEM_PACKAGE + "/" + VERSION_CODE,
+ ANOMALY_TYPE);
}
@Test
@@ -247,22 +284,36 @@
mBundle.putStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES, cookies);
doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
doReturn(false).when(mPowerAllowlistBackend).isSysAllowlisted(SYSTEM_PACKAGE);
- doReturn(Process.FIRST_APPLICATION_UID).when(
- mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
+ doReturn(Process.FIRST_APPLICATION_UID)
+ .when(mAnomalyDetectionJobService)
+ .extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
- mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
- mPowerAllowlistBackend, mContext.getContentResolver(),
- mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(
+ mContext,
+ mUserManager,
+ mBatteryDatabaseManager,
+ mBatteryUtils,
+ mPolicy,
+ mPowerAllowlistBackend,
+ mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider,
+ mFeatureFactory.metricsFeatureProvider,
mBundle);
- verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
- eq(AnomalyDatabaseHelper.State.NEW), anyLong());
- verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
- SettingsEnums.PAGE_UNKNOWN,
- SYSTEM_PACKAGE + "/" + VERSION_CODE,
- ANOMALY_TYPE);
+ verify(mBatteryDatabaseManager)
+ .insertAnomaly(
+ anyInt(),
+ anyString(),
+ eq(6),
+ eq(AnomalyDatabaseHelper.State.NEW),
+ anyLong());
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
+ SettingsEnums.PAGE_UNKNOWN,
+ SYSTEM_PACKAGE + "/" + VERSION_CODE,
+ ANOMALY_TYPE);
}
@Test
@@ -280,8 +331,8 @@
statsDimensionsValues.add(intValue);
when(tupleValue.getTupleValueList()).thenReturn(statsDimensionsValues);
- assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(
- tupleValue)).isEqualTo(UID);
+ assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(tupleValue))
+ .isEqualTo(UID);
}
@Test
@@ -292,8 +343,8 @@
when(floatValue.getField()).thenReturn(AnomalyDetectionJobService.STATSD_UID_FILED);
when(floatValue.getFloatValue()).thenReturn(0f);
- assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(
- floatValue)).isEqualTo(AnomalyDetectionJobService.UID_NULL);
+ assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(floatValue))
+ .isEqualTo(AnomalyDetectionJobService.UID_NULL);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
index 58bc061..f080574 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import android.content.Context;
@@ -39,7 +38,6 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settingslib.fuelgauge.EstimateKt;
import org.junit.After;
import org.junit.Before;
@@ -98,20 +96,21 @@
mPackageManager.setApplicationIcon(PACKAGE_NAME, new ColorDrawable());
List<AppInfo> highUsageTips = new ArrayList<>();
- mAppInfo = new AppInfo.Builder()
- .setScreenOnTimeMs(SCREEN_TIME_MS)
- .setPackageName(PACKAGE_NAME)
- .build();
+ mAppInfo =
+ new AppInfo.Builder()
+ .setScreenOnTimeMs(SCREEN_TIME_MS)
+ .setPackageName(PACKAGE_NAME)
+ .build();
highUsageTips.add(mAppInfo);
mHighUsageTip = new HighUsageTip(SCREEN_TIME_MS, highUsageTips);
final List<AppInfo> restrictApps = new ArrayList<>();
restrictApps.add(mAppInfo);
- mRestrictedOneAppTip = new RestrictAppTip(BatteryTip.StateType.NEW,
- new ArrayList<>(restrictApps));
+ mRestrictedOneAppTip =
+ new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>(restrictApps));
restrictApps.add(mAppInfo);
- mRestrictTwoAppsTip = new RestrictAppTip(BatteryTip.StateType.NEW,
- new ArrayList<>(restrictApps));
+ mRestrictTwoAppsTip =
+ new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>(restrictApps));
mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
mDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW, false /* isPluggedIn */);
@@ -128,24 +127,30 @@
mDialogFragment = BatteryTipDialogFragment.newInstance(mHighUsageTip, METRICS_KEY);
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ mDialogFragment,
+ FragmentActivity.class,
+ 0 /* containerViewId */,
+ null /* bundle */);
Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
- assertThat(shadowDialog.getMessage()).isEqualTo(
- mContext.getString(R.string.battery_tip_dialog_message, 1));
+ assertThat(shadowDialog.getMessage())
+ .isEqualTo(mContext.getString(R.string.battery_tip_dialog_message, 1));
}
@Test
public void testOnCreateDialog_restrictOneAppTip_fireRestrictOneAppDialog() {
mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictedOneAppTip, METRICS_KEY);
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ mDialogFragment,
+ FragmentActivity.class,
+ 0 /* containerViewId */,
+ null /* bundle */);
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
@@ -163,9 +168,11 @@
mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictTwoAppsTip, METRICS_KEY);
-
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ mDialogFragment,
+ FragmentActivity.class,
+ 0 /* containerViewId */,
+ null /* bundle */);
Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
@@ -189,13 +196,16 @@
for (int i = 0; i < 6; i++) {
appInfos.add(mAppInfo);
}
- final RestrictAppTip restrictSixAppsTip = new RestrictAppTip(BatteryTip.StateType.NEW,
- appInfos);
+ final RestrictAppTip restrictSixAppsTip =
+ new RestrictAppTip(BatteryTip.StateType.NEW, appInfos);
mDialogFragment = BatteryTipDialogFragment.newInstance(restrictSixAppsTip, METRICS_KEY);
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ mDialogFragment,
+ FragmentActivity.class,
+ 0 /* containerViewId */,
+ null /* bundle */);
Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
@@ -215,8 +225,11 @@
mDialogFragment = BatteryTipDialogFragment.newInstance(mUnrestrictAppTip, METRICS_KEY);
ShadowUtils.setApplicationLabel(PACKAGE_NAME, DISPLAY_NAME);
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
+ FragmentController.setupFragment(
+ mDialogFragment,
+ FragmentActivity.class,
+ 0 /* containerViewId */,
+ null /* bundle */);
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java
index e13dcc0..5613c4e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java
@@ -50,21 +50,20 @@
public class BatteryTipLoaderTest {
private static final int[] TIP_ORDER = {
- BatteryTip.TipType.LOW_BATTERY,
- BatteryTip.TipType.BATTERY_DEFENDER,
- BatteryTip.TipType.DOCK_DEFENDER,
- BatteryTip.TipType.INCOMPATIBLE_CHARGER,
- BatteryTip.TipType.HIGH_DEVICE_USAGE};
+ BatteryTip.TipType.LOW_BATTERY,
+ BatteryTip.TipType.BATTERY_DEFENDER,
+ BatteryTip.TipType.DOCK_DEFENDER,
+ BatteryTip.TipType.INCOMPATIBLE_CHARGER,
+ BatteryTip.TipType.HIGH_DEVICE_USAGE
+ };
+
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private BatteryUsageStats mBatteryUsageStats;
- @Mock
- private PowerManager mPowerManager;
- @Mock
- private Intent mIntent;
- @Mock
- private BatteryUtils mBatteryUtils;
- @Mock
- private BatteryInfo mBatteryInfo;
+
+ @Mock private PowerManager mPowerManager;
+ @Mock private Intent mIntent;
+ @Mock private BatteryUtils mBatteryUtils;
+ @Mock private BatteryInfo mBatteryInfo;
private Context mContext;
private BatteryTipLoader mBatteryTipLoader;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index 1c1d2cc..eeedccc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -15,8 +15,7 @@
*/
package com.android.settings.fuelgauge.batterytip;
-import static com.android.settings.fuelgauge.batterytip.tips.BatteryTip.TipType
- .SMART_BATTERY_MANAGER;
+import static com.android.settings.fuelgauge.batterytip.tips.BatteryTip.TipType.SMART_BATTERY_MANAGER;
import static com.google.common.truth.Truth.assertThat;
@@ -31,8 +30,6 @@
import androidx.preference.PreferenceScreen;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
@@ -58,16 +55,11 @@
private static final String KEY_TIP = "key_battery_tip";
private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS;
- @Mock
- private BatteryTipPreferenceController.BatteryTipListener mBatteryTipListener;
- @Mock
- private PreferenceScreen mPreferenceScreen;
- @Mock
- private BatteryTip mBatteryTip;
- @Mock
- private SettingsActivity mSettingsActivity;
- @Mock
- private InstrumentedPreferenceFragment mFragment;
+ @Mock private BatteryTipPreferenceController.BatteryTipListener mBatteryTipListener;
+ @Mock private PreferenceScreen mPreferenceScreen;
+ @Mock private BatteryTip mBatteryTip;
+ @Mock private SettingsActivity mSettingsActivity;
+ @Mock private InstrumentedPreferenceFragment mFragment;
private Context mContext;
private CardPreference mCardPreference;
@@ -147,13 +139,13 @@
@Test
public void getAvailabilityStatus_returnAvailableUnsearchable() {
- assertThat(mBatteryTipPreferenceController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+ assertThat(mBatteryTipPreferenceController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
}
private BatteryTipPreferenceController buildBatteryTipPreferenceController() {
- final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
- mContext, KEY_PREF);
+ final BatteryTipPreferenceController controller =
+ new BatteryTipPreferenceController(mContext, KEY_PREF);
controller.setActivity(mSettingsActivity);
controller.setFragment(mFragment);
controller.setBatteryTipListener(mBatteryTipListener);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
index e4f286d..82a850e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
@@ -45,10 +45,8 @@
@RunWith(RobolectricTestRunner.class)
public class BatteryTipUtilsTest {
- @Mock
- private SettingsActivity mSettingsActivity;
- @Mock
- private InstrumentedPreferenceFragment mFragment;
+ @Mock private SettingsActivity mSettingsActivity;
+ @Mock private InstrumentedPreferenceFragment mFragment;
private RestrictAppTip mRestrictAppTip;
private LowBatteryTip mLowBatteryTip;
private BatteryDefenderTip mBatteryDefenderTip;
@@ -61,42 +59,49 @@
when(mSettingsActivity.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application);
mRestrictAppTip = spy(new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>()));
- mLowBatteryTip = spy(
- new LowBatteryTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */));
- mBatteryDefenderTip = spy(new BatteryDefenderTip(BatteryTip.StateType.NEW,
- false /* isPluggedIn */));
+ mLowBatteryTip =
+ spy(new LowBatteryTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */));
+ mBatteryDefenderTip =
+ spy(new BatteryDefenderTip(BatteryTip.StateType.NEW, false /* isPluggedIn */));
}
@Test
public void testGetActionForBatteryTip_typeRestrictStateNew_returnActionRestrict() {
when(mRestrictAppTip.getState()).thenReturn(BatteryTip.StateType.NEW);
- assertThat(BatteryTipUtils.getActionForBatteryTip(mRestrictAppTip, mSettingsActivity,
- mFragment)).isInstanceOf(RestrictAppAction.class);
+ assertThat(
+ BatteryTipUtils.getActionForBatteryTip(
+ mRestrictAppTip, mSettingsActivity, mFragment))
+ .isInstanceOf(RestrictAppAction.class);
}
@Test
public void testGetActionForBatteryTip_typeRestrictStateHandled_returnActionOpen() {
when(mRestrictAppTip.getState()).thenReturn(BatteryTip.StateType.HANDLED);
- assertThat(BatteryTipUtils.getActionForBatteryTip(mRestrictAppTip, mSettingsActivity,
- mFragment)).isInstanceOf(OpenRestrictAppFragmentAction.class);
+ assertThat(
+ BatteryTipUtils.getActionForBatteryTip(
+ mRestrictAppTip, mSettingsActivity, mFragment))
+ .isInstanceOf(OpenRestrictAppFragmentAction.class);
}
@Test
public void testGetActionForBatteryTip_typeLowBatteryStateNew_returnActionOpen() {
when(mLowBatteryTip.getState()).thenReturn(BatteryTip.StateType.NEW);
- assertThat(BatteryTipUtils.getActionForBatteryTip(mLowBatteryTip, mSettingsActivity,
- mFragment)).isInstanceOf(OpenBatterySaverAction.class);
+ assertThat(
+ BatteryTipUtils.getActionForBatteryTip(
+ mLowBatteryTip, mSettingsActivity, mFragment))
+ .isInstanceOf(OpenBatterySaverAction.class);
}
@Test
- public void
- testGetActionForBatteryTip_typeBatteryDefenderStateNew_returnNullAction() {
+ public void testGetActionForBatteryTip_typeBatteryDefenderStateNew_returnNullAction() {
when(mBatteryDefenderTip.getState()).thenReturn(BatteryTip.StateType.NEW);
- assertThat(BatteryTipUtils.getActionForBatteryTip(mBatteryDefenderTip, mSettingsActivity,
- mFragment)).isNull();
+ assertThat(
+ BatteryTipUtils.getActionForBatteryTip(
+ mBatteryDefenderTip, mSettingsActivity, mFragment))
+ .isNull();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java
index a0e205d..0310225 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java
@@ -24,9 +24,9 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
import java.time.Duration;
-import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class HighUsageDataParserTest {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentActionTest.java
index 71202df..e5ada76 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentActionTest.java
@@ -39,10 +39,10 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
import java.util.ArrayList;
import java.util.List;
-import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class OpenRestrictAppFragmentActionTest {
@@ -53,10 +53,8 @@
private static final int ANOMALY_BT = 1;
private static final int METRICS_KEY = 1;
- @Mock
- private InstrumentedPreferenceFragment mFragment;
- @Mock
- private BatteryDatabaseManager mBatteryDatabaseManager;
+ @Mock private InstrumentedPreferenceFragment mFragment;
+ @Mock private BatteryDatabaseManager mBatteryDatabaseManager;
private OpenRestrictAppFragmentAction mAction;
private FakeFeatureFactory mFeatureFactory;
private Context mContext;
@@ -67,19 +65,22 @@
MockitoAnnotations.initMocks(this);
mContext = ApplicationProvider.getApplicationContext();
mAppInfos = new ArrayList<>();
- mAppInfos.add(new AppInfo.Builder()
- .setPackageName(PACKAGE_NAME_1)
- .addAnomalyType(ANOMALY_BT)
- .build());
- mAppInfos.add(new AppInfo.Builder()
- .setPackageName(PACKAGE_NAME_2)
- .addAnomalyType(ANOMALY_WAKEUP)
- .build());
+ mAppInfos.add(
+ new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME_1)
+ .addAnomalyType(ANOMALY_BT)
+ .build());
+ mAppInfos.add(
+ new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME_2)
+ .addAnomalyType(ANOMALY_WAKEUP)
+ .build());
mFeatureFactory = FakeFeatureFactory.setupForTest();
when(mFragment.getContext()).thenReturn(mContext);
- mAction = new OpenRestrictAppFragmentAction(mFragment,
- new RestrictAppTip(BatteryTip.StateType.HANDLED, mAppInfos));
+ mAction =
+ new OpenRestrictAppFragmentAction(
+ mFragment, new RestrictAppTip(BatteryTip.StateType.HANDLED, mAppInfos));
mAction.mBatteryDatabaseManager = mBatteryDatabaseManager;
}
@@ -93,9 +94,12 @@
public void testHandlePositiveAction() {
mAction.handlePositiveAction(METRICS_KEY);
- verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_TIP_OPEN_APP_RESTRICTION_PAGE, METRICS_KEY);
- verify(mBatteryDatabaseManager).updateAnomalies(mAppInfos,
- AnomalyDatabaseHelper.State.HANDLED);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_TIP_OPEN_APP_RESTRICTION_PAGE,
+ METRICS_KEY);
+ verify(mBatteryDatabaseManager)
+ .updateAnomalies(mAppInfos, AnomalyDatabaseHelper.State.HANDLED);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
index 121348a..19e3442 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
@@ -52,8 +52,7 @@
private static final int ANOMALY_BT = 1;
private static final int METRICS_KEY = 1;
- @Mock
- private BatteryUtils mBatteryUtils;
+ @Mock private BatteryUtils mBatteryUtils;
private RestrictAppAction mRestrictAppAction;
private FakeFeatureFactory mFeatureFactory;
@@ -62,20 +61,20 @@
MockitoAnnotations.initMocks(this);
final List<AppInfo> mAppInfos = new ArrayList<>();
- mAppInfos.add(new AppInfo.Builder()
- .setUid(UID_1)
- .setPackageName(PACKAGE_NAME_1)
- .build());
- mAppInfos.add(new AppInfo.Builder()
- .setUid(UID_2)
- .setPackageName(PACKAGE_NAME_2)
- .addAnomalyType(ANOMALY_BT)
- .addAnomalyType(ANOMALY_WAKEUP)
- .build());
+ mAppInfos.add(new AppInfo.Builder().setUid(UID_1).setPackageName(PACKAGE_NAME_1).build());
+ mAppInfos.add(
+ new AppInfo.Builder()
+ .setUid(UID_2)
+ .setPackageName(PACKAGE_NAME_2)
+ .addAnomalyType(ANOMALY_BT)
+ .addAnomalyType(ANOMALY_WAKEUP)
+ .build());
mFeatureFactory = FakeFeatureFactory.setupForTest();
- mRestrictAppAction = new RestrictAppAction(RuntimeEnvironment.application,
- new RestrictAppTip(BatteryTip.StateType.NEW, mAppInfos));
+ mRestrictAppAction =
+ new RestrictAppAction(
+ RuntimeEnvironment.application,
+ new RestrictAppTip(BatteryTip.StateType.NEW, mAppInfos));
mRestrictAppAction.mBatteryUtils = mBatteryUtils;
}
@@ -89,17 +88,28 @@
public void testHandlePositiveAction() {
mRestrictAppAction.handlePositiveAction(METRICS_KEY);
- verify(mBatteryUtils)
- .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_IGNORED);
- verify(mBatteryUtils)
- .setForceAppStandby(UID_2, PACKAGE_NAME_2, AppOpsManager.MODE_IGNORED);
- verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_1, 0);
- verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2,
- ANOMALY_WAKEUP);
- verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2,
- ANOMALY_BT);
+ verify(mBatteryUtils).setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_IGNORED);
+ verify(mBatteryUtils).setForceAppStandby(UID_2, PACKAGE_NAME_2, AppOpsManager.MODE_IGNORED);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
+ METRICS_KEY,
+ PACKAGE_NAME_1,
+ 0);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
+ METRICS_KEY,
+ PACKAGE_NAME_2,
+ ANOMALY_WAKEUP);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
+ METRICS_KEY,
+ PACKAGE_NAME_2,
+ ANOMALY_BT);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java
index 1ef9a8a..0f4a043 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java
@@ -44,8 +44,7 @@
private static final String PACKAGE_NAME_1 = "com.android.app1";
private static final int METRICS_KEY = 1;
- @Mock
- private BatteryUtils mBatteryUtils;
+ @Mock private BatteryUtils mBatteryUtils;
private UnrestrictAppAction mUnrestrictAppAction;
private FakeFeatureFactory mFeatureFactory;
@@ -53,14 +52,14 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- final AppInfo appInfo = new AppInfo.Builder()
- .setUid(UID_1)
- .setPackageName(PACKAGE_NAME_1)
- .build();
+ final AppInfo appInfo =
+ new AppInfo.Builder().setUid(UID_1).setPackageName(PACKAGE_NAME_1).build();
mFeatureFactory = FakeFeatureFactory.setupForTest();
- mUnrestrictAppAction = new UnrestrictAppAction(RuntimeEnvironment.application,
- new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo));
+ mUnrestrictAppAction =
+ new UnrestrictAppAction(
+ RuntimeEnvironment.application,
+ new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo));
mUnrestrictAppAction.mBatteryUtils = mBatteryUtils;
}
@@ -73,13 +72,13 @@
public void testHandlePositiveAction() {
mUnrestrictAppAction.handlePositiveAction(METRICS_KEY);
- verify(mBatteryUtils)
- .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_ALLOWED);
- verify(mFeatureFactory.metricsFeatureProvider).action(
- SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP,
- METRICS_KEY,
- PACKAGE_NAME_1,
- 0);
+ verify(mBatteryUtils).setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_ALLOWED);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP,
+ METRICS_KEY,
+ PACKAGE_NAME_1,
+ 0);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java
index 64d5d04..0a63ba2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java
@@ -38,8 +38,7 @@
@RunWith(RobolectricTestRunner.class)
public class BatteryDefenderDetectorTest {
- @Mock
- private BatteryInfo mBatteryInfo;
+ @Mock private BatteryInfo mBatteryInfo;
private BatteryDefenderDetector mBatteryDefenderDetector;
private Context mContext;
@@ -53,8 +52,7 @@
mContext = ApplicationProvider.getApplicationContext();
- mBatteryDefenderDetector = new BatteryDefenderDetector(
- mBatteryInfo, mContext);
+ mBatteryDefenderDetector = new BatteryDefenderDetector(mBatteryInfo, mContext);
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java
index bd2c5d1..b90733d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java
@@ -59,25 +59,35 @@
mBatteryInfo = new BatteryInfo();
mBatteryInfo.pluggedStatus = BatteryManager.BATTERY_PLUGGED_DOCK;
mDockDefenderDetector = new DockDefenderDetector(mBatteryInfo, mContext);
- Intent intent = BatteryTestUtils.getCustomBatteryIntent(BatteryManager.BATTERY_PLUGGED_DOCK,
- 50 /* level */, 100 /* scale */, BatteryManager.BATTERY_STATUS_CHARGING);
- doReturn(intent).when(mContext).registerReceiver(eq(null),
- refEq(new IntentFilter(Intent.ACTION_BATTERY_CHANGED)));
+ Intent intent =
+ BatteryTestUtils.getCustomBatteryIntent(
+ BatteryManager.BATTERY_PLUGGED_DOCK,
+ 50 /* level */,
+ 100 /* scale */,
+ BatteryManager.BATTERY_STATUS_CHARGING);
+ doReturn(intent)
+ .when(mContext)
+ .registerReceiver(eq(null), refEq(new IntentFilter(Intent.ACTION_BATTERY_CHANGED)));
- Settings.Global.putInt(mContext.getContentResolver(),
- BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS,
+ 0);
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
}
@Test
public void testDetect_dockDefenderTemporarilyBypassed() {
- Settings.Global.putInt(mContext.getContentResolver(),
- BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 1);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS,
+ 1);
BatteryTip batteryTip = mDockDefenderDetector.detect();
assertTrue(batteryTip instanceof DockDefenderTip);
- assertEquals(((DockDefenderTip) batteryTip).getMode(),
+ assertEquals(
+ ((DockDefenderTip) batteryTip).getMode(),
BatteryUtils.DockDefenderMode.TEMPORARILY_BYPASSED);
}
@@ -89,8 +99,8 @@
BatteryTip batteryTip = mDockDefenderDetector.detect();
assertTrue(batteryTip instanceof DockDefenderTip);
- assertEquals(((DockDefenderTip) batteryTip).getMode(),
- BatteryUtils.DockDefenderMode.ACTIVE);
+ assertEquals(
+ ((DockDefenderTip) batteryTip).getMode(), BatteryUtils.DockDefenderMode.ACTIVE);
}
@Test
@@ -101,7 +111,8 @@
BatteryTip batteryTip = mDockDefenderDetector.detect();
assertTrue(batteryTip instanceof DockDefenderTip);
- assertEquals(((DockDefenderTip) batteryTip).getMode(),
+ assertEquals(
+ ((DockDefenderTip) batteryTip).getMode(),
BatteryUtils.DockDefenderMode.FUTURE_BYPASS);
}
@@ -113,8 +124,8 @@
BatteryTip batteryTip = mDockDefenderDetector.detect();
assertTrue(batteryTip instanceof DockDefenderTip);
- assertEquals(((DockDefenderTip) batteryTip).getMode(),
- BatteryUtils.DockDefenderMode.DISABLED);
+ assertEquals(
+ ((DockDefenderTip) batteryTip).getMode(), BatteryUtils.DockDefenderMode.DISABLED);
}
@Test
@@ -124,8 +135,8 @@
BatteryTip batteryTip = mDockDefenderDetector.detect();
assertTrue(batteryTip instanceof DockDefenderTip);
- assertEquals(((DockDefenderTip) batteryTip).getMode(),
- BatteryUtils.DockDefenderMode.DISABLED);
+ assertEquals(
+ ((DockDefenderTip) batteryTip).getMode(), BatteryUtils.DockDefenderMode.DISABLED);
}
@Test
@@ -136,7 +147,7 @@
BatteryTip batteryTip = mDockDefenderDetector.detect();
assertTrue(batteryTip instanceof DockDefenderTip);
- assertEquals(((DockDefenderTip) batteryTip).getMode(),
- BatteryUtils.DockDefenderMode.DISABLED);
+ assertEquals(
+ ((DockDefenderTip) batteryTip).getMode(), BatteryUtils.DockDefenderMode.DISABLED);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
index c125876..b9f9ed2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
@@ -62,18 +62,12 @@
private static final double POWER_LOW = 10000;
private Context mContext;
- @Mock
- private UidBatteryConsumer mHighBatteryConsumer;
- @Mock
- private UidBatteryConsumer mLowBatteryConsumer;
- @Mock
- private UidBatteryConsumer mSystemBatteryConsumer;
- @Mock
- private HighUsageDataParser mDataParser;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
- @Mock
- private BatteryStatsManager mBatteryStatsManager;
+ @Mock private UidBatteryConsumer mHighBatteryConsumer;
+ @Mock private UidBatteryConsumer mLowBatteryConsumer;
+ @Mock private UidBatteryConsumer mSystemBatteryConsumer;
+ @Mock private HighUsageDataParser mDataParser;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryStatsManager mBatteryStatsManager;
private AppInfo mHighAppInfo;
private AppInfo mLowAppInfo;
@@ -94,11 +88,17 @@
when(mBatteryStatsManager.getBatteryUsageStats(any(BatteryUsageStatsQuery.class)))
.thenReturn(mBatteryUsageStats);
- mContext.sendStickyBroadcast(new Intent(Intent.ACTION_BATTERY_CHANGED)
- .putExtra(BatteryManager.EXTRA_PLUGGED, 0));
+ mContext.sendStickyBroadcast(
+ new Intent(Intent.ACTION_BATTERY_CHANGED)
+ .putExtra(BatteryManager.EXTRA_PLUGGED, 0));
- mHighUsageDetector = spy(new HighUsageDetector(mContext, mPolicy, mBatteryUsageStats,
- mBatteryUtils.getBatteryInfo(TAG)));
+ mHighUsageDetector =
+ spy(
+ new HighUsageDetector(
+ mContext,
+ mPolicy,
+ mBatteryUsageStats,
+ mBatteryUtils.getBatteryInfo(TAG)));
mHighUsageDetector.mBatteryUtils = mBatteryUtils;
mHighUsageDetector.mDataParser = mDataParser;
doNothing().when(mHighUsageDetector).parseBatteryData();
@@ -111,12 +111,8 @@
when(mBatteryUsageStats.getDischargePercentage()).thenReturn(100);
when(mBatteryUsageStats.getConsumedPower()).thenReturn(POWER_HIGH + POWER_LOW);
- mHighAppInfo = new AppInfo.Builder()
- .setUid(UID_HIGH)
- .build();
- mLowAppInfo = new AppInfo.Builder()
- .setUid(UID_LOW)
- .build();
+ mHighAppInfo = new AppInfo.Builder().setUid(UID_HIGH).build();
+ mLowAppInfo = new AppInfo.Builder().setUid(UID_LOW).build();
ArrayList<UidBatteryConsumer> consumers = new ArrayList<>();
consumers.add(mSystemBatteryConsumer);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetectorTest.java
index 9ababe7..3f65a67 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/IncompatibleChargerDetectorTest.java
@@ -81,6 +81,6 @@
when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
when(mUsbPort.supportsComplianceWarnings()).thenReturn(true);
when(mUsbPortStatus.isConnected()).thenReturn(true);
- when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
+ when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[] {1});
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java
index c9e201b..8e3de7c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java
@@ -40,8 +40,7 @@
@RunWith(RobolectricTestRunner.class)
public class LowBatteryDetectorTest {
- @Mock
- private BatteryInfo mBatteryInfo;
+ @Mock private BatteryInfo mBatteryInfo;
private BatteryTipPolicy mPolicy;
private LowBatteryDetector mLowBatteryDetector;
private Context mContext;
@@ -55,15 +54,16 @@
ReflectionHelpers.setField(mPolicy, "lowBatteryEnabled", true);
mBatteryInfo.discharging = true;
- mLowBatteryDetector = new LowBatteryDetector(mContext, mPolicy, mBatteryInfo,
- false /* isPowerSaveMode */);
+ mLowBatteryDetector =
+ new LowBatteryDetector(
+ mContext, mPolicy, mBatteryInfo, false /* isPowerSaveMode */);
}
@Test
public void testDetect_disabledByPolicy_tipInvisible() {
ReflectionHelpers.setField(mPolicy, "lowBatteryEnabled", false);
- mLowBatteryDetector = new LowBatteryDetector(mContext, mPolicy, mBatteryInfo,
- true /* isPowerSaveMode */);
+ mLowBatteryDetector =
+ new LowBatteryDetector(mContext, mPolicy, mBatteryInfo, true /* isPowerSaveMode */);
assertThat(mLowBatteryDetector.detect().isVisible()).isFalse();
}
@@ -84,8 +84,8 @@
@Test
public void testDetect_batterySaverOn_tipInvisible() {
- mLowBatteryDetector = new LowBatteryDetector(mContext, mPolicy, mBatteryInfo,
- true /* isPowerSaveMode */);
+ mLowBatteryDetector =
+ new LowBatteryDetector(mContext, mPolicy, mBatteryInfo, true /* isPowerSaveMode */);
assertThat(mLowBatteryDetector.detect().getState())
.isEqualTo(BatteryTip.StateType.INVISIBLE);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java
index d40f5b8..bd207ee 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java
@@ -22,7 +22,6 @@
import android.content.ContentResolver;
import android.content.Context;
-import android.os.PowerManager;
import android.provider.Settings;
import com.android.settings.fuelgauge.BatteryInfo;
@@ -49,8 +48,7 @@
private SmartBatteryDetector mSmartBatteryDetector;
private BatteryTipPolicy mPolicy;
- @Mock
- private BatteryInfo mBatteryInfo;
+ @Mock private BatteryInfo mBatteryInfo;
@Before
public void setUp() {
@@ -59,8 +57,13 @@
mContext = RuntimeEnvironment.application;
mContentResolver = mContext.getContentResolver();
mPolicy = spy(new BatteryTipPolicy(mContext));
- mSmartBatteryDetector = new SmartBatteryDetector(mContext, mPolicy, mBatteryInfo,
- mContentResolver, false /* isPowerSaveMode */);
+ mSmartBatteryDetector =
+ new SmartBatteryDetector(
+ mContext,
+ mPolicy,
+ mBatteryInfo,
+ mContentResolver,
+ false /* isPowerSaveMode */);
}
@Test
@@ -72,8 +75,8 @@
@Test
public void testDetect_smartBatteryOff_tipVisible() {
- Settings.Global.putInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0);
+ Settings.Global.putInt(
+ mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0);
mBatteryInfo.batteryLevel = EXPECTED_BATTERY_LEVEL;
assertThat(mSmartBatteryDetector.detect().isVisible()).isTrue();
@@ -81,30 +84,40 @@
@Test
public void testDetect_batterySaverOn_tipInvisible() {
- Settings.Global.putInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0);
+ Settings.Global.putInt(
+ mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0);
mBatteryInfo.batteryLevel = EXPECTED_BATTERY_LEVEL;
- mSmartBatteryDetector = new SmartBatteryDetector(mContext, mPolicy, mBatteryInfo,
- mContentResolver, true /* isPowerSaveMode */);
+ mSmartBatteryDetector =
+ new SmartBatteryDetector(
+ mContext,
+ mPolicy,
+ mBatteryInfo,
+ mContentResolver,
+ true /* isPowerSaveMode */);
assertThat(mSmartBatteryDetector.detect().isVisible()).isFalse();
}
@Test
public void testDetect_unexpectedBatteryLevel_tipInvisible() {
- Settings.Global.putInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0);
+ Settings.Global.putInt(
+ mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0);
mBatteryInfo.batteryLevel = UNEXPECTED_BATTERY_LEVEL;
- mSmartBatteryDetector = new SmartBatteryDetector(mContext, mPolicy, mBatteryInfo,
- mContentResolver, true /* isPowerSaveMode */);
+ mSmartBatteryDetector =
+ new SmartBatteryDetector(
+ mContext,
+ mPolicy,
+ mBatteryInfo,
+ mContentResolver,
+ true /* isPowerSaveMode */);
assertThat(mSmartBatteryDetector.detect().isVisible()).isFalse();
}
@Test
public void testDetect_smartBatteryOn_tipInvisible() {
- Settings.Global.putInt(mContentResolver,
- Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1);
+ Settings.Global.putInt(
+ mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1);
mBatteryInfo.batteryLevel = EXPECTED_BATTERY_LEVEL;
assertThat(mSmartBatteryDetector.detect().isVisible()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
index eee2df3..f8a4f28 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
@@ -17,9 +17,7 @@
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.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -63,8 +61,8 @@
mFeatureFactory = FakeFeatureFactory.setupForTest();
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
mContext = RuntimeEnvironment.application;
- mBatteryDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW,
- false /* isPluggedIn */);
+ mBatteryDefenderTip =
+ new BatteryDefenderTip(BatteryTip.StateType.NEW, false /* isPluggedIn */);
when(mPreference.getContext()).thenReturn(mContext);
when(mCardPreference.getContext()).thenReturn(mContext);
@@ -93,8 +91,8 @@
mBatteryDefenderTip.updateState(mBatteryTip);
mBatteryDefenderTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- SettingsEnums.ACTION_BATTERY_DEFENDER_TIP, mBatteryTip.mState);
+ verify(mMetricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_DEFENDER_TIP, mBatteryTip.mState);
}
@Test
@@ -131,8 +129,8 @@
@Test
public void updatePreference_whenCharging_setPrimaryButtonVisibleToBeTrue() {
- mBatteryDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW,
- true /* isPluggedIn */);
+ mBatteryDefenderTip =
+ new BatteryDefenderTip(BatteryTip.StateType.NEW, true /* isPluggedIn */);
mBatteryDefenderTip.updatePreference(mCardPreference);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
index ecac4f9..45fdc1f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
@@ -45,8 +45,7 @@
private static final String TITLE = "title";
private static final String SUMMARY = "summary";
- @DrawableRes
- private static final int ICON_ID = R.drawable.ic_fingerprint;
+ @DrawableRes private static final int ICON_ID = R.drawable.ic_fingerprint;
private Context mContext;
private TestBatteryTip mBatteryTip;
@@ -86,8 +85,10 @@
@Test
public void updatePreference_resetLayoutState() {
mContext.setTheme(R.style.Theme_Settings);
- PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
- View.inflate(mContext, R.layout.card_preference_layout, /* parent= */ null));
+ PreferenceViewHolder holder =
+ PreferenceViewHolder.createInstanceForTests(
+ View.inflate(
+ mContext, R.layout.card_preference_layout, /* parent= */ null));
CardPreference cardPreference = new CardPreference(mContext);
cardPreference.onBindViewHolder(holder);
cardPreference.setPrimaryButtonVisible(true);
@@ -113,9 +114,7 @@
assertThat(mBatteryTip.toString()).isEqualTo("type=6 state=0");
}
- /**
- * Used to test the non abstract methods in {@link TestBatteryTip}
- */
+ /** Used to test the non abstract methods in {@link TestBatteryTip} */
public static class TestBatteryTip extends BatteryTip {
TestBatteryTip() {
super(TipType.SUMMARY, StateType.NEW, true);
@@ -150,14 +149,15 @@
// do nothing
}
- public final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new TestBatteryTip(in);
- }
+ public final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new TestBatteryTip(in);
+ }
- public BatteryTip[] newArray(int size) {
- return new TestBatteryTip[size];
- }
- };
+ public BatteryTip[] newArray(int size) {
+ return new TestBatteryTip[size];
+ }
+ };
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTipTest.java
index e897a1c..6d6c2e0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTipTest.java
@@ -54,10 +54,8 @@
private FakeFeatureFactory mFeatureFactory;
private MetricsFeatureProvider mMetricsFeatureProvider;
- @Mock
- private Preference mPreference;
- @Mock
- private CardPreference mCardPreference;
+ @Mock private Preference mPreference;
+ @Mock private CardPreference mCardPreference;
@Before
public void setUp() {
@@ -67,14 +65,18 @@
mFeatureFactory = FakeFeatureFactory.setupForTest();
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
- mDockDefenderTipFutureBypass = new DockDefenderTip(BatteryTip.StateType.NEW,
- BatteryUtils.DockDefenderMode.FUTURE_BYPASS);
- mDockDefenderTipActive = new DockDefenderTip(BatteryTip.StateType.NEW,
- BatteryUtils.DockDefenderMode.ACTIVE);
- mDockDefenderTipTemporarilyBypassed = new DockDefenderTip(BatteryTip.StateType.NEW,
- BatteryUtils.DockDefenderMode.TEMPORARILY_BYPASSED);
- mDockDefenderTipDisabled = new DockDefenderTip(BatteryTip.StateType.INVISIBLE,
- BatteryUtils.DockDefenderMode.DISABLED);
+ mDockDefenderTipFutureBypass =
+ new DockDefenderTip(
+ BatteryTip.StateType.NEW, BatteryUtils.DockDefenderMode.FUTURE_BYPASS);
+ mDockDefenderTipActive =
+ new DockDefenderTip(BatteryTip.StateType.NEW, BatteryUtils.DockDefenderMode.ACTIVE);
+ mDockDefenderTipTemporarilyBypassed =
+ new DockDefenderTip(
+ BatteryTip.StateType.NEW,
+ BatteryUtils.DockDefenderMode.TEMPORARILY_BYPASSED);
+ mDockDefenderTipDisabled =
+ new DockDefenderTip(
+ BatteryTip.StateType.INVISIBLE, BatteryUtils.DockDefenderMode.DISABLED);
doReturn(mContext).when(mPreference).getContext();
doReturn(mContext).when(mCardPreference).getContext();
@@ -82,69 +84,78 @@
@Test
public void testGetTitle() {
- assertThat(mDockDefenderTipFutureBypass.getTitle(mContext).toString()).isEqualTo(
- mContext.getString(R.string.battery_tip_dock_defender_future_bypass_title));
- assertThat(mDockDefenderTipActive.getTitle(mContext).toString()).isEqualTo(
- mContext.getString(R.string.battery_tip_dock_defender_active_title));
- assertThat(mDockDefenderTipTemporarilyBypassed.getTitle(mContext).toString()).isEqualTo(
- mContext.getString(R.string.battery_tip_dock_defender_temporarily_bypassed_title));
+ assertThat(mDockDefenderTipFutureBypass.getTitle(mContext).toString())
+ .isEqualTo(
+ mContext.getString(R.string.battery_tip_dock_defender_future_bypass_title));
+ assertThat(mDockDefenderTipActive.getTitle(mContext).toString())
+ .isEqualTo(mContext.getString(R.string.battery_tip_dock_defender_active_title));
+ assertThat(mDockDefenderTipTemporarilyBypassed.getTitle(mContext).toString())
+ .isEqualTo(
+ mContext.getString(
+ R.string.battery_tip_dock_defender_temporarily_bypassed_title));
assertThat(mDockDefenderTipDisabled.getTitle(mContext)).isNull();
}
@Test
public void testGetSummary() {
- assertThat(mDockDefenderTipFutureBypass.getSummary(mContext).toString()).isEqualTo(
- mContext.getString(R.string.battery_tip_dock_defender_future_bypass_summary));
- assertThat(mDockDefenderTipActive.getSummary(mContext).toString()).isEqualTo(
- mContext.getString(R.string.battery_tip_dock_defender_active_summary));
- assertThat(mDockDefenderTipTemporarilyBypassed.getSummary(mContext).toString()).isEqualTo(
- mContext.getString(
- R.string.battery_tip_dock_defender_temporarily_bypassed_summary));
+ assertThat(mDockDefenderTipFutureBypass.getSummary(mContext).toString())
+ .isEqualTo(
+ mContext.getString(
+ R.string.battery_tip_dock_defender_future_bypass_summary));
+ assertThat(mDockDefenderTipActive.getSummary(mContext).toString())
+ .isEqualTo(mContext.getString(R.string.battery_tip_dock_defender_active_summary));
+ assertThat(mDockDefenderTipTemporarilyBypassed.getSummary(mContext).toString())
+ .isEqualTo(
+ mContext.getString(
+ R.string.battery_tip_dock_defender_temporarily_bypassed_summary));
assertThat(mDockDefenderTipDisabled.getSummary(mContext)).isNull();
}
@Test
public void testGetIconId_dockDefenderActive_getProtectedIcon() {
- assertThat(mDockDefenderTipActive.getIconId()).isEqualTo(
- R.drawable.ic_battery_status_protected_24dp);
+ assertThat(mDockDefenderTipActive.getIconId())
+ .isEqualTo(R.drawable.ic_battery_status_protected_24dp);
}
@Test
public void testGetIconId_dockDefenderNotActive_getUntriggeredIcon() {
- assertThat(mDockDefenderTipFutureBypass.getIconId()).isEqualTo(
- R.drawable.ic_battery_dock_defender_untriggered_24dp);
- assertThat(mDockDefenderTipTemporarilyBypassed.getIconId()).isEqualTo(
- R.drawable.ic_battery_dock_defender_untriggered_24dp);
- assertThat(mDockDefenderTipDisabled.getIconId()).isEqualTo(
- R.drawable.ic_battery_dock_defender_untriggered_24dp);
+ assertThat(mDockDefenderTipFutureBypass.getIconId())
+ .isEqualTo(R.drawable.ic_battery_dock_defender_untriggered_24dp);
+ assertThat(mDockDefenderTipTemporarilyBypassed.getIconId())
+ .isEqualTo(R.drawable.ic_battery_dock_defender_untriggered_24dp);
+ assertThat(mDockDefenderTipDisabled.getIconId())
+ .isEqualTo(R.drawable.ic_battery_dock_defender_untriggered_24dp);
}
@Test
public void testUpdateState() {
mDockDefenderTipTemporarilyBypassed.updateState(mDockDefenderTipDisabled);
- assertThat(mDockDefenderTipTemporarilyBypassed.getState()).isEqualTo(
- BatteryTip.StateType.INVISIBLE);
- assertThat(mDockDefenderTipTemporarilyBypassed.getMode()).isEqualTo(
- BatteryUtils.DockDefenderMode.DISABLED);
+ assertThat(mDockDefenderTipTemporarilyBypassed.getState())
+ .isEqualTo(BatteryTip.StateType.INVISIBLE);
+ assertThat(mDockDefenderTipTemporarilyBypassed.getMode())
+ .isEqualTo(BatteryUtils.DockDefenderMode.DISABLED);
}
@Test
public void testLog() {
mDockDefenderTipActive.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.ACTION_DOCK_DEFENDER_TIP,
- mDockDefenderTipActive.getState());
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_DOCK_DEFENDER_TIP,
+ mDockDefenderTipActive.getState());
}
-
@Test
public void testUpdatePreference_dockDefenderTipFutureBypass() {
mDockDefenderTipFutureBypass.updatePreference(mCardPreference);
verify(mCardPreference).setPrimaryButtonVisible(true);
- verify(mCardPreference).setPrimaryButtonText(
- mContext.getString(R.string.battery_tip_charge_to_full_button));
+ verify(mCardPreference)
+ .setPrimaryButtonText(
+ mContext.getString(R.string.battery_tip_charge_to_full_button));
verifySecondaryButton();
}
@@ -153,8 +164,9 @@
mDockDefenderTipActive.updatePreference(mCardPreference);
verify(mCardPreference).setPrimaryButtonVisible(true);
- verify(mCardPreference).setPrimaryButtonText(
- mContext.getString(R.string.battery_tip_charge_to_full_button));
+ verify(mCardPreference)
+ .setPrimaryButtonText(
+ mContext.getString(R.string.battery_tip_charge_to_full_button));
verifySecondaryButton();
}
@@ -170,8 +182,10 @@
private void verifySecondaryButton() {
verify(mCardPreference).setSecondaryButtonText(mContext.getString(R.string.learn_more));
verify(mCardPreference).setSecondaryButtonVisible(true);
- verify(mCardPreference).setSecondaryButtonContentDescription(mContext.getString(
- R.string.battery_tip_limited_temporarily_sec_button_content_description));
+ final String expectedContent =
+ mContext.getString(
+ R.string.battery_tip_limited_temporarily_sec_button_content_description);
+ verify(mCardPreference).setSecondaryButtonContentDescription(expectedContent);
}
@Test
@@ -182,9 +196,11 @@
}
private String getLastErrorLog() {
- return ShadowLog.getLogsForTag(DockDefenderTip.class.getSimpleName()).stream().filter(
- log -> log.type == Log.ERROR).reduce((first, second) -> second).orElse(
- createErrorLog("No Error Log")).msg;
+ return ShadowLog.getLogsForTag(DockDefenderTip.class.getSimpleName()).stream()
+ .filter(log -> log.type == Log.ERROR)
+ .reduce((first, second) -> second)
+ .orElse(createErrorLog("No Error Log"))
+ .msg;
}
private ShadowLog.LogItem createErrorLog(String msg) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTipTest.java
index 71a8062..0484a82 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTipTest.java
@@ -45,8 +45,7 @@
private static final long SCREEN_TIME = 30 * DateUtils.MINUTE_IN_MILLIS;
private static final long LAST_FULL_CHARGE_TIME = 20 * DateUtils.MINUTE_IN_MILLIS;
- @Mock
- private MetricsFeatureProvider mMetricsFeatureProvider;
+ @Mock private MetricsFeatureProvider mMetricsFeatureProvider;
private Context mContext;
private HighUsageTip mBatteryTip;
private List<AppInfo> mUsageAppList;
@@ -57,10 +56,11 @@
mContext = RuntimeEnvironment.application;
mUsageAppList = new ArrayList<>();
- mUsageAppList.add(new AppInfo.Builder()
- .setPackageName(PACKAGE_NAME)
- .setScreenOnTimeMs(SCREEN_TIME)
- .build());
+ mUsageAppList.add(
+ new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME)
+ .setScreenOnTimeMs(SCREEN_TIME)
+ .build());
mBatteryTip = new HighUsageTip(LAST_FULL_CHARGE_TIME, mUsageAppList);
}
@@ -86,19 +86,25 @@
@Test
public void toString_containsAppData() {
- assertThat(mBatteryTip.toString()).isEqualTo(
- "type=2 state=0 { packageName=com.android.app,anomalyTypes={},screenTime=1800000 "
- + "}");
+ assertThat(mBatteryTip.toString())
+ .isEqualTo(
+ "type=2 state=0 {"
+ + " packageName=com.android.app,anomalyTypes={},screenTime=1800000 }");
}
@Test
public void testLog_logAppInfo() {
mBatteryTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_HIGH_USAGE_TIP, BatteryTip.StateType.NEW);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_HIGH_USAGE_TIP,
+ BatteryTip.StateType.NEW);
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_HIGH_USAGE_TIP_LIST,
- PACKAGE_NAME);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_HIGH_USAGE_TIP_LIST,
+ PACKAGE_NAME);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
index 9f6e4e3..1d7ab66 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
@@ -17,16 +17,11 @@
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.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.content.Intent;
import android.util.Log;
import androidx.preference.Preference;
@@ -72,20 +67,19 @@
@Test
public void getTitle_showTitle() {
- assertThat(mIncompatibleChargerTip.getTitle(mContext)).isEqualTo(
- mContext.getString(R.string.battery_tip_incompatible_charging_title));
+ assertThat(mIncompatibleChargerTip.getTitle(mContext))
+ .isEqualTo(mContext.getString(R.string.battery_tip_incompatible_charging_title));
}
@Test
public void getSummary_showSummary() {
- assertThat(mIncompatibleChargerTip.getSummary(mContext)).isEqualTo(
- mContext.getString(R.string.battery_tip_incompatible_charging_message));
+ assertThat(mIncompatibleChargerTip.getSummary(mContext))
+ .isEqualTo(mContext.getString(R.string.battery_tip_incompatible_charging_message));
}
@Test
public void getIcon_showIcon() {
- assertThat(mIncompatibleChargerTip.getIconId())
- .isEqualTo(R.drawable.ic_battery_charger);
+ assertThat(mIncompatibleChargerTip.getIconId()).isEqualTo(R.drawable.ic_battery_charger);
}
@Test
@@ -93,8 +87,11 @@
mIncompatibleChargerTip.updateState(mBatteryTip);
mIncompatibleChargerTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP, mBatteryTip.mState);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP,
+ mBatteryTip.mState);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTipTest.java
index 3f42231..69edef7 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/LowBatteryTipTest.java
@@ -37,8 +37,7 @@
@RunWith(RobolectricTestRunner.class)
public class LowBatteryTipTest {
- @Mock
- private MetricsFeatureProvider mMetricsFeatureProvider;
+ @Mock private MetricsFeatureProvider mMetricsFeatureProvider;
private Context mContext;
private LowBatteryTip mLowBatteryTip;
@@ -58,25 +57,25 @@
final LowBatteryTip parcelTip = new LowBatteryTip(parcel);
assertThat(parcelTip.isPowerSaveModeOn()).isFalse();
- assertThat(parcelTip.getSummary(mContext)).isEqualTo(
- mContext.getString(R.string.battery_tip_low_battery_summary));
+ assertThat(parcelTip.getSummary(mContext))
+ .isEqualTo(mContext.getString(R.string.battery_tip_low_battery_summary));
}
@Test
public void updateState_stateNew_showExpectedInformation() {
mLowBatteryTip.mState = BatteryTip.StateType.NEW;
- assertThat(mLowBatteryTip.getTitle(mContext)).isEqualTo(
- mContext.getString(R.string.battery_tip_low_battery_title));
- assertThat(mLowBatteryTip.getSummary(mContext)).isEqualTo(
- mContext.getString(R.string.battery_tip_low_battery_summary));
+ assertThat(mLowBatteryTip.getTitle(mContext))
+ .isEqualTo(mContext.getString(R.string.battery_tip_low_battery_title));
+ assertThat(mLowBatteryTip.getSummary(mContext))
+ .isEqualTo(mContext.getString(R.string.battery_tip_low_battery_summary));
assertThat(mLowBatteryTip.getIconId()).isEqualTo(R.drawable.ic_battery_saver_accent_24dp);
}
@Test
public void updateState_powerSaveModeOn_notShowTipItem() {
- final LowBatteryTip tip = new LowBatteryTip(
- BatteryTip.StateType.NEW, true /* powerSaveModeOn */);
+ final LowBatteryTip tip =
+ new LowBatteryTip(BatteryTip.StateType.NEW, true /* powerSaveModeOn */);
tip.updateState(tip);
@@ -87,7 +86,10 @@
public void log_lowBatteryActionWithCorrectState() {
mLowBatteryTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_LOW_BATTERY_TIP, BatteryTip.StateType.NEW);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_LOW_BATTERY_TIP,
+ BatteryTip.StateType.NEW);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
index bb70077..c4bc3bc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
@@ -65,12 +65,9 @@
private List<AppInfo> mUsageAppList;
private AppInfo mAppInfo;
private AppInfo mUninstallAppInfo;
- @Mock
- private ApplicationInfo mApplicationInfo;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private MetricsFeatureProvider mMetricsFeatureProvider;
+ @Mock private ApplicationInfo mApplicationInfo;
+ @Mock private PackageManager mPackageManager;
+ @Mock private MetricsFeatureProvider mMetricsFeatureProvider;
@Before
public void setUp() throws Exception {
@@ -79,28 +76,35 @@
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mPackageManager).when(mContext).getPackageManager();
- doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
- PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER);
- doThrow(new PackageManager.NameNotFoundException()).when(mPackageManager)
- .getApplicationInfo(UNINSTALL_PACKAGE_NAME,
+ doReturn(mApplicationInfo)
+ .when(mPackageManager)
+ .getApplicationInfo(
+ PACKAGE_NAME,
+ PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER);
+ doThrow(new PackageManager.NameNotFoundException())
+ .when(mPackageManager)
+ .getApplicationInfo(
+ UNINSTALL_PACKAGE_NAME,
PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER);
doReturn(DISPLAY_NAME).when(mApplicationInfo).loadLabel(mPackageManager);
- mAppInfo = new AppInfo.Builder()
- .setPackageName(PACKAGE_NAME)
- .addAnomalyType(ANOMALY_WAKEUP)
- .addAnomalyType(ANOMALY_WAKELOCK)
- .build();
- mUninstallAppInfo = new AppInfo.Builder()
- .setPackageName(UNINSTALL_PACKAGE_NAME)
- .addAnomalyType(ANOMALY_WAKEUP)
- .build();
+ mAppInfo =
+ new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME)
+ .addAnomalyType(ANOMALY_WAKEUP)
+ .addAnomalyType(ANOMALY_WAKELOCK)
+ .build();
+ mUninstallAppInfo =
+ new AppInfo.Builder()
+ .setPackageName(UNINSTALL_PACKAGE_NAME)
+ .addAnomalyType(ANOMALY_WAKEUP)
+ .build();
mUsageAppList = new ArrayList<>();
mUsageAppList.add(mAppInfo);
mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList);
mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
- mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE,
- new ArrayList<>());
+ mInvisibleBatteryTip =
+ new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
}
@After
@@ -149,8 +153,9 @@
@Test
public void getSummary_oneAppHandled_showHandledSummary() {
assertThat(mHandledBatteryTip.getSummary(mContext).toString())
- .isEqualTo(StringUtil.getIcuPluralsString(mContext, 1,
- R.string.battery_tip_restrict_handled_summary));
+ .isEqualTo(
+ StringUtil.getIcuPluralsString(
+ mContext, 1, R.string.battery_tip_restrict_handled_summary));
}
@Test
@@ -158,8 +163,9 @@
mUsageAppList.add(new AppInfo.Builder().build());
mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
assertThat(mHandledBatteryTip.getSummary(mContext))
- .isEqualTo(StringUtil.getIcuPluralsString(mContext, 2,
- R.string.battery_tip_restrict_handled_summary));
+ .isEqualTo(
+ StringUtil.getIcuPluralsString(
+ mContext, 2, R.string.battery_tip_restrict_handled_summary));
}
@Test
@@ -217,35 +223,47 @@
@Test
public void toString_containsAppData() {
- assertThat(mNewBatteryTip.toString()).isEqualTo(
- "type=1 state=0 { packageName=com.android.app,anomalyTypes={0, 1},screenTime=0 }");
+ assertThat(mNewBatteryTip.toString())
+ .isEqualTo(
+ "type=1 state=0 { packageName=com.android.app,anomalyTypes={0,"
+ + " 1},screenTime=0 }");
}
@Test
public void testLog_stateNew_logAppInfo() {
mNewBatteryTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW);
- verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
- SettingsEnums.PAGE_UNKNOWN,
- PACKAGE_NAME,
- ANOMALY_WAKEUP);
- verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
- MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
- SettingsEnums.PAGE_UNKNOWN,
- PACKAGE_NAME,
- ANOMALY_WAKELOCK);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP,
+ BatteryTip.StateType.NEW);
+ verify(mMetricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
+ SettingsEnums.PAGE_UNKNOWN,
+ PACKAGE_NAME,
+ ANOMALY_WAKEUP);
+ verify(mMetricsFeatureProvider)
+ .action(
+ SettingsEnums.PAGE_UNKNOWN,
+ MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
+ SettingsEnums.PAGE_UNKNOWN,
+ PACKAGE_NAME,
+ ANOMALY_WAKELOCK);
}
@Test
public void testLog_stateHandled_doNotLogAppInfo() {
mHandledBatteryTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED);
- verify(mMetricsFeatureProvider, never()).action(
- anyInt(), anyInt(), anyInt(), anyString(), anyInt());
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP,
+ BatteryTip.StateType.HANDLED);
+ verify(mMetricsFeatureProvider, never())
+ .action(anyInt(), anyInt(), anyInt(), anyString(), anyInt());
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTipTest.java
index 7da6a4f..36cb319 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SmartBatteryTipTest.java
@@ -33,8 +33,7 @@
@RunWith(RobolectricTestRunner.class)
public class SmartBatteryTipTest {
- @Mock
- private MetricsFeatureProvider mMetricsFeatureProvider;
+ @Mock private MetricsFeatureProvider mMetricsFeatureProvider;
private Context mContext;
private SmartBatteryTip mSmartBatteryTip;
@@ -50,7 +49,10 @@
public void testLog() {
mSmartBatteryTip.log(mContext, mMetricsFeatureProvider);
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_SMART_BATTERY_TIP, BatteryTip.StateType.NEW);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ MetricsProto.MetricsEvent.ACTION_SMART_BATTERY_TIP,
+ BatteryTip.StateType.NEW);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapperTest.java
index 60e0af0..0d4d671 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapperTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapperTest.java
@@ -45,19 +45,18 @@
@Test
public void getDismissRecordKey_returnExpectedResult() {
- mAnomalyEventWrapper = new AnomalyEventWrapper(mContext,
- BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent());
- assertThat(mAnomalyEventWrapper.getDismissRecordKey())
- .isEqualTo("KEY_BRIGHTNESS");
+ mAnomalyEventWrapper =
+ new AnomalyEventWrapper(
+ mContext, BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent());
+ assertThat(mAnomalyEventWrapper.getDismissRecordKey()).isEqualTo("KEY_BRIGHTNESS");
- mAnomalyEventWrapper = new AnomalyEventWrapper(mContext,
- BatteryTestUtils.createScreenTimeoutAnomalyEvent());
- assertThat(mAnomalyEventWrapper.getDismissRecordKey())
- .isEqualTo("KEY_SCREEN_TIMEOUT");
+ mAnomalyEventWrapper =
+ new AnomalyEventWrapper(
+ mContext, BatteryTestUtils.createScreenTimeoutAnomalyEvent());
+ assertThat(mAnomalyEventWrapper.getDismissRecordKey()).isEqualTo("KEY_SCREEN_TIMEOUT");
- mAnomalyEventWrapper = new AnomalyEventWrapper(mContext,
- BatteryTestUtils.createAppAnomalyEvent());
- assertThat(mAnomalyEventWrapper.getDismissRecordKey())
- .isEqualTo("KEY_APP_1");
+ mAnomalyEventWrapper =
+ new AnomalyEventWrapper(mContext, BatteryTestUtils.createAppAnomalyEvent());
+ assertThat(mAnomalyEventWrapper.getDismissRecordKey()).isEqualTo("KEY_APP_1");
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
index 275ab34..bbb022e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -66,22 +66,14 @@
@RunWith(RobolectricTestRunner.class)
public final class BatteryChartPreferenceControllerTest {
- @Mock
- private Intent mIntent;
- @Mock
- private UserManager mUserManager;
- @Mock
- private SettingsActivity mSettingsActivity;
- @Mock
- private TextView mChartSummaryTextView;
- @Mock
- private BatteryChartView mDailyChartView;
- @Mock
- private BatteryChartView mHourlyChartView;
- @Mock
- private ViewPropertyAnimator mViewPropertyAnimator;
- @Mock
- private LinearLayout.LayoutParams mLayoutParams;
+ @Mock private Intent mIntent;
+ @Mock private UserManager mUserManager;
+ @Mock private SettingsActivity mSettingsActivity;
+ @Mock private TextView mChartSummaryTextView;
+ @Mock private BatteryChartView mDailyChartView;
+ @Mock private BatteryChartView mHourlyChartView;
+ @Mock private ViewPropertyAnimator mViewPropertyAnimator;
+ @Mock private LinearLayout.LayoutParams mLayoutParams;
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
@@ -97,11 +89,9 @@
mFeatureFactory = FakeFeatureFactory.setupForTest();
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();
- doReturn(mUserManager)
- .when(mContext)
- .getSystemService(UserManager.class);
+ doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(true).when(mUserManager).isUserUnlocked(anyInt());
- doReturn(new int[]{0}).when(mUserManager).getProfileIdsWithDisabled(anyInt());
+ doReturn(new int[] {0}).when(mUserManager).getProfileIdsWithDisabled(anyInt());
final Resources resources = spy(mContext.getResources());
resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
doReturn(resources).when(mContext).getResources();
@@ -122,7 +112,7 @@
// Adds fake testing data.
BatteryDiffEntry.sResourceCache.put(
"fakeBatteryDiffEntryKey",
- new BatteryEntry.NameAndIcon("fakeName", /*icon=*/ null, /*iconId=*/ 1));
+ new BatteryEntry.NameAndIcon("fakeName", /* icon= */ null, /* iconId= */ 1));
}
@Test
@@ -156,15 +146,18 @@
verify(mDailyChartView, atLeastOnce()).setVisibility(View.GONE);
// Ignore fast refresh ui from the data processor callback.
verify(mHourlyChartView, atLeast(0)).setViewModel(null);
- verify(mHourlyChartView, atLeastOnce()).setViewModel(new BatteryChartViewModel(
- List.of(100, 99, 97, 95, 66),
- List.of(1619247660000L /* 7:01 AM */,
- 1619251200000L /* 8 AM */,
- 1619258400000L /* 10 AM */,
- 1619265600000L /* 12 PM */,
- 1619265720000L /* now (12:02 PM) */),
- BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
- mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
+ verify(mHourlyChartView, atLeastOnce())
+ .setViewModel(
+ new BatteryChartViewModel(
+ List.of(100, 99, 97, 95, 66),
+ List.of(
+ 1619247660000L /* 7:01 AM */,
+ 1619251200000L /* 8 AM */,
+ 1619258400000L /* 10 AM */,
+ 1619265600000L /* 12 PM */,
+ 1619265720000L /* now (12:02 PM) */),
+ BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
+ mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
}
@Test
@@ -173,15 +166,17 @@
reset(mHourlyChartView);
setupHourlyChartViewAnimationMock();
- BatteryChartViewModel expectedDailyViewModel = new BatteryChartViewModel(
- List.of(100, 83, 59, 66),
- // "Sat", "Sun", "Mon", "Mon"
- List.of(1619247660000L /* Sat */,
- 1619308800000L /* Sun */,
- 1619395200000L /* Mon */,
- 1619460120000L /* Mon */),
- BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
- mBatteryChartPreferenceController.mDailyChartLabelTextGenerator);
+ BatteryChartViewModel expectedDailyViewModel =
+ new BatteryChartViewModel(
+ List.of(100, 83, 59, 66),
+ // "Sat", "Sun", "Mon", "Mon"
+ List.of(
+ 1619247660000L /* Sat */,
+ 1619308800000L /* Sun */,
+ 1619395200000L /* Mon */,
+ 1619460120000L /* Mon */),
+ BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
+ mBatteryChartPreferenceController.mDailyChartLabelTextGenerator);
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(60));
@@ -202,20 +197,23 @@
expectedDailyViewModel.setSelectedIndex(0);
verify(mDailyChartView).setViewModel(expectedDailyViewModel);
- verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
- List.of(100, 99, 97, 95, 93, 91, 89, 87, 85, 83),
- List.of(1619247660000L /* 7:01 AM */,
- 1619251200000L /* 8 AM */,
- 1619258400000L /* 10 AM */,
- 1619265600000L /* 12 PM */,
- 1619272800000L /* 2 PM */,
- 1619280000000L /* 4 PM */,
- 1619287200000L /* 6 PM */,
- 1619294400000L /* 8 PM */,
- 1619301600000L /* 10 PM */,
- 1619308800000L /* 12 AM */),
- BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
- mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
+ verify(mHourlyChartView)
+ .setViewModel(
+ new BatteryChartViewModel(
+ List.of(100, 99, 97, 95, 93, 91, 89, 87, 85, 83),
+ List.of(
+ 1619247660000L /* 7:01 AM */,
+ 1619251200000L /* 8 AM */,
+ 1619258400000L /* 10 AM */,
+ 1619265600000L /* 12 PM */,
+ 1619272800000L /* 2 PM */,
+ 1619280000000L /* 4 PM */,
+ 1619287200000L /* 6 PM */,
+ 1619294400000L /* 8 PM */,
+ 1619301600000L /* 10 PM */,
+ 1619308800000L /* 12 AM */),
+ BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
+ mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
reset(mDailyChartView);
reset(mHourlyChartView);
@@ -228,23 +226,25 @@
verify(mViewPropertyAnimator, atLeastOnce()).alpha(1f);
expectedDailyViewModel.setSelectedIndex(1);
verify(mDailyChartView).setViewModel(expectedDailyViewModel);
- BatteryChartViewModel expectedHourlyViewModel = new BatteryChartViewModel(
- List.of(83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59),
- List.of(1619308800000L /* 12 AM */,
- 1619316000000L /* 2 AM */,
- 1619323200000L /* 4 AM */,
- 1619330400000L /* 6 AM */,
- 1619337600000L /* 8 AM */,
- 1619344800000L /* 10 AM */,
- 1619352000000L /* 12 PM */,
- 1619359200000L /* 2 PM */,
- 1619366400000L /* 4 PM */,
- 1619373600000L /* 6 PM */,
- 1619380800000L /* 8 PM */,
- 1619388000000L /* 10 PM */,
- 1619395200000L /* 12 AM */),
- BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
- mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator);
+ BatteryChartViewModel expectedHourlyViewModel =
+ new BatteryChartViewModel(
+ List.of(83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59),
+ List.of(
+ 1619308800000L /* 12 AM */,
+ 1619316000000L /* 2 AM */,
+ 1619323200000L /* 4 AM */,
+ 1619330400000L /* 6 AM */,
+ 1619337600000L /* 8 AM */,
+ 1619344800000L /* 10 AM */,
+ 1619352000000L /* 12 PM */,
+ 1619359200000L /* 2 PM */,
+ 1619366400000L /* 4 PM */,
+ 1619373600000L /* 6 PM */,
+ 1619380800000L /* 8 PM */,
+ 1619388000000L /* 10 PM */,
+ 1619395200000L /* 12 AM */),
+ BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
+ mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator);
expectedHourlyViewModel.setSelectedIndex(6);
verify(mHourlyChartView).setViewModel(expectedHourlyViewModel);
@@ -259,22 +259,24 @@
verify(mViewPropertyAnimator, atLeastOnce()).alpha(1f);
expectedDailyViewModel.setSelectedIndex(2);
verify(mDailyChartView).setViewModel(expectedDailyViewModel);
- verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
- List.of(59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 66),
- List.of(1619395200000L /* 12 AM */,
- 1619402400000L /* 2 AM */,
- 1619409600000L /* 4 AM */,
- 1619416800000L /* 6 AM */,
- 1619424000000L /* 8 AM */,
- 1619431200000L /* 10 AM */,
- 1619438400000L /* 12 PM */,
- 1619445600000L /* 2 PM */,
- 1619452800000L /* 4 PM */,
- 1619460000000L /* 6 PM */,
- 1619460120000L /* now (6:02 PM) */),
- BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
- mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
-
+ verify(mHourlyChartView)
+ .setViewModel(
+ new BatteryChartViewModel(
+ List.of(59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 66),
+ List.of(
+ 1619395200000L /* 12 AM */,
+ 1619402400000L /* 2 AM */,
+ 1619409600000L /* 4 AM */,
+ 1619416800000L /* 6 AM */,
+ 1619424000000L /* 8 AM */,
+ 1619431200000L /* 10 AM */,
+ 1619438400000L /* 12 PM */,
+ 1619445600000L /* 2 PM */,
+ 1619452800000L /* 4 PM */,
+ 1619460000000L /* 6 PM */,
+ 1619460120000L /* now (6:02 PM) */),
+ BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
+ mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
}
@Test
@@ -408,8 +410,8 @@
mBatteryChartPreferenceController.mDailyChartIndex = 0;
mBatteryChartPreferenceController.mHourlyChartIndex = 2;
- assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
- "10 AM - 12 PM");
+ assertThat(mBatteryChartPreferenceController.getSlotInformation())
+ .isEqualTo("10 AM - 12 PM");
}
@Test
@@ -418,8 +420,8 @@
mBatteryChartPreferenceController.mDailyChartIndex = 1;
mBatteryChartPreferenceController.mHourlyChartIndex = 8;
- assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
- "Sunday 4 PM - 6 PM");
+ assertThat(mBatteryChartPreferenceController.getSlotInformation())
+ .isEqualTo("Sunday 4 PM - 6 PM");
}
@Test
@@ -428,8 +430,8 @@
mBatteryChartPreferenceController.mDailyChartIndex = 0;
mBatteryChartPreferenceController.mHourlyChartIndex = 0;
- assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
- "7:01 AM - 8 AM");
+ assertThat(mBatteryChartPreferenceController.getSlotInformation())
+ .isEqualTo("7:01 AM - 8 AM");
}
@Test
@@ -438,8 +440,7 @@
mBatteryChartPreferenceController.mDailyChartIndex = 0;
mBatteryChartPreferenceController.mHourlyChartIndex = 3;
- assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
- "12 PM - now");
+ assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("12 PM - now");
}
@Test
@@ -448,8 +449,8 @@
mBatteryChartPreferenceController.mDailyChartIndex = 0;
mBatteryChartPreferenceController.mHourlyChartIndex = 0;
- assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
- "7:01 AM - now");
+ assertThat(mBatteryChartPreferenceController.getSlotInformation())
+ .isEqualTo("7:01 AM - now");
}
@Test
@@ -508,7 +509,7 @@
private BatteryChartPreferenceController createController() {
final BatteryChartPreferenceController controller =
new BatteryChartPreferenceController(
- mContext, /*lifecycle=*/ null, mSettingsActivity);
+ mContext, /* lifecycle= */ null, mSettingsActivity);
controller.mPrefContext = mContext;
return controller;
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewTest.java
index 5213199..4263bad 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewTest.java
@@ -45,8 +45,7 @@
private FakeFeatureFactory mFeatureFactory;
private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
- @Mock
- private View mMockView;
+ @Mock private View mMockView;
@Before
public void setUp() {
@@ -54,17 +53,19 @@
mFeatureFactory = FakeFeatureFactory.setupForTest();
mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
mContext = spy(RuntimeEnvironment.application);
- mContext.getResources().getConfiguration().setLocales(
- new LocaleList(new Locale("en_US")));
+ mContext.getResources().getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
mBatteryChartView = new BatteryChartView(mContext);
}
@Test
public void onClick_invokesCallback() {
final int originalSelectedIndex = 2;
- BatteryChartViewModel batteryChartViewModel = new BatteryChartViewModel(
- List.of(90, 80, 70, 60), List.of(0L, 0L, 0L, 0L),
- BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS, null);
+ BatteryChartViewModel batteryChartViewModel =
+ new BatteryChartViewModel(
+ List.of(90, 80, 70, 60),
+ List.of(0L, 0L, 0L, 0L),
+ BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
+ null);
batteryChartViewModel.setSelectedIndex(originalSelectedIndex);
mBatteryChartView.setViewModel(batteryChartViewModel);
for (int i = 0; i < mBatteryChartView.mTrapezoidSlots.length; i++) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java
index 04d601f..ffe3c44 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java
@@ -149,16 +149,12 @@
createBatteryDiffEntry(mContext, /* consumePower= */ 28.5, /* key= */ "APP_1"));
batteryDiffEntries.add(
createBatteryDiffEntry(
- mContext,
- /* consumePower= */ 20,
- BatteryDiffEntry.UNINSTALLED_APPS_KEY));
+ mContext, /* consumePower= */ 20, BatteryDiffEntry.UNINSTALLED_APPS_KEY));
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /* consumePower= */ 3, /* key= */ "APP_2"));
batteryDiffEntries.add(
createBatteryDiffEntry(
- mContext,
- /* consumePower= */ 28.5,
- BatteryDiffEntry.SYSTEM_APPS_KEY));
+ mContext, /* consumePower= */ 28.5, BatteryDiffEntry.SYSTEM_APPS_KEY));
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /* consumePower= */ 20, /* key= */ "APP_3"));
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
index ae726b7..d8b733c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
@@ -64,7 +64,6 @@
private static final String UNINSTALLED_PACKAGE_NAME = "com.android.testing.uninstalled";
private static final String UID_ZERO_PACKAGE_NAME = "com.android.testing.uid.zero";
-
private Context mContext;
@Mock private ApplicationInfo mMockAppInfo;
@@ -82,6 +81,7 @@
MockitoAnnotations.initMocks(this);
ShadowUserHandle.reset();
mContext = spy(RuntimeEnvironment.application);
+ BatteryUtils.getInstance(mContext).reset();
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mMockUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(mMockPackageManager).when(mContext).getPackageManager();
@@ -351,16 +351,18 @@
}
@Test
- public void testClearCache_clearDataForResourcesAndFlags() {
+ public void testClearCache_clearDataForAllCaches() {
BatteryDiffEntry.sResourceCache.put(
"fake application key",
new BatteryEntry.NameAndIcon("app label", null, /* iconId= */ 0));
BatteryDiffEntry.sValidForRestriction.put("fake application key", Boolean.valueOf(false));
+ BatteryDiffEntry.sPackageNameAndUidCache.put(PACKAGE_NAME, UID);
BatteryDiffEntry.clearCache();
assertThat(BatteryDiffEntry.sResourceCache).isEmpty();
assertThat(BatteryDiffEntry.sValidForRestriction).isEmpty();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache).isEmpty();
}
@Test
@@ -444,7 +446,10 @@
final BatteryDiffEntry entry = createBatteryDiffEntry(10, new BatteryHistEntry(values));
assertThat(entry.isSystemEntry()).isFalse();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.containsKey(PACKAGE_NAME)).isFalse();
assertThat(entry.isUninstalledEntry()).isFalse();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.containsKey(PACKAGE_NAME)).isTrue();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.get(PACKAGE_NAME)).isEqualTo(UID);
}
@Test
@@ -456,14 +461,13 @@
final BatteryDiffEntry entry = createBatteryDiffEntry(10, new BatteryHistEntry(values));
assertThat(entry.isSystemEntry()).isFalse();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.containsKey(PACKAGE_NAME)).isFalse();
assertThat(entry.isUninstalledEntry()).isFalse();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.containsKey(PACKAGE_NAME)).isFalse();
}
@Test
public void testIsUninstalledEntry_uninstalledApp_returnTrue() throws Exception {
- doReturn(BatteryUtils.UID_NULL)
- .when(mMockPackageManager)
- .getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA);
final ContentValues values =
getContentValuesWithType(ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
values.put(BatteryHistEntry.KEY_UID, UNINSTALLED_UID);
@@ -471,7 +475,11 @@
final BatteryDiffEntry entry = createBatteryDiffEntry(10, new BatteryHistEntry(values));
assertThat(entry.isSystemEntry()).isFalse();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.containsKey(UNINSTALLED_PACKAGE_NAME))
+ .isFalse();
assertThat(entry.isUninstalledEntry()).isTrue();
+ assertThat(BatteryDiffEntry.sPackageNameAndUidCache.get(UNINSTALLED_PACKAGE_NAME))
+ .isEqualTo(BatteryUtils.UID_NULL);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java
index e9606da..83b4458 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java
@@ -61,18 +61,15 @@
private static final String HIGH_DRAIN_PACKAGE = "com.android.test.screen";
private static final String ANDROID_PACKAGE = "android";
- @Rule
- public MockitoRule mocks = MockitoJUnit.rule();
+ @Rule public MockitoRule mocks = MockitoJUnit.rule();
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mMockContext;
+
private Context mContext;
- @Mock
- private PackageManager mMockPackageManager;
- @Mock
- private UserManager mMockUserManager;
- @Mock
- private UidBatteryConsumer mUidBatteryConsumer;
+ @Mock private PackageManager mMockPackageManager;
+ @Mock private UserManager mMockUserManager;
+ @Mock private UidBatteryConsumer mUidBatteryConsumer;
@Before
public void stubContextToReturnMockPackageManager() {
@@ -83,23 +80,27 @@
@Before
public void stubPackageManagerToReturnAppPackageAndName() throws NameNotFoundException {
when(mMockPackageManager.getApplicationInfo(anyString(), eq(0) /* no flags */))
- .thenAnswer(invocation -> {
- ApplicationInfo info = new ApplicationInfo();
- info.packageName = invocation.getArgument(0);
- return info;
- });
+ .thenAnswer(
+ invocation -> {
+ ApplicationInfo info = new ApplicationInfo();
+ info.packageName = invocation.getArgument(0);
+ return info;
+ });
when(mMockPackageManager.getApplicationLabel(any(ApplicationInfo.class)))
- .thenAnswer(invocation -> LABEL_PREFIX
- + ((ApplicationInfo) invocation.getArgument(0)).packageName);
+ .thenAnswer(
+ invocation ->
+ LABEL_PREFIX
+ + ((ApplicationInfo) invocation.getArgument(0))
+ .packageName);
}
- private BatteryEntry createBatteryEntryForApp(String[] packages, String packageName,
- String highDrainPackage) {
+ private BatteryEntry createBatteryEntryForApp(
+ String[] packages, String packageName, String highDrainPackage) {
UidBatteryConsumer consumer = mock(UidBatteryConsumer.class);
when(consumer.getUid()).thenReturn(APP_UID);
when(consumer.getPackageWithHighestDrain()).thenReturn(highDrainPackage);
- return new BatteryEntry(mMockContext, mMockUserManager,
- consumer, false, APP_UID, packages, packageName);
+ return new BatteryEntry(
+ mMockContext, mMockUserManager, consumer, false, APP_UID, packages, packageName);
}
private BatteryEntry createAggregateBatteryEntry(int powerComponentId) {
@@ -122,14 +123,13 @@
private BatteryEntry createUserBatteryConsumer(int userId) {
UserBatteryConsumer consumer = mock(UserBatteryConsumer.class);
when(consumer.getUserId()).thenReturn(userId);
- return new BatteryEntry(mMockContext, mMockUserManager,
- consumer, false, 0, null, null);
+ return new BatteryEntry(mMockContext, mMockUserManager, consumer, false, 0, null, null);
}
@Test
public void batteryEntryForApp_shouldSetDefaultPackageNameAndLabel() throws Exception {
- BatteryEntry entry = createBatteryEntryForApp(null, APP_DEFAULT_PACKAGE_NAME,
- HIGH_DRAIN_PACKAGE);
+ BatteryEntry entry =
+ createBatteryEntryForApp(null, APP_DEFAULT_PACKAGE_NAME, HIGH_DRAIN_PACKAGE);
assertThat(entry.getDefaultPackageName()).isEqualTo(APP_DEFAULT_PACKAGE_NAME);
assertThat(entry.getLabel()).isEqualTo(LABEL_PREFIX + APP_DEFAULT_PACKAGE_NAME);
@@ -157,20 +157,24 @@
@Test
public void batteryEntryForApp_shouldSetHighestDrainPackage_whenMultiplePackagesFoundForUid() {
- BatteryEntry entry = createBatteryEntryForApp(
- new String[]{APP_DEFAULT_PACKAGE_NAME, "package2", "package3"}, null,
- HIGH_DRAIN_PACKAGE);
+ BatteryEntry entry =
+ createBatteryEntryForApp(
+ new String[] {APP_DEFAULT_PACKAGE_NAME, "package2", "package3"},
+ null,
+ HIGH_DRAIN_PACKAGE);
assertThat(entry.getLabel()).isEqualTo(LABEL_PREFIX + HIGH_DRAIN_PACKAGE);
}
@Test
public void batteryEntryForAOD_containCorrectInfo() {
- final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
- BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
- /* devicePowerMah= */ 200,
- /* usageDurationMs= */ 1000,
- /* isHidden= */ false);
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
+ /* devicePowerMah= */ 200,
+ /* usageDurationMs= */ 1000,
+ /* isHidden= */ false);
assertThat(entry.mIconId).isEqualTo(R.drawable.ic_settings_aod);
assertThat(entry.mName).isEqualTo("Ambient display");
@@ -178,10 +182,12 @@
@Test
public void batteryEntryForCustomComponent_containCorrectInfo() {
- final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
- BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42,
- /* powerComponentName= */ "ABC",
- /* devicePowerMah= */ 200);
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42,
+ /* powerComponentName= */ "ABC",
+ /* devicePowerMah= */ 200);
assertThat(entry.mIconId).isEqualTo(R.drawable.ic_power_system);
assertThat(entry.mName).isEqualTo("ABC");
@@ -192,19 +198,28 @@
when(mUidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND))
.thenReturn(100L);
- final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
- mMockUserManager, mUidBatteryConsumer, false, 0, null, null);
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ mMockUserManager,
+ mUidBatteryConsumer,
+ false,
+ 0,
+ null,
+ null);
assertThat(entry.getTimeInForegroundMs()).isEqualTo(100L);
}
@Test
public void getTimeInForegroundMs_aggregateBatteryConsumer() {
- final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
- BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
- /* devicePowerMah= */ 10,
- /* usageDurationMs= */ 100,
- /* isHidden= */ false);
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
+ /* devicePowerMah= */ 10,
+ /* usageDurationMs= */ 100,
+ /* isHidden= */ false);
assertThat(entry.getTimeInForegroundMs()).isEqualTo(100L);
}
@@ -214,19 +229,28 @@
when(mUidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND))
.thenReturn(100L);
- final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
- mMockUserManager, mUidBatteryConsumer, false, 0, null, null);
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ mMockUserManager,
+ mUidBatteryConsumer,
+ false,
+ 0,
+ null,
+ null);
assertThat(entry.getTimeInBackgroundMs()).isEqualTo(100L);
}
@Test
public void getTimeInBackgroundMs_systemConsumer() {
- final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
- BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
- /* devicePowerMah= */ 100,
- /* usageDurationMs= */ 1000,
- /* isHidden= */ false);
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
+ /* devicePowerMah= */ 100,
+ /* usageDurationMs= */ 1000,
+ /* isHidden= */ false);
assertThat(entry.getTimeInBackgroundMs()).isEqualTo(0);
}
@@ -241,16 +265,17 @@
@Test
public void getKey_AggregateBatteryConsumer_returnComponentId() {
- final BatteryEntry entry = createAggregateBatteryEntry(
- BatteryConsumer.POWER_COMPONENT_BLUETOOTH);
+ final BatteryEntry entry =
+ createAggregateBatteryEntry(BatteryConsumer.POWER_COMPONENT_BLUETOOTH);
final String key = entry.getKey();
assertThat(key).isEqualTo("S|2");
}
@Test
public void getKey_CustomAggregateBatteryConsumer_returnComponentId() {
- final BatteryEntry entry = createCustomAggregateBatteryEntry(
- BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42);
+ final BatteryEntry entry =
+ createCustomAggregateBatteryEntry(
+ BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42);
final String key = entry.getKey();
assertThat(key).isEqualTo("S|1042");
}
@@ -269,19 +294,18 @@
doReturn(mMockUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(null).when(mMockUserManager).getUserInfo(userId);
- final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUserId(
- mContext, userId);
- assertThat(nameAndIcon.mName).isEqualTo(getString(
- R.string.running_process_item_removed_user_label));
+ final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUserId(mContext, userId);
+ assertThat(nameAndIcon.mName)
+ .isEqualTo(getString(R.string.running_process_item_removed_user_label));
assertThat(nameAndIcon.mIcon).isNull();
}
@Test
public void getNameAndIconFromUid_rerturnExpectedName() {
- final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
- mContext, /* name */ null, /* uid */ 0);
- assertThat(nameAndIcon.mName).isEqualTo(
- getString(com.android.settingslib.R.string.process_kernel_label));
+ final NameAndIcon nameAndIcon =
+ BatteryEntry.getNameAndIconFromUid(mContext, /* name */ null, /* uid */ 0);
+ assertThat(nameAndIcon.mName)
+ .isEqualTo(getString(com.android.settingslib.R.string.process_kernel_label));
assertNameAndIcon("mediaserver", R.string.process_mediaserver_label);
assertNameAndIcon("dex2oat32", R.string.process_dex2oat_label);
@@ -291,63 +315,75 @@
@Test
public void getNameAndIconFromUid_tetheringUid_rerturnExpectedName() {
- final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
- mContext, /* name */ null, /* uid */ BatteryUtils.UID_TETHERING);
+ final NameAndIcon nameAndIcon =
+ BatteryEntry.getNameAndIconFromUid(
+ mContext, /* name */ null, /* uid */ BatteryUtils.UID_TETHERING);
assertThat(nameAndIcon.mName).isEqualTo(getString(R.string.process_network_tethering));
}
@Test
public void getNameAndIconFromUid_removedAppsUid_rerturnExpectedName() {
- final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
- mContext, /* name */ null, /* uid */ BatteryUtils.UID_REMOVED_APPS);
+ final NameAndIcon nameAndIcon =
+ BatteryEntry.getNameAndIconFromUid(
+ mContext, /* name */ null, /* uid */ BatteryUtils.UID_REMOVED_APPS);
assertThat(nameAndIcon.mName).isEqualTo(getString(R.string.process_removed_apps));
}
@Test
public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() {
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_SCREEN,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_SCREEN,
R.string.power_screen,
R.drawable.ic_settings_display);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CPU,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_CPU,
R.string.power_cpu,
R.drawable.ic_settings_cpu);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
R.string.power_bluetooth,
R.drawable.ic_settings_bluetooth);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_CAMERA,
R.string.power_camera,
R.drawable.ic_settings_camera);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
R.string.power_flashlight,
R.drawable.ic_settings_flashlight);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
R.string.power_cell,
R.drawable.ic_settings_cellular);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_GNSS,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_GNSS,
R.string.power_gps,
R.drawable.ic_settings_gps);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_WIFI,
R.string.power_wifi,
R.drawable.ic_settings_wireless_no_theme);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_PHONE,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_PHONE,
R.string.power_phone,
R.drawable.ic_settings_voice_calls);
- assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
+ assertNameAndIcon(
+ BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
R.string.ambient_display_screen_title,
R.drawable.ic_settings_aod);
}
private void assertNameAndIcon(String name, int stringId) {
- final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
- mContext, name, /* uid */ 1000);
+ final NameAndIcon nameAndIcon =
+ BatteryEntry.getNameAndIconFromUid(mContext, name, /* uid */ 1000);
assertThat(nameAndIcon.mName).isEqualTo(getString(stringId));
}
private void assertNameAndIcon(int powerComponentId, int stringId, int iconId) {
- final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromPowerComponent(
- mContext, powerComponentId);
+ final NameAndIcon nameAndIcon =
+ BatteryEntry.getNameAndIconFromPowerComponent(mContext, powerComponentId);
assertThat(nameAndIcon.mName).isEqualTo(getString(stringId));
assertThat(nameAndIcon.mIconId).isEqualTo(iconId);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
index 609f2fc..02800f7 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
@@ -41,10 +41,8 @@
@RunWith(RobolectricTestRunner.class)
public final class BatteryHistEntryTest {
- @Mock
- private BatteryEntry mMockBatteryEntry;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryEntry mMockBatteryEntry;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
@Before
public void setUp() {
@@ -75,17 +73,17 @@
ConvertUtils.convertBatteryEntryToContentValues(
mMockBatteryEntry,
mBatteryUsageStats,
- /*batteryLevel=*/ 12,
- /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
- /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
- /*bootTimestamp=*/ 101L,
- /*timestamp=*/ 10001L,
- /*isFullChargeStart=*/ false);
+ /* batteryLevel= */ 12,
+ /* batteryStatus= */ BatteryManager.BATTERY_STATUS_FULL,
+ /* batteryHealth= */ BatteryManager.BATTERY_HEALTH_COLD,
+ /* bootTimestamp= */ 101L,
+ /* timestamp= */ 10001L,
+ /* isFullChargeStart= */ false);
assertBatteryHistEntry(
new BatteryHistEntry(values),
- /*drainType=*/ expectedType,
- /*percentOfTotal=*/ mMockBatteryEntry.mPercent);
+ /* drainType= */ expectedType,
+ /* percentOfTotal= */ mMockBatteryEntry.mPercent);
}
@Test
@@ -98,25 +96,25 @@
public void testConstructor_cursor_returnsExpectedResult() {
assertBatteryHistEntry(
createBatteryHistEntry(
- /*bootTimestamp=*/ 101L,
- /*timestamp=*/ 10001L,
- /*totalPower=*/ 5.1,
- /*consumePower=*/ 1.1,
- /*foregroundUsageConsumePower=*/ 1.2,
- /*foregroundServiceUsageConsumePower=*/ 1.3,
- /*backgroundUsageConsumePower=*/ 1.4,
- /*cachedUsageConsumePower=*/ 1.5,
- /*foregroundUsageTimeInMs=*/ 1234L,
- /*backgroundUsageTimeInMs=*/ 5689L,
- /*batteryLevel=*/ 12),
- /*drainType=*/ 3,
- /*percentOfTotal=*/ 0.3);
+ /* bootTimestamp= */ 101L,
+ /* timestamp= */ 10001L,
+ /* totalPower= */ 5.1,
+ /* consumePower= */ 1.1,
+ /* foregroundUsageConsumePower= */ 1.2,
+ /* foregroundServiceUsageConsumePower= */ 1.3,
+ /* backgroundUsageConsumePower= */ 1.4,
+ /* cachedUsageConsumePower= */ 1.5,
+ /* foregroundUsageTimeInMs= */ 1234L,
+ /* backgroundUsageTimeInMs= */ 5689L,
+ /* batteryLevel= */ 12),
+ /* drainType= */ 3,
+ /* percentOfTotal= */ 0.3);
}
@Test
public void testGetKey_consumerUidType_returnExpectedString() {
- final ContentValues values = getContentValuesWithType(
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
+ final ContentValues values =
+ getContentValuesWithType(ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
values.put(BatteryHistEntry.KEY_UID, 3);
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
@@ -125,8 +123,8 @@
@Test
public void testGetKey_consumerUserType_returnExpectedString() {
- final ContentValues values = getContentValuesWithType(
- ConvertUtils.CONSUMER_TYPE_USER_BATTERY);
+ final ContentValues values =
+ getContentValuesWithType(ConvertUtils.CONSUMER_TYPE_USER_BATTERY);
values.put(BatteryHistEntry.KEY_USER_ID, 2);
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
@@ -135,14 +133,12 @@
@Test
public void testGetKey_consumerSystemType_returnExpectedString() {
- final ContentValues values = getContentValuesWithType(
- ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
+ final ContentValues values =
+ getContentValuesWithType(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
final BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
- .setDrainType(1)
- .build();
- values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+ BatteryInformation.newBuilder().setDrainType(1).build();
+ values.put(
+ BatteryHistEntry.KEY_BATTERY_INFORMATION,
ConvertUtils.convertBatteryInformationToString(batteryInformation));
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
@@ -151,32 +147,51 @@
@Test
public void testIsAppEntry_returnExpectedResult() {
- assertThat(isUidConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).mConsumerType)).isFalse();
- assertThat(isUidConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType)).isFalse();
- assertThat(isUidConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType)).isTrue();
+ assertThat(
+ isUidConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY)
+ .mConsumerType))
+ .isFalse();
+ assertThat(
+ isUidConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType))
+ .isFalse();
+ assertThat(isUidConsumer(createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType))
+ .isTrue();
}
@Test
public void testIsUserEntry_returnExpectedResult() {
- assertThat(isUserConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).mConsumerType)).isFalse();
- assertThat(isUserConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType)).isTrue();
- assertThat(isUserConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType)).isFalse();
+ assertThat(
+ isUserConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY)
+ .mConsumerType))
+ .isFalse();
+ assertThat(
+ isUserConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType))
+ .isTrue();
+ assertThat(
+ isUserConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType))
+ .isFalse();
}
@Test
public void testIsSystemEntry_returnExpectedResult() {
- assertThat(isSystemConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).mConsumerType)).isTrue();
- assertThat(isSystemConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType)).isFalse();
- assertThat(isSystemConsumer(
- createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType)).isFalse();
+ assertThat(
+ isSystemConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY)
+ .mConsumerType))
+ .isTrue();
+ assertThat(
+ isSystemConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType))
+ .isFalse();
+ assertThat(
+ isSystemConsumer(
+ createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType))
+ .isFalse();
}
@Test
@@ -185,52 +200,52 @@
final long upperTimestamp = 300L;
final long lowerTimestamp = 100L;
final double ratio = 0.5;
- final BatteryHistEntry lowerHistEntry = createBatteryHistEntry(
- /*bootTimestamp=*/ 1000L,
- lowerTimestamp,
- /*totalPower=*/ 50,
- /*consumePower=*/ 10,
- /*foregroundUsageConsumePower=*/ 1,
- /*foregroundServiceUsageConsumePower=*/ 2,
- /*backgroundUsageConsumePower=*/ 3,
- /*cachedUsageConsumePower=*/ 4,
- /*foregroundUsageTimeInMs=*/ 100,
- /*backgroundUsageTimeInMs=*/ 200,
- /*batteryLevel=*/ 90);
- final BatteryHistEntry upperHistEntry = createBatteryHistEntry(
- /*bootTimestamp=*/ 1200L,
- upperTimestamp,
- /*totalPower=*/ 80,
- /*consumePower=*/ 20,
- /*foregroundUsageConsumePower=*/ 4,
- /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 6,
- /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 200,
- /*backgroundUsageTimeInMs=*/ 300,
- /*batteryLevel=*/ 80);
+ final BatteryHistEntry lowerHistEntry =
+ createBatteryHistEntry(
+ /* bootTimestamp= */ 1000L,
+ lowerTimestamp,
+ /* totalPower= */ 50,
+ /* consumePower= */ 10,
+ /* foregroundUsageConsumePower= */ 1,
+ /* foregroundServiceUsageConsumePower= */ 2,
+ /* backgroundUsageConsumePower= */ 3,
+ /* cachedUsageConsumePower= */ 4,
+ /* foregroundUsageTimeInMs= */ 100,
+ /* backgroundUsageTimeInMs= */ 200,
+ /* batteryLevel= */ 90);
+ final BatteryHistEntry upperHistEntry =
+ createBatteryHistEntry(
+ /* bootTimestamp= */ 1200L,
+ upperTimestamp,
+ /* totalPower= */ 80,
+ /* consumePower= */ 20,
+ /* foregroundUsageConsumePower= */ 4,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 6,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 200,
+ /* backgroundUsageTimeInMs= */ 300,
+ /* batteryLevel= */ 80);
final BatteryHistEntry newEntry =
BatteryHistEntry.interpolate(
- slotTimestamp,
- upperTimestamp,
- ratio,
- lowerHistEntry,
- upperHistEntry);
+ slotTimestamp, upperTimestamp, ratio, lowerHistEntry, upperHistEntry);
assertBatteryHistEntry(
- newEntry, 3, upperHistEntry.mPercentOfTotal,
- /*bootTimestamp=*/ 1200 - 100,
- /*timestamp=*/ slotTimestamp,
- /*totalPower=*/ 50 + 0.5 * (80 - 50),
- /*consumePower=*/ 10 + 0.5 * (20 - 10),
- /*foregroundUsageConsumePower=*/ 1 + 0.5 * (4 - 1),
- /*foregroundServiceUsageConsumePower=*/ 2 + 0.5 * (5 - 2),
- /*backgroundUsageConsumePower=*/ 3 + 0.5 * (6 - 3),
- /*cachedUsageConsumePower=*/ 4 + 0.5 * (5 - 4),
- /*foregroundUsageTimeInMs=*/ Math.round(100 + 0.5 * (200 - 100)),
- /*backgroundUsageTimeInMs=*/ Math.round(200 + 0.5 * (300 - 200)),
- /*batteryLevel=*/ (int) Math.round(90 + 0.5 * (80 - 90)));
+ newEntry,
+ 3,
+ upperHistEntry.mPercentOfTotal,
+ /* bootTimestamp= */ 1200 - 100,
+ /* timestamp= */ slotTimestamp,
+ /* totalPower= */ 50 + 0.5 * (80 - 50),
+ /* consumePower= */ 10 + 0.5 * (20 - 10),
+ /* foregroundUsageConsumePower= */ 1 + 0.5 * (4 - 1),
+ /* foregroundServiceUsageConsumePower= */ 2 + 0.5 * (5 - 2),
+ /* backgroundUsageConsumePower= */ 3 + 0.5 * (6 - 3),
+ /* cachedUsageConsumePower= */ 4 + 0.5 * (5 - 4),
+ /* foregroundUsageTimeInMs= */ Math.round(100 + 0.5 * (200 - 100)),
+ /* backgroundUsageTimeInMs= */ Math.round(200 + 0.5 * (300 - 200)),
+ /* batteryLevel= */ (int) Math.round(90 + 0.5 * (80 - 90)));
}
@Test
@@ -238,40 +253,43 @@
final long slotTimestamp = 200L;
final long upperTimestamp = 300L;
final double ratio = 0.5;
- final BatteryHistEntry upperHistEntry = createBatteryHistEntry(
- /*bootTimestamp=*/ 1200L,
- upperTimestamp,
- /*totalPower=*/ 80,
- /*consumePower=*/ 20,
- /*foregroundUsageConsumePower=*/ 4,
- /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 6,
- /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 200,
- /*backgroundUsageTimeInMs=*/ 300,
- /*batteryLevel=*/ 80);
+ final BatteryHistEntry upperHistEntry =
+ createBatteryHistEntry(
+ /* bootTimestamp= */ 1200L,
+ upperTimestamp,
+ /* totalPower= */ 80,
+ /* consumePower= */ 20,
+ /* foregroundUsageConsumePower= */ 4,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 6,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 200,
+ /* backgroundUsageTimeInMs= */ 300,
+ /* batteryLevel= */ 80);
final BatteryHistEntry newEntry =
BatteryHistEntry.interpolate(
slotTimestamp,
upperTimestamp,
ratio,
- /*lowerHistEntry=*/ null,
+ /* lowerHistEntry= */ null,
upperHistEntry);
assertBatteryHistEntry(
- newEntry, 3, upperHistEntry.mPercentOfTotal,
- /*bootTimestamp=*/ 1200 - 100,
- /*timestamp=*/ slotTimestamp,
- /*totalPower=*/ 0.5 * 80,
- /*consumePower=*/ 0.5 * 20,
- /*foregroundUsageConsumePower=*/ 0.5 * 4,
- /*foregroundServiceUsageConsumePower=*/ 0.5 * 5,
- /*backgroundUsageConsumePower=*/ 0.5 * 6,
- /*cachedUsageConsumePower=*/ 0.5 * 5,
- /*foregroundUsageTimeInMs=*/ Math.round(0.5 * 200),
- /*backgroundUsageTimeInMs=*/ Math.round(0.5 * 300),
- /*batteryLevel=*/ upperHistEntry.mBatteryLevel);
+ newEntry,
+ 3,
+ upperHistEntry.mPercentOfTotal,
+ /* bootTimestamp= */ 1200 - 100,
+ /* timestamp= */ slotTimestamp,
+ /* totalPower= */ 0.5 * 80,
+ /* consumePower= */ 0.5 * 20,
+ /* foregroundUsageConsumePower= */ 0.5 * 4,
+ /* foregroundServiceUsageConsumePower= */ 0.5 * 5,
+ /* backgroundUsageConsumePower= */ 0.5 * 6,
+ /* cachedUsageConsumePower= */ 0.5 * 5,
+ /* foregroundUsageTimeInMs= */ Math.round(0.5 * 200),
+ /* backgroundUsageTimeInMs= */ Math.round(0.5 * 300),
+ /* batteryLevel= */ upperHistEntry.mBatteryLevel);
}
private static BatteryHistEntry createEntry(int consumerType) {
@@ -280,26 +298,27 @@
private static ContentValues getContentValuesWithType(int consumerType) {
final ContentValues values = new ContentValues();
- values.put(BatteryHistEntry.KEY_CONSUMER_TYPE,
- Integer.valueOf(consumerType));
+ values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(consumerType));
return values;
}
private void assertBatteryHistEntry(
BatteryHistEntry entry, int drainType, double percentOfTotal) {
assertBatteryHistEntry(
- entry, drainType, percentOfTotal,
- /*bootTimestamp=*/ 101L,
- /*timestamp=*/ 10001L,
- /*totalPower=*/ 5.1,
- /*consumePower=*/ 1.1,
- /*foregroundUsageConsumePower=*/ 1.2,
- /*foregroundServiceUsageConsumePower=*/ 1.3,
- /*backgroundUsageConsumePower=*/ 1.4,
- /*cachedUsageConsumePower=*/ 1.5,
- /*foregroundUsageTimeInMs=*/ 1234L,
- /*backgroundUsageTimeInMs=*/ 5689L,
- /*batteryLevel=*/ 12);
+ entry,
+ drainType,
+ percentOfTotal,
+ /* bootTimestamp= */ 101L,
+ /* timestamp= */ 10001L,
+ /* totalPower= */ 5.1,
+ /* consumePower= */ 1.1,
+ /* foregroundUsageConsumePower= */ 1.2,
+ /* foregroundServiceUsageConsumePower= */ 1.3,
+ /* backgroundUsageConsumePower= */ 1.4,
+ /* cachedUsageConsumePower= */ 1.5,
+ /* foregroundUsageTimeInMs= */ 1234L,
+ /* backgroundUsageTimeInMs= */ 5689L,
+ /* batteryLevel= */ 12);
}
private void assertBatteryHistEntry(
@@ -321,8 +340,7 @@
assertThat(entry.mUid).isEqualTo(1001);
assertThat(entry.mUserId).isEqualTo(UserHandle.getUserId(1001));
assertThat(entry.mAppLabel).isEqualTo("Settings");
- assertThat(entry.mPackageName)
- .isEqualTo("com.google.android.settings.battery");
+ assertThat(entry.mPackageName).isEqualTo("com.google.android.settings.battery");
assertThat(entry.mIsHidden).isTrue();
assertThat(entry.mBootTimestamp).isEqualTo(bootTimestamp);
assertThat(entry.mTimestamp).isEqualTo(timestamp);
@@ -338,13 +356,10 @@
assertThat(entry.mForegroundUsageTimeInMs).isEqualTo(foregroundUsageTimeInMs);
assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(backgroundUsageTimeInMs);
assertThat(entry.mDrainType).isEqualTo(drainType);
- assertThat(entry.mConsumerType)
- .isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
+ assertThat(entry.mConsumerType).isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
assertThat(entry.mBatteryLevel).isEqualTo(batteryLevel);
- assertThat(entry.mBatteryStatus)
- .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
- assertThat(entry.mBatteryHealth)
- .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
+ assertThat(entry.mBatteryStatus).isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
+ assertThat(entry.mBatteryHealth).isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
}
private BatteryHistEntry createBatteryHistEntry(
@@ -359,24 +374,24 @@
long foregroundUsageTimeInMs,
long backgroundUsageTimeInMs,
int batteryLevel) {
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- BatteryHistEntry.KEY_UID,
- BatteryHistEntry.KEY_USER_ID,
- BatteryHistEntry.KEY_PACKAGE_NAME,
- BatteryHistEntry.KEY_TIMESTAMP,
- BatteryHistEntry.KEY_CONSUMER_TYPE,
- BatteryHistEntry.KEY_BATTERY_INFORMATION});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ BatteryHistEntry.KEY_UID,
+ BatteryHistEntry.KEY_USER_ID,
+ BatteryHistEntry.KEY_PACKAGE_NAME,
+ BatteryHistEntry.KEY_TIMESTAMP,
+ BatteryHistEntry.KEY_CONSUMER_TYPE,
+ BatteryHistEntry.KEY_BATTERY_INFORMATION
+ });
DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
+ DeviceBatteryState.newBuilder()
.setBatteryLevel(batteryLevel)
.setBatteryStatus(BatteryManager.BATTERY_STATUS_FULL)
.setBatteryHealth(BatteryManager.BATTERY_HEALTH_COLD)
.build();
BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
+ BatteryInformation.newBuilder()
.setDeviceBatteryState(deviceBatteryState)
.setIsHidden(true)
.setBootTimestamp(bootTimestamp)
@@ -394,13 +409,14 @@
.setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
.build();
cursor.addRow(
- new Object[]{
- Long.valueOf(1001),
- Long.valueOf(UserHandle.getUserId(1001)),
- "com.google.android.settings.battery",
- Long.valueOf(timestamp),
- Integer.valueOf(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY),
- ConvertUtils.convertBatteryInformationToString(batteryInformation)});
+ new Object[] {
+ Long.valueOf(1001),
+ Long.valueOf(UserHandle.getUserId(1001)),
+ "com.google.android.settings.battery",
+ Long.valueOf(timestamp),
+ Integer.valueOf(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY),
+ ConvertUtils.convertBatteryInformationToString(batteryInformation)
+ });
cursor.moveToFirst();
return new BatteryHistEntry(cursor);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreferenceTest.java
index 9155c66..26fff37 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreferenceTest.java
@@ -38,14 +38,10 @@
@RunWith(RobolectricTestRunner.class)
public class BatteryHistoryPreferenceTest {
- @Mock
- private PreferenceViewHolder mViewHolder;
- @Mock
- private TextView mTextView;
- @Mock
- private BatteryChartView mDailyChartView;
- @Mock
- private BatteryChartView mHourlyChartView;
+ @Mock private PreferenceViewHolder mViewHolder;
+ @Mock private TextView mTextView;
+ @Mock private BatteryChartView mDailyChartView;
+ @Mock private BatteryChartView mHourlyChartView;
private BatteryHistoryPreference mBatteryHistoryPreference;
@Before
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
index 7dc4eab..712df9d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
@@ -42,129 +42,143 @@
@Test
public void getDailyTimestamps_allDataInOneHour_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1640970006000L, // 2022-01-01 01:00:06
- 1640973608000L // 2022-01-01 01:00:08
- );
+ final List<Long> timestamps =
+ List.of(
+ 1640970006000L, // 2022-01-01 01:00:06
+ 1640973608000L // 2022-01-01 01:00:08
+ );
- final List<Long> expectedTimestamps = List.of(
- 1640970006000L, // 2022-01-01 01:00:06
- 1640973608000L // 2022-01-01 01:00:08
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1640970006000L, // 2022-01-01 01:00:06
+ 1640973608000L // 2022-01-01 01:00:08
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@Test
public void getDailyTimestamps_OneHourDataPerDay_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1641049200000L, // 2022-01-01 23:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L // 2022-01-02 01:00:00
- );
+ final List<Long> timestamps =
+ List.of(
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L // 2022-01-02 01:00:00
+ );
- final List<Long> expectedTimestamps = List.of(
- 1641049200000L, // 2022-01-01 23:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L // 2022-01-02 01:00:00
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L // 2022-01-02 01:00:00
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@Test
public void getDailyTimestamps_OneDayData_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1640966400000L, // 2022-01-01 00:00:00
- 1640970000000L, // 2022-01-01 01:00:00
- 1640973600000L, // 2022-01-01 02:00:00
- 1640977200000L, // 2022-01-01 03:00:00
- 1640980800000L // 2022-01-01 04:00:00
- );
+ final List<Long> timestamps =
+ List.of(
+ 1640966400000L, // 2022-01-01 00:00:00
+ 1640970000000L, // 2022-01-01 01:00:00
+ 1640973600000L, // 2022-01-01 02:00:00
+ 1640977200000L, // 2022-01-01 03:00:00
+ 1640980800000L // 2022-01-01 04:00:00
+ );
- final List<Long> expectedTimestamps = List.of(
- 1640966400000L, // 2022-01-01 00:00:00
- 1640980800000L // 2022-01-01 04:00:00
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1640966400000L, // 2022-01-01 00:00:00
+ 1640980800000L // 2022-01-01 04:00:00
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@Test
public void getDailyTimestamps_MultipleDaysData_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1641045600000L, // 2022-01-01 22:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- 1641160800000L, // 2022-01-03 06:00:00
- 1641232800000L // 2022-01-04 02:00:00
- );
+ final List<Long> timestamps =
+ List.of(
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641232800000L // 2022-01-04 02:00:00
+ );
- final List<Long> expectedTimestamps = List.of(
- 1641045600000L, // 2022-01-01 22:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641139200000L, // 2022-01-03 00:00:00
- 1641225600000L, // 2022-01-04 00:00:00
- 1641232800000L // 2022-01-04 02:00:00
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L, // 2022-01-04 00:00:00
+ 1641232800000L // 2022-01-04 02:00:00
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@Test
public void getDailyTimestamps_FirstDayOneHourData_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1641049200000L, // 2022-01-01 23:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- 1641160800000L, // 2022-01-03 06:00:00
- 1641254400000L // 2022-01-04 08:00:00
- );
+ final List<Long> timestamps =
+ List.of(
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641254400000L // 2022-01-04 08:00:00
+ );
- final List<Long> expectedTimestamps = List.of(
- 1641049200000L, // 2022-01-01 23:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641139200000L, // 2022-01-03 00:00:00
- 1641225600000L, // 2022-01-04 00:00:00
- 1641254400000L // 2022-01-04 08:00:00
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L, // 2022-01-04 00:00:00
+ 1641254400000L // 2022-01-04 08:00:00
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@Test
public void getDailyTimestamps_LastDayNoData_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1640988000000L, // 2022-01-01 06:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- 1641160800000L, // 2022-01-03 06:00:00
- 1641225600000L // 2022-01-04 00:00:00
- );
+ final List<Long> timestamps =
+ List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641225600000L // 2022-01-04 00:00:00
+ );
- final List<Long> expectedTimestamps = List.of(
- 1640988000000L, // 2022-01-01 06:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641139200000L, // 2022-01-03 00:00:00
- 1641225600000L // 2022-01-04 00:00:00
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L // 2022-01-04 00:00:00
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@Test
public void getDailyTimestamps_LastDayOneHourData_returnExpectedList() {
// Timezone GMT+8
- final List<Long> timestamps = List.of(
- 1640988000000L, // 2022-01-01 06:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- 1641160800000L, // 2022-01-03 06:00:00
- 1641229200000L // 2022-01-04 01:00:00
- );
+ final List<Long> timestamps =
+ List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641229200000L // 2022-01-04 01:00:00
+ );
- final List<Long> expectedTimestamps = List.of(
- 1640988000000L, // 2022-01-01 06:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641139200000L, // 2022-01-03 00:00:00
- 1641225600000L, // 2022-01-04 00:00:00
- 1641229200000L // 2022-01-04 01:00:00
- );
+ final List<Long> expectedTimestamps =
+ List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L, // 2022-01-04 00:00:00
+ 1641229200000L // 2022-01-04 01:00:00
+ );
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
}
@@ -172,21 +186,26 @@
public void combine_normalFlow_returnExpectedResult() {
final BatteryLevelData batteryLevelData =
new BatteryLevelData(Map.of(1691596800000L, 90, 1691604000000L, 80));
- final List<BatteryEvent> batteryLevelRecordEvents = List.of(
- BatteryEvent.newBuilder().setTimestamp(1691586000166L).setBatteryLevel(100)
- .setType(BatteryEventType.FULL_CHARGED).build(),
- BatteryEvent.newBuilder().setTimestamp(1691589600000L).setBatteryLevel(98)
- .setType(BatteryEventType.EVEN_HOUR).build());
+ final List<BatteryEvent> batteryLevelRecordEvents =
+ List.of(
+ BatteryEvent.newBuilder()
+ .setTimestamp(1691586000166L)
+ .setBatteryLevel(100)
+ .setType(BatteryEventType.FULL_CHARGED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(1691589600000L)
+ .setBatteryLevel(98)
+ .setType(BatteryEventType.EVEN_HOUR)
+ .build());
BatteryLevelData result =
BatteryLevelData.combine(batteryLevelData, batteryLevelRecordEvents);
assertThat(result.getDailyBatteryLevels().getTimestamps())
.isEqualTo(List.of(1691586000166L, 1691596800000L, 1691604000000L));
- assertThat(result.getDailyBatteryLevels().getLevels())
- .isEqualTo(List.of(100, 90, 80));
- assertThat(result.getHourlyBatteryLevelsPerDay())
- .hasSize(2);
+ assertThat(result.getDailyBatteryLevels().getLevels()).isEqualTo(List.of(100, 90, 80));
+ assertThat(result.getHourlyBatteryLevelsPerDay()).hasSize(2);
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getTimestamps())
.isEqualTo(List.of(1691586000166L, 1691589600000L, 1691596800000L));
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getLevels())
@@ -199,17 +218,22 @@
@Test
public void combine_existingBatteryLevelDataIsNull_returnExpectedResult() {
- final List<BatteryEvent> batteryLevelRecordEvents = List.of(
- BatteryEvent.newBuilder().setTimestamp(1691586000166L).setBatteryLevel(100)
- .setType(BatteryEventType.FULL_CHARGED).build(),
- BatteryEvent.newBuilder().setTimestamp(1691589600000L).setBatteryLevel(98)
- .setType(BatteryEventType.EVEN_HOUR).build());
+ final List<BatteryEvent> batteryLevelRecordEvents =
+ List.of(
+ BatteryEvent.newBuilder()
+ .setTimestamp(1691586000166L)
+ .setBatteryLevel(100)
+ .setType(BatteryEventType.FULL_CHARGED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(1691589600000L)
+ .setBatteryLevel(98)
+ .setType(BatteryEventType.EVEN_HOUR)
+ .build());
- BatteryLevelData result =
- BatteryLevelData.combine(null, batteryLevelRecordEvents);
+ BatteryLevelData result = BatteryLevelData.combine(null, batteryLevelRecordEvents);
- assertThat(result.getHourlyBatteryLevelsPerDay())
- .hasSize(1);
+ assertThat(result.getHourlyBatteryLevelsPerDay()).hasSize(1);
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getTimestamps())
.isEqualTo(List.of(1691586000166L, 1691589600000L));
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getLevels())
@@ -219,25 +243,31 @@
@Test
public void getIndexByTimestamps_returnExpectedResult() {
final BatteryLevelData batteryLevelData =
- new BatteryLevelData(Map.of(
- 1694354400000L, 1, // 2023-09-10 22:00:00
- 1694361600000L, 2, // 2023-09-11 00:00:00
- 1694368800000L, 3)); // 2023-09-11 02:00:00
+ new BatteryLevelData(
+ Map.of(
+ 1694354400000L, 1, // 2023-09-10 22:00:00
+ 1694361600000L, 2, // 2023-09-11 00:00:00
+ 1694368800000L, 3)); // 2023-09-11 02:00:00
final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
assertThat(batteryLevelData.getIndexByTimestamps(0L, 0L))
- .isEqualTo(Pair.create(BatteryChartViewModel.SELECTED_INDEX_INVALID,
- BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ .isEqualTo(
+ Pair.create(
+ BatteryChartViewModel.SELECTED_INDEX_INVALID,
+ BatteryChartViewModel.SELECTED_INDEX_INVALID));
assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L + 1L, 1694368800000L + 1L))
- .isEqualTo(Pair.create(BatteryChartViewModel.SELECTED_INDEX_INVALID,
- BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ .isEqualTo(
+ Pair.create(
+ BatteryChartViewModel.SELECTED_INDEX_INVALID,
+ BatteryChartViewModel.SELECTED_INDEX_INVALID));
assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L, 1694368800000L))
.isEqualTo(Pair.create(1, 0));
assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L + 1L, 1694368800000L - 1L))
.isEqualTo(Pair.create(1, 0));
- assertThat(batteryLevelData.getIndexByTimestamps(
- event.getWarningItemInfo().getStartTimestamp(),
- event.getWarningItemInfo().getEndTimestamp()))
+ assertThat(
+ batteryLevelData.getIndexByTimestamps(
+ event.getWarningItemInfo().getStartTimestamp(),
+ event.getWarningItemInfo().getEndTimestamp()))
.isEqualTo(Pair.create(1, 0));
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
index 63cb1b3..91d8c7d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
@@ -61,19 +61,16 @@
private BatteryTipsController mBatteryTipsController;
private BatteryChartPreferenceController mBatteryChartPreferenceController;
- @Mock
- private View mFakeView;
- @Mock
- private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
- @Mock
- private BatteryDiffEntry mFakeEntry;
+ @Mock private View mFakeView;
+ @Mock private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
+ @Mock private BatteryDiffEntry mFakeEntry;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
mFeatureFactory = FakeFeatureFactory.setupForTest();
- mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null);
+ mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /* attrs= */ null);
mBatteryTipsController = new BatteryTipsController(mContext);
mBatteryChartPreferenceController =
spy(new BatteryChartPreferenceController(mContext, null, null));
@@ -85,17 +82,20 @@
mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
- mPowerUsageAdvanced.mBatteryLevelData = Optional.of(new BatteryLevelData(Map.of(
- 1694354400000L, 1, // 2023-09-10 22:00:00
- 1694361600000L, 2, // 2023-09-11 00:00:00
- 1694368800000L, 3))); // 2023-09-11 02:00:00
+ mPowerUsageAdvanced.mBatteryLevelData =
+ Optional.of(
+ new BatteryLevelData(
+ Map.of(
+ 1694354400000L, 1, // 2023-09-10 22:00:00
+ 1694361600000L, 2, // 2023-09-11 00:00:00
+ 1694368800000L, 3))); // 2023-09-11 02:00:00
doReturn("TestEntriesKey").when(mFakeEntry).getKey();
}
@Test
public void constructor_returnExpectedResult() {
- assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo(
- R.layout.battery_tips_card);
+ assertThat(mBatteryTipsCardPreference.getLayoutResource())
+ .isEqualTo(R.layout.battery_tips_card);
}
@Test
@@ -118,10 +118,13 @@
.isEqualTo(DisplaySettings.class.getName());
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1))
.isEqualTo(SettingsEnums.DISPLAY);
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "BrightnessAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
+ "BrightnessAnomaly");
}
@Test
@@ -140,10 +143,16 @@
assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext)).hasSize(1);
assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext))
.contains(PowerAnomalyKey.KEY_SCREEN_TIMEOUT.name());
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "ScreenTimeoutAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW,
+ "ScreenTimeoutAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS,
+ "ScreenTimeoutAnomaly");
}
@Test
@@ -159,13 +168,12 @@
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
verify(mContext, never()).startActivity(any(Intent.class));
- verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
- eq(1), eq(0));
+ verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
verify(mBatteryChartPreferenceController).selectHighlightSlotIndex();
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "AppAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "AppAnomaly");
}
@Test
@@ -180,12 +188,11 @@
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
verify(mContext, never()).startActivity(any(Intent.class));
- verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
- eq(1), eq(0));
+ verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
verify(mBatteryChartPreferenceController, never()).selectHighlightSlotIndex();
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "AppAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "AppAnomaly");
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
index b8afe98..91b2e15 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
@@ -48,8 +48,7 @@
private FakeFeatureFactory mFeatureFactory;
private BatteryTipsController mBatteryTipsController;
- @Mock
- private BatteryTipsCardPreference mBatteryTipsCardPreference;
+ @Mock private BatteryTipsCardPreference mBatteryTipsCardPreference;
@Before
public void setUp() {
@@ -82,17 +81,17 @@
new AnomalyEventWrapper(mContext, event), false);
// Check pre-defined string
- verify(mBatteryTipsCardPreference).setTitle(
- "Turn on adaptive brightness to extend battery life");
+ verify(mBatteryTipsCardPreference)
+ .setTitle("Turn on adaptive brightness to extend battery life");
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
- verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
- R.color.color_accent_selector);
+ verify(mBatteryTipsCardPreference)
+ .setMainButtonStrokeColorResourceId(R.color.color_accent_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
// Check proto info
verify(mBatteryTipsCardPreference).setVisible(true);
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
}
@Test
@@ -105,25 +104,29 @@
verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life");
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
- verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
- R.color.color_accent_selector);
+ verify(mBatteryTipsCardPreference)
+ .setMainButtonStrokeColorResourceId(R.color.color_accent_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
verify(mBatteryTipsCardPreference).setVisible(true);
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW,
+ "ScreenTimeoutAnomaly");
}
@Test
public void handleBatteryTipsCardUpdated_screenTimeoutAnomalyHasTitle_showAnomaly() {
PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent();
String testTitle = "TestTitle";
- event = event.toBuilder()
- .setWarningBannerInfo(
- event.getWarningBannerInfo().toBuilder()
- .setTitleString(testTitle)
- .build())
- .build();
+ event =
+ event.toBuilder()
+ .setWarningBannerInfo(
+ event.getWarningBannerInfo().toBuilder()
+ .setTitleString(testTitle)
+ .build())
+ .build();
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
mBatteryTipsController.handleBatteryTipsCardUpdated(
@@ -131,13 +134,16 @@
verify(mBatteryTipsCardPreference).setTitle(testTitle);
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
- verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
- R.color.color_accent_selector);
+ verify(mBatteryTipsCardPreference)
+ .setMainButtonStrokeColorResourceId(R.color.color_accent_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
verify(mBatteryTipsCardPreference).setVisible(true);
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW,
+ "ScreenTimeoutAnomaly");
}
@Test
@@ -146,20 +152,18 @@
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
AnomalyEventWrapper eventWrapper = new AnomalyEventWrapper(mContext, event);
- eventWrapper.setRelatedBatteryDiffEntry(
- new BatteryDiffEntry(mContext, "", "Chrome", 0));
+ eventWrapper.setRelatedBatteryDiffEntry(new BatteryDiffEntry(mContext, "", "Chrome", 0));
mBatteryTipsController.handleBatteryTipsCardUpdated(eventWrapper, false);
- verify(mBatteryTipsCardPreference).setTitle(
- "Chrome used more battery than usual");
- verify(mBatteryTipsCardPreference).setIconResourceId(
- R.drawable.ic_battery_tips_warning_icon);
- verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
- R.color.color_battery_anomaly_yellow_selector);
+ verify(mBatteryTipsCardPreference).setTitle("Chrome used more battery than usual");
+ verify(mBatteryTipsCardPreference)
+ .setIconResourceId(R.drawable.ic_battery_tips_warning_icon);
+ verify(mBatteryTipsCardPreference)
+ .setMainButtonStrokeColorResourceId(R.color.color_battery_anomaly_yellow_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("Check");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
verify(mBatteryTipsCardPreference).setVisible(true);
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
index a721ad4..fc30702 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
@@ -58,18 +58,12 @@
private static final String PREF_KEY2 = "pref_key2";
private static final String PREF_SUMMARY = "fake preference summary";
- @Mock
- private InstrumentedPreferenceFragment mFragment;
- @Mock
- private SettingsActivity mSettingsActivity;
- @Mock
- private PreferenceGroup mAppListPreferenceGroup;
- @Mock
- private Drawable mDrawable;
- @Mock
- private BatteryHistEntry mBatteryHistEntry;
- @Mock
- private AnomalyAppItemPreference mAnomalyAppItemPreference;
+ @Mock private InstrumentedPreferenceFragment mFragment;
+ @Mock private SettingsActivity mSettingsActivity;
+ @Mock private PreferenceGroup mAppListPreferenceGroup;
+ @Mock private Drawable mDrawable;
+ @Mock private BatteryHistEntry mBatteryHistEntry;
+ @Mock private AnomalyAppItemPreference mAnomalyAppItemPreference;
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
@@ -94,43 +88,51 @@
.getHideApplicationSet();
mBatteryUsageBreakdownController = createController();
mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup;
- mBatteryDiffEntry = new BatteryDiffEntry(
- mContext,
- /*uid=*/ 0L,
- /*userId=*/ 0L,
- /*key=*/ "key",
- /*isHidden=*/ false,
- /*componentId=*/ -1,
- /*legacyPackageName=*/ null,
- /*legacyLabel=*/ null,
- /*consumerType=*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
- /*foregroundUsageTimeInMs=*/ 1,
- /*backgroundUsageTimeInMs=*/ 2,
- /*screenOnTimeInMs=*/ 0,
- /*consumePower=*/ 3,
- /*foregroundUsageConsumePower=*/ 0,
- /*foregroundServiceUsageConsumePower=*/ 1,
- /*backgroundUsageConsumePower=*/ 2,
- /*cachedUsageConsumePower=*/ 0);
+ mBatteryDiffEntry =
+ new BatteryDiffEntry(
+ mContext,
+ /* uid= */ 0L,
+ /* userId= */ 0L,
+ /* key= */ "key",
+ /* isHidden= */ false,
+ /* componentId= */ -1,
+ /* legacyPackageName= */ null,
+ /* legacyLabel= */ null,
+ /* consumerType= */ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 1,
+ /* backgroundUsageTimeInMs= */ 2,
+ /* screenOnTimeInMs= */ 0,
+ /* consumePower= */ 3,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 1,
+ /* backgroundUsageConsumePower= */ 2,
+ /* cachedUsageConsumePower= */ 0);
mBatteryDiffEntry = spy(mBatteryDiffEntry);
mBatteryUsageBreakdownController.mBatteryDiffData =
- new BatteryDiffData(mContext, /* startTimestamp= */ 0L, /* endTimestamp= */ 0L,
- /* startBatteryLevel= */ 0, /* endBatteryLevel= */ 0,
- /* screenOnTime= */ 0L, Arrays.asList(mBatteryDiffEntry), Arrays.asList(),
- Set.of(), Set.of(), /* isAccumulated= */ false);
+ new BatteryDiffData(
+ mContext,
+ /* startTimestamp= */ 0L,
+ /* endTimestamp= */ 0L,
+ /* startBatteryLevel= */ 0,
+ /* endBatteryLevel= */ 0,
+ /* screenOnTime= */ 0L,
+ Arrays.asList(mBatteryDiffEntry),
+ Arrays.asList(),
+ Set.of(),
+ Set.of(),
+ /* isAccumulated= */ false);
BatteryDiffEntry.clearCache();
// Adds fake testing data.
BatteryDiffEntry.sResourceCache.put(
"fakeBatteryDiffEntryKey",
- new BatteryEntry.NameAndIcon("fakeName", /*icon=*/ null, /*iconId=*/ 1));
+ new BatteryEntry.NameAndIcon("fakeName", /* icon= */ null, /* iconId= */ 1));
doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
}
@Test
public void onDestroy_clearPreferenceCacheAndPreferenceGroupRemoveAll() {
// Ensures the testing environment is correct.
- mBatteryUsageBreakdownController.mPreferenceCache.put(
- PREF_KEY, mAnomalyAppItemPreference);
+ mBatteryUsageBreakdownController.mPreferenceCache.put(PREF_KEY, mAnomalyAppItemPreference);
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).hasSize(1);
mBatteryUsageBreakdownController.onDestroy();
@@ -158,8 +160,8 @@
// Verifies the preference cache.
final PowerGaugePreference pref =
- (PowerGaugePreference) mBatteryUsageBreakdownController.mPreferenceCache
- .get(PREF_KEY);
+ (PowerGaugePreference)
+ mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY);
assertThat(pref).isNotNull();
// Verifies the added preference configuration.
verify(mAppListPreferenceGroup).addPreference(pref);
@@ -218,8 +220,10 @@
@Test
public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
- assertThat(mBatteryUsageBreakdownController
- .handlePreferenceTreeClick(mAppListPreferenceGroup)).isFalse();
+ assertThat(
+ mBatteryUsageBreakdownController.handlePreferenceTreeClick(
+ mAppListPreferenceGroup))
+ .isFalse();
verify(mMetricsFeatureProvider, never())
.action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM);
@@ -232,8 +236,10 @@
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY;
doReturn(mBatteryDiffEntry).when(mAnomalyAppItemPreference).getBatteryDiffEntry();
- assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
- mAnomalyAppItemPreference)).isTrue();
+ assertThat(
+ mBatteryUsageBreakdownController.handlePreferenceTreeClick(
+ mAnomalyAppItemPreference))
+ .isTrue();
verify(mMetricsFeatureProvider)
.action(
SettingsEnums.OPEN_BATTERY_USAGE,
@@ -248,8 +254,10 @@
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_UID_BATTERY;
doReturn(mBatteryDiffEntry).when(mAnomalyAppItemPreference).getBatteryDiffEntry();
- assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
- mAnomalyAppItemPreference)).isTrue();
+ assertThat(
+ mBatteryUsageBreakdownController.handlePreferenceTreeClick(
+ mAnomalyAppItemPreference))
+ .isTrue();
verify(mMetricsFeatureProvider)
.action(
SettingsEnums.OPEN_BATTERY_USAGE,
@@ -262,11 +270,12 @@
@Test
public void setPreferencePercent_lessThanThreshold_expectedFormat() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
- final BatteryDiffEntry batteryDiffEntry = createBatteryDiffEntry(
- /*isSystem=*/ true,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ 0,
- /*backgroundUsageTimeInMs=*/ 0);
+ final BatteryDiffEntry batteryDiffEntry =
+ createBatteryDiffEntry(
+ /* isSystem= */ true,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ 0);
batteryDiffEntry.mConsumePower = 0.8;
batteryDiffEntry.setTotalConsumePower(100);
mBatteryUsageBreakdownController.mPercentLessThanThresholdText = "< 1%";
@@ -279,11 +288,12 @@
@Test
public void setPreferencePercent_greaterThanThreshold_expectedFormat() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
- final BatteryDiffEntry batteryDiffEntry = createBatteryDiffEntry(
- /*isSystem=*/ true,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ 0,
- /*backgroundUsageTimeInMs=*/ 0);
+ final BatteryDiffEntry batteryDiffEntry =
+ createBatteryDiffEntry(
+ /* isSystem= */ true,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ 0);
batteryDiffEntry.mConsumePower = 16;
batteryDiffEntry.setTotalConsumePower(100);
mBatteryUsageBreakdownController.mPercentLessThanThresholdText = "< 1%";
@@ -299,11 +309,12 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ true,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ 0,
- /*backgroundUsageTimeInMs=*/ 0));
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ true,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString().isEmpty()).isTrue();
}
@@ -313,11 +324,12 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ true,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
- /*backgroundUsageTimeInMs=*/ 0));
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ true,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1,
+ /* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Total: less than a min");
}
@@ -327,11 +339,12 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ true,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS * 2,
- /*backgroundUsageTimeInMs=*/ 0));
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ true,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS * 2,
+ /* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min");
}
@@ -341,11 +354,12 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ false,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ 0,
- /*backgroundUsageTimeInMs=*/ 0));
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ false,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString().isEmpty()).isTrue();
}
@@ -355,11 +369,12 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ false,
- /*screenOnTimeInMs=*/ 0,
- /*foregroundUsageTimeInMs=*/ 0,
- /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ false,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS));
assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
}
@@ -369,11 +384,12 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ false,
- /*screenOnTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
- /*foregroundUsageTimeInMs=*/ 0,
- /*backgroundUsageTimeInMs=*/ 0));
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ false,
+ /* screenOnTimeInMs= */ DateUtils.MINUTE_IN_MILLIS,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Screen time: 1 min");
}
@@ -383,21 +399,28 @@
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
- pref, createBatteryDiffEntry(
- /*isSystem=*/ false,
- /*screenOnTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
- /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
- /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1));
- assertThat(pref.getSummary().toString()).isEqualTo(
- "Screen time: less than a min\nBackground: less than a min");
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ false,
+ /* screenOnTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1,
+ /* foregroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1,
+ /* backgroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1));
+ assertThat(pref.getSummary().toString())
+ .isEqualTo("Screen time: less than a min\nBackground: less than a min");
}
- private BatteryDiffEntry createBatteryDiffEntry(boolean isSystem, long screenOnTimeInMs,
- long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
+ private BatteryDiffEntry createBatteryDiffEntry(
+ boolean isSystem,
+ long screenOnTimeInMs,
+ long foregroundUsageTimeInMs,
+ long backgroundUsageTimeInMs) {
final ContentValues contentValues = new ContentValues();
- contentValues.put(BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(
- isSystem ? ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY
- : ConvertUtils.CONSUMER_TYPE_UID_BATTERY));
+ contentValues.put(
+ BatteryHistEntry.KEY_CONSUMER_TYPE,
+ Integer.valueOf(
+ isSystem
+ ? ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY
+ : ConvertUtils.CONSUMER_TYPE_UID_BATTERY));
contentValues.put(BatteryHistEntry.KEY_USER_ID, Integer.valueOf(1001));
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(contentValues);
return new BatteryDiffEntry(
@@ -413,17 +436,17 @@
foregroundUsageTimeInMs,
backgroundUsageTimeInMs,
screenOnTimeInMs,
- /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0,
- /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0,
- /*cachedUsageConsumePower=*/ 0);
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0);
}
private BatteryUsageBreakdownController createController() {
final BatteryUsageBreakdownController controller =
new BatteryUsageBreakdownController(
- mContext, /*lifecycle=*/ null, mSettingsActivity, mFragment);
+ mContext, /* lifecycle= */ null, mSettingsActivity, mFragment);
controller.mPrefContext = mContext;
return controller;
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java
index c4cb89e..af0cb91 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiverTest.java
@@ -48,8 +48,7 @@
private BatteryUsageBroadcastReceiver mBatteryUsageBroadcastReceiver;
private FakeFeatureFactory mFakeFeatureFactory;
- @Mock
- private PackageManager mPackageManager;
+ @Mock private PackageManager mPackageManager;
@Before
public void setUp() {
@@ -72,8 +71,8 @@
public void onReceive_workProfile_doNothing() {
BatteryTestUtils.setWorkProfile(mContext);
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
}
@@ -84,11 +83,12 @@
.thenReturn(Intent.ACTION_BATTERY_LEVEL_CHANGED);
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(true);
- doReturn(getBatteryIntent(/*level=*/ 20, BatteryManager.BATTERY_STATUS_UNKNOWN))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 20, BatteryManager.BATTERY_STATUS_UNKNOWN))
+ .when(mContext)
+ .registerReceiver(any(), any());
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
assertSharedPreferences(Intent.ACTION_BATTERY_LEVEL_CHANGED);
@@ -101,14 +101,15 @@
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(true);
// Make sure isCharged returns true.
- doReturn(getBatteryIntent(/*level=*/ 100, BatteryManager.BATTERY_STATUS_FULL))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 100, BatteryManager.BATTERY_STATUS_FULL))
+ .when(mContext)
+ .registerReceiver(any(), any());
// Make sure broadcast will be sent with delay.
BatteryUsageBroadcastReceiver.sBroadcastDelayFromBoot =
SystemClock.elapsedRealtime() + 5 * DateUtils.MINUTE_IN_MILLIS;
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
assertSharedPreferences(Intent.ACTION_BATTERY_LEVEL_CHANGED);
@@ -121,13 +122,14 @@
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(true);
// Make sure isCharged returns true.
- doReturn(getBatteryIntent(/*level=*/ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
+ .when(mContext)
+ .registerReceiver(any(), any());
BatteryUsageBroadcastReceiver.sBroadcastDelayFromBoot =
SystemClock.elapsedRealtime() - 5 * DateUtils.MINUTE_IN_MILLIS;
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
assertSharedPreferences(Intent.ACTION_BATTERY_LEVEL_CHANGED);
@@ -140,13 +142,14 @@
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(true);
// Make sure isCharged returns true.
- doReturn(getBatteryIntent(/*level=*/ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
+ .when(mContext)
+ .registerReceiver(any(), any());
BatteryUsageBroadcastReceiver.sBroadcastDelayFromBoot =
SystemClock.elapsedRealtime() - 5 * DateUtils.MINUTE_IN_MILLIS;
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(Intent.ACTION_BATTERY_LEVEL_CHANGED));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isTrue();
assertSharedPreferences(Intent.ACTION_BATTERY_LEVEL_CHANGED);
@@ -158,11 +161,12 @@
.thenReturn(Intent.ACTION_POWER_DISCONNECTED);
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(false);
- doReturn(getBatteryIntent(/*level=*/ 20, BatteryManager.BATTERY_STATUS_UNKNOWN))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 20, BatteryManager.BATTERY_STATUS_UNKNOWN))
+ .when(mContext)
+ .registerReceiver(any(), any());
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
assertSharedPreferences(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
@@ -175,14 +179,15 @@
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(false);
// Make sure isCharged returns true.
- doReturn(getBatteryIntent(/*level=*/ 100, BatteryManager.BATTERY_STATUS_FULL))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 100, BatteryManager.BATTERY_STATUS_FULL))
+ .when(mContext)
+ .registerReceiver(any(), any());
// Make sure broadcast will be sent with delay.
BatteryUsageBroadcastReceiver.sBroadcastDelayFromBoot =
SystemClock.elapsedRealtime() + 5 * DateUtils.MINUTE_IN_MILLIS;
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isTrue();
assertSharedPreferences(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
@@ -195,13 +200,14 @@
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(false);
// Make sure isCharged returns true.
- doReturn(getBatteryIntent(/*level=*/ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
+ .when(mContext)
+ .registerReceiver(any(), any());
BatteryUsageBroadcastReceiver.sBroadcastDelayFromBoot =
SystemClock.elapsedRealtime() - 5 * DateUtils.MINUTE_IN_MILLIS;
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
assertSharedPreferences(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
@@ -214,13 +220,14 @@
when(mFakeFeatureFactory.powerUsageFeatureProvider.delayHourlyJobWhenBooting())
.thenReturn(false);
// Make sure isCharged returns true.
- doReturn(getBatteryIntent(/*level=*/ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
- .when(mContext).registerReceiver(any(), any());
+ doReturn(getBatteryIntent(/* level= */ 100, BatteryManager.BATTERY_STATUS_UNKNOWN))
+ .when(mContext)
+ .registerReceiver(any(), any());
BatteryUsageBroadcastReceiver.sBroadcastDelayFromBoot =
SystemClock.elapsedRealtime() - 5 * DateUtils.MINUTE_IN_MILLIS;
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
- new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isTrue();
assertSharedPreferences(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
@@ -234,12 +241,12 @@
/*packageName*/ "com.android.testing_package", Boolean.valueOf(true));
assertThat(BatteryDiffEntry.sValidForRestriction).isNotEmpty();
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext,
new Intent(BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA));
assertThat(BatteryDiffEntry.sValidForRestriction).isEmpty();
- assertSharedPreferences(
- BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA);
+ assertSharedPreferences(BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA);
}
@Test
@@ -250,12 +257,12 @@
/*packageName*/ "com.android.testing_package", Boolean.valueOf(true));
assertThat(BatteryDiffEntry.sValidForRestriction).isNotEmpty();
- mBatteryUsageBroadcastReceiver.onReceive(mContext,
+ mBatteryUsageBroadcastReceiver.onReceive(
+ mContext,
new Intent(BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA));
assertThat(BatteryDiffEntry.sValidForRestriction).isNotEmpty();
- assertSharedPreferences(
- BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA);
+ assertSharedPreferences(BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA);
}
private static Intent getBatteryIntent(int level, int status) {
@@ -267,7 +274,6 @@
}
private void assertSharedPreferences(String preferenceKey) {
- assertThat(DatabaseUtils.getSharedPreferences(mContext).contains(preferenceKey))
- .isTrue();
+ assertThat(DatabaseUtils.getSharedPreferences(mContext).contains(preferenceKey)).isTrue();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
index 999a921..95b950f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
@@ -66,7 +66,7 @@
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mProvider = new BatteryUsageContentProvider();
- mProvider.attachInfo(mContext, /*info=*/ null);
+ mProvider.attachInfo(mContext, /* info= */ null);
BatteryTestUtils.setUpBatteryStateDatabase(mContext);
}
@@ -95,11 +95,14 @@
IllegalArgumentException.class,
() ->
mProvider.query(
- uri, /*strings=*/ null, /*s=*/ null, /*strings1=*/ null,
- /*s1=*/ null));
+ uri,
+ /* strings= */ null,
+ /* s= */ null,
+ /* strings1= */ null,
+ /* s1= */ null));
assertThrows(
IllegalArgumentException.class,
- () -> mProvider.insert(uri, /*contentValues=*/ null));
+ () -> mProvider.insert(uri, /* contentValues= */ null));
}
@Test
@@ -116,11 +119,14 @@
IllegalArgumentException.class,
() ->
mProvider.query(
- uri, /*strings=*/ null, /*s=*/ null, /*strings1=*/ null,
- /*s1=*/ null));
+ uri,
+ /* strings= */ null,
+ /* s= */ null,
+ /* strings1= */ null,
+ /* s1= */ null));
assertThrows(
IllegalArgumentException.class,
- () -> mProvider.insert(uri, /*contentValues=*/ null));
+ () -> mProvider.insert(uri, /* contentValues= */ null));
}
@Test
@@ -128,7 +134,8 @@
mProvider.onCreate();
ContentValues values = new ContentValues();
values.put(BatteryEventEntity.KEY_TIMESTAMP, 10001L);
- values.put(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE,
+ values.put(
+ BatteryEventEntity.KEY_BATTERY_EVENT_TYPE,
BatteryEventType.FULL_CHARGED.getNumber());
values.put(BatteryEventEntity.KEY_BATTERY_LEVEL, 100);
mProvider.insert(DatabaseUtils.BATTERY_EVENT_URI, values);
@@ -263,15 +270,13 @@
public void insert_batteryState_returnsExpectedResult() {
mProvider.onCreate();
final DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
+ DeviceBatteryState.newBuilder()
.setBatteryLevel(51)
.setBatteryStatus(2)
.setBatteryHealth(3)
.build();
final BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
+ BatteryInformation.newBuilder()
.setDeviceBatteryState(deviceBatteryState)
.setAppLabel("Settings")
.setIsHidden(true)
@@ -318,17 +323,13 @@
public void insert_partialFieldsContentValues_returnsExpectedResult() {
mProvider.onCreate();
final DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
+ DeviceBatteryState.newBuilder()
.setBatteryLevel(52)
.setBatteryStatus(3)
.setBatteryHealth(2)
.build();
final BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
- .setDeviceBatteryState(deviceBatteryState)
- .build();
+ BatteryInformation.newBuilder().setDeviceBatteryState(deviceBatteryState).build();
final String expectedBatteryInformationString =
ConvertUtils.convertBatteryInformationToString(batteryInformation);
final ContentValues values = new ContentValues();
@@ -381,7 +382,8 @@
mProvider.onCreate();
ContentValues values = new ContentValues();
values.put(BatteryEventEntity.KEY_TIMESTAMP, 10001L);
- values.put(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE,
+ values.put(
+ BatteryEventEntity.KEY_BATTERY_EVENT_TYPE,
BatteryEventType.POWER_CONNECTED.getNumber());
values.put(BatteryEventEntity.KEY_BATTERY_LEVEL, 66);
@@ -393,24 +395,26 @@
BatteryStateDatabase.getInstance(mContext).batteryEventDao().getAll();
assertThat(entities).hasSize(1);
assertThat(entities.get(0).timestamp).isEqualTo(10001L);
- assertThat(entities.get(0).batteryEventType).isEqualTo(
- BatteryEventType.POWER_CONNECTED.getNumber());
+ assertThat(entities.get(0).batteryEventType)
+ .isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber());
assertThat(entities.get(0).batteryLevel).isEqualTo(66);
- final Cursor cursor1 = getCursorOfBatteryEvents(
- 0L, List.of(BatteryEventType.POWER_CONNECTED.getNumber()));
+ final Cursor cursor1 =
+ getCursorOfBatteryEvents(0L, List.of(BatteryEventType.POWER_CONNECTED.getNumber()));
assertThat(cursor1.getCount()).isEqualTo(1);
cursor1.moveToFirst();
assertThat(cursor1.getLong(cursor1.getColumnIndex(BatteryEventEntity.KEY_TIMESTAMP)))
.isEqualTo(10001L);
assertThat(
- cursor1.getInt(cursor1.getColumnIndex(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)))
+ cursor1.getInt(
+ cursor1.getColumnIndex(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)))
.isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber());
assertThat(cursor1.getInt(cursor1.getColumnIndex(BatteryEventEntity.KEY_BATTERY_LEVEL)))
.isEqualTo(66);
- final Cursor cursor2 = getCursorOfBatteryEvents(
- 0L, List.of(BatteryEventType.POWER_DISCONNECTED.getNumber()));
+ final Cursor cursor2 =
+ getCursorOfBatteryEvents(
+ 0L, List.of(BatteryEventType.POWER_DISCONNECTED.getNumber()));
assertThat(cursor2.getCount()).isEqualTo(0);
}
@@ -435,8 +439,11 @@
cursor1.moveToFirst();
assertThat(cursor1.getLong(cursor1.getColumnIndex(BatteryUsageSlotEntity.KEY_TIMESTAMP)))
.isEqualTo(10001L);
- assertThat(cursor1.getString(cursor1.getColumnIndex(
- BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT))).isEqualTo("TEST_STRING");
+ assertThat(
+ cursor1.getString(
+ cursor1.getColumnIndex(
+ BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT)))
+ .isEqualTo("TEST_STRING");
final Cursor cursor2 = getCursorOfBatteryUsageSlots(10002L);
assertThat(cursor2.getCount()).isEqualTo(0);
@@ -446,7 +453,7 @@
public void delete_throwsUnsupportedOperationException() {
assertThrows(
UnsupportedOperationException.class,
- () -> mProvider.delete(/*uri=*/ null, /*s=*/ null, /*strings=*/ null));
+ () -> mProvider.delete(/* uri= */ null, /* s= */ null, /* strings= */ null));
}
@Test
@@ -455,13 +462,13 @@
UnsupportedOperationException.class,
() ->
mProvider.update(
- /*uri=*/ null, /*contentValues=*/ null, /*s=*/ null,
- /*strings=*/ null));
+ /* uri= */ null,
+ /* contentValues= */ null,
+ /* s= */ null,
+ /* strings= */ null));
}
- private Cursor insertBatteryState(
- Duration currentTime,
- String queryTimestamp)
+ private Cursor insertBatteryState(Duration currentTime, String queryTimestamp)
throws Exception {
mProvider.onCreate();
final FakeClock fakeClock = new FakeClock();
@@ -470,20 +477,17 @@
final long currentTimestamp = currentTime.toMillis();
// Inserts some valid testing data.
BatteryTestUtils.insertDataToBatteryStateTable(
- mContext, currentTimestamp - 6, PACKAGE_NAME1,
- /*isFullChargeStart=*/ true);
+ mContext, currentTimestamp - 6, PACKAGE_NAME1, /* isFullChargeStart= */ true);
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, currentTimestamp - 2, PACKAGE_NAME2);
- BatteryTestUtils.insertDataToBatteryStateTable(
- mContext, currentTimestamp, PACKAGE_NAME3);
+ BatteryTestUtils.insertDataToBatteryStateTable(mContext, currentTimestamp, PACKAGE_NAME3);
final Uri batteryStateQueryContentUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(DatabaseUtils.AUTHORITY)
.appendPath(DatabaseUtils.BATTERY_STATE_TABLE)
- .appendQueryParameter(
- DatabaseUtils.QUERY_KEY_TIMESTAMP, queryTimestamp)
+ .appendQueryParameter(DatabaseUtils.QUERY_KEY_TIMESTAMP, queryTimestamp)
.build();
final Cursor cursor = query(batteryStateQueryContentUri);
@@ -532,17 +536,17 @@
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(DatabaseUtils.AUTHORITY)
.appendPath(DatabaseUtils.APP_USAGE_LATEST_TIMESTAMP_PATH)
- .appendQueryParameter(
- DatabaseUtils.QUERY_KEY_USERID, Long.toString(userId))
+ .appendQueryParameter(DatabaseUtils.QUERY_KEY_USERID, Long.toString(userId))
.build();
return query(appUsageLatestTimestampQueryContentUri);
}
private Cursor getCursorOfAppUsage(final List<Long> userIds, final long queryTimestamp) {
- final String queryUserIdString = userIds.stream()
- .map(userId -> String.valueOf(userId))
- .collect(Collectors.joining(","));
+ final String queryUserIdString =
+ userIds.stream()
+ .map(userId -> String.valueOf(userId))
+ .collect(Collectors.joining(","));
final Uri appUsageEventUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
@@ -558,9 +562,10 @@
private Cursor getCursorOfBatteryEvents(
final long queryTimestamp, final List<Integer> batteryEventTypes) {
- final String batteryEventTypesString = batteryEventTypes.stream()
- .map(type -> String.valueOf(type))
- .collect(Collectors.joining(","));
+ final String batteryEventTypesString =
+ batteryEventTypes.stream()
+ .map(type -> String.valueOf(type))
+ .collect(Collectors.joining(","));
final Uri batteryEventUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
@@ -590,6 +595,6 @@
private Cursor query(Uri uri) {
return mProvider.query(
- uri, /*strings=*/ null, /*s=*/ null, /*strings1=*/ null, /*s1=*/ null);
+ uri, /* strings= */ null, /* s= */ null, /* strings1= */ null, /* s1= */ null);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoaderTest.java
index f3965fd..723a138 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoaderTest.java
@@ -52,28 +52,22 @@
public final class BatteryUsageDataLoaderTest {
private Context mContext;
- @Mock
- private ContentResolver mMockContentResolver;
- @Mock
- private BatteryStatsManager mBatteryStatsManager;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private UserManager mUserManager;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
- @Mock
- private BatteryEntry mMockBatteryEntry;
- @Captor
- private ArgumentCaptor<BatteryUsageStatsQuery> mStatsQueryCaptor;
+ @Mock private ContentResolver mMockContentResolver;
+ @Mock private BatteryStatsManager mBatteryStatsManager;
+ @Mock private PackageManager mPackageManager;
+ @Mock private UserManager mUserManager;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryEntry mMockBatteryEntry;
+ @Captor private ArgumentCaptor<BatteryUsageStatsQuery> mStatsQueryCaptor;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();
- doReturn(mBatteryStatsManager).when(mContext).getSystemService(
- Context.BATTERY_STATS_SERVICE);
+ doReturn(mBatteryStatsManager)
+ .when(mContext)
+ .getSystemService(Context.BATTERY_STATS_SERVICE);
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(mMockContentResolver).when(mContext).getContentResolver();
@@ -88,11 +82,10 @@
.thenReturn(mBatteryUsageStats);
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> batteryEntryList;
- BatteryUsageDataLoader.loadBatteryStatsData(mContext, /*isFullChargeStart=*/ false);
+ BatteryUsageDataLoader.loadBatteryStatsData(mContext, /* isFullChargeStart= */ false);
final int queryFlags = mStatsQueryCaptor.getValue().getFlags();
- assertThat(queryFlags
- & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY)
+ assertThat(queryFlags & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY)
.isNotEqualTo(0);
verify(mMockContentResolver).insert(any(), any());
}
@@ -103,7 +96,7 @@
.thenReturn(mBatteryUsageStats);
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> null;
- BatteryUsageDataLoader.loadBatteryStatsData(mContext, /*isFullChargeStart=*/ false);
+ BatteryUsageDataLoader.loadBatteryStatsData(mContext, /* isFullChargeStart= */ false);
verify(mMockContentResolver).insert(any(), any());
}
@@ -114,7 +107,7 @@
.thenReturn(mBatteryUsageStats);
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> new ArrayList<>();
- BatteryUsageDataLoader.loadBatteryStatsData(mContext, /*isFullChargeStart=*/ false);
+ BatteryUsageDataLoader.loadBatteryStatsData(mContext, /* isFullChargeStart= */ false);
verify(mMockContentResolver).insert(any(), any());
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoaderTest.java
index 1d0bca4..2932209 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageStatsLoaderTest.java
@@ -39,25 +39,23 @@
@RunWith(RobolectricTestRunner.class)
public class BatteryUsageStatsLoaderTest {
private Context mContext;
- @Mock
- private BatteryStatsManager mBatteryStatsManager;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
- @Captor
- private ArgumentCaptor<BatteryUsageStatsQuery> mUsageStatsQueryCaptor;
+ @Mock private BatteryStatsManager mBatteryStatsManager;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
+ @Captor private ArgumentCaptor<BatteryUsageStatsQuery> mUsageStatsQueryCaptor;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- doReturn(mBatteryStatsManager).when(mContext).getSystemService(
- Context.BATTERY_STATS_SERVICE);
+ doReturn(mBatteryStatsManager)
+ .when(mContext)
+ .getSystemService(Context.BATTERY_STATS_SERVICE);
}
@Test
public void testLoadInBackground_loadWithoutHistory() {
- BatteryUsageStatsLoader loader = new BatteryUsageStatsLoader(
- mContext, /* includeBatteryHistory */ false);
+ BatteryUsageStatsLoader loader =
+ new BatteryUsageStatsLoader(mContext, /* includeBatteryHistory */ false);
when(mBatteryStatsManager.getBatteryUsageStats(mUsageStatsQueryCaptor.capture()))
.thenReturn(mBatteryUsageStats);
@@ -65,14 +63,14 @@
loader.loadInBackground();
final int queryFlags = mUsageStatsQueryCaptor.getValue().getFlags();
- assertThat(queryFlags
- & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY).isEqualTo(0);
+ assertThat(queryFlags & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY)
+ .isEqualTo(0);
}
@Test
public void testLoadInBackground_loadWithHistory() {
- BatteryUsageStatsLoader loader = new BatteryUsageStatsLoader(
- mContext, /* includeBatteryHistory */ true);
+ BatteryUsageStatsLoader loader =
+ new BatteryUsageStatsLoader(mContext, /* includeBatteryHistory */ true);
when(mBatteryStatsManager.getBatteryUsageStats(mUsageStatsQueryCaptor.capture()))
.thenReturn(mBatteryUsageStats);
@@ -80,7 +78,7 @@
loader.loadInBackground();
final int queryFlags = mUsageStatsQueryCaptor.getValue().getFlags();
- assertThat(queryFlags
- & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY).isNotEqualTo(0);
+ assertThat(queryFlags & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY)
+ .isNotEqualTo(0);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java
index 566df52..118c3ed 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BootBroadcastReceiverTest.java
@@ -88,7 +88,8 @@
final SharedPreferences sharedPreferences = DatabaseUtils.getSharedPreferences(mContext);
sharedPreferences
.edit()
- .putInt(DatabaseUtils.KEY_LAST_USAGE_SOURCE,
+ .putInt(
+ DatabaseUtils.KEY_LAST_USAGE_SOURCE,
UsageStatsManager.USAGE_SOURCE_CURRENT_ACTIVITY)
.apply();
@@ -96,9 +97,8 @@
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNotNull();
assertThat(
- DatabaseUtils
- .getSharedPreferences(mContext)
- .contains(DatabaseUtils.KEY_LAST_USAGE_SOURCE))
+ DatabaseUtils.getSharedPreferences(mContext)
+ .contains(DatabaseUtils.KEY_LAST_USAGE_SOURCE))
.isFalse();
}
@@ -124,7 +124,7 @@
@Test
public void onReceive_nullIntent_notRefreshesJob() {
- mReceiver.onReceive(mContext, /*intent=*/ null);
+ mReceiver.onReceive(mContext, /* intent= */ null);
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull();
}
@@ -142,11 +142,10 @@
public void invokeJobRecheck_broadcastsIntent() {
BootBroadcastReceiver.invokeJobRecheck(mContext);
- final List<Intent> intents =
- Shadows.shadowOf((Application) mContext).getBroadcastIntents();
+ final List<Intent> intents = Shadows.shadowOf((Application) mContext).getBroadcastIntents();
assertThat(intents).hasSize(1);
- assertThat(intents.get(0).getAction()).isEqualTo(
- BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
+ assertThat(intents.get(0).getAction())
+ .isEqualTo(BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
}
private void clearSharedPreferences() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
index c648cde..672bc54 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
@@ -61,14 +61,10 @@
private Context mContext;
- @Mock
- private PackageManager mMockPackageManager;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
- @Mock
- private BatteryEntry mMockBatteryEntry;
- @Mock
- private IUsageStatsManager mUsageStatsManager;
+ @Mock private PackageManager mMockPackageManager;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
+ @Mock private BatteryEntry mMockBatteryEntry;
+ @Mock private IUsageStatsManager mUsageStatsManager;
@Before
public void setUp() {
@@ -104,12 +100,12 @@
ConvertUtils.convertBatteryEntryToContentValues(
mMockBatteryEntry,
mBatteryUsageStats,
- /*batteryLevel=*/ 12,
- /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
- /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
- /*bootTimestamp=*/ 101L,
- /*timestamp=*/ 10001L,
- /*isFullChargeStart=*/ true);
+ /* batteryLevel= */ 12,
+ /* batteryStatus= */ BatteryManager.BATTERY_STATUS_FULL,
+ /* batteryHealth= */ BatteryManager.BATTERY_HEALTH_COLD,
+ /* bootTimestamp= */ 101L,
+ /* timestamp= */ 10001L,
+ /* isFullChargeStart= */ true);
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
@@ -150,8 +146,8 @@
when(mMockBatteryEntry.getUid()).thenReturn(-1);
when(mMockBatteryEntry.getLabel()).thenReturn("CPU");
when(mMockBatteryEntry.getDefaultPackageName()).thenReturn(null);
- when(mMockBatteryEntry.getPowerComponentId()).thenReturn(
- BatteryConsumer.POWER_COMPONENT_CPU);
+ when(mMockBatteryEntry.getPowerComponentId())
+ .thenReturn(BatteryConsumer.POWER_COMPONENT_CPU);
when(mBatteryUsageStats.getConsumedPower()).thenReturn(5.1);
when(mMockBatteryEntry.getConsumedPower()).thenReturn(1.1);
when(mMockBatteryEntry.getConsumedPowerInForeground()).thenReturn(1.2);
@@ -168,12 +164,12 @@
ConvertUtils.convertBatteryEntryToContentValues(
mMockBatteryEntry,
mBatteryUsageStats,
- /*batteryLevel=*/ 12,
- /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
- /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
- /*bootTimestamp=*/ 101L,
- /*timestamp=*/ 10001L,
- /*isFullChargeStart=*/ true);
+ /* batteryLevel= */ 12,
+ /* batteryStatus= */ BatteryManager.BATTERY_STATUS_FULL,
+ /* batteryHealth= */ BatteryManager.BATTERY_HEALTH_COLD,
+ /* bootTimestamp= */ 101L,
+ /* timestamp= */ 10001L,
+ /* isFullChargeStart= */ true);
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
@@ -200,8 +196,8 @@
assertThat(batteryInformation.getPercentOfTotal()).isEqualTo(0.3);
assertThat(batteryInformation.getForegroundUsageTimeInMs()).isEqualTo(1234L);
assertThat(batteryInformation.getBackgroundUsageTimeInMs()).isEqualTo(5689L);
- assertThat(batteryInformation.getDrainType()).isEqualTo(
- BatteryConsumer.POWER_COMPONENT_CPU);
+ assertThat(batteryInformation.getDrainType())
+ .isEqualTo(BatteryConsumer.POWER_COMPONENT_CPU);
assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
assertThat(deviceBatteryState.getBatteryStatus())
.isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
@@ -213,14 +209,14 @@
public void convertBatteryEntryToContentValues_nullBatteryEntry_returnsExpectedContentValues() {
final ContentValues values =
ConvertUtils.convertBatteryEntryToContentValues(
- /*entry=*/ null,
- /*batteryUsageStats=*/ null,
- /*batteryLevel=*/ 12,
- /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
- /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
- /*bootTimestamp=*/ 101L,
- /*timestamp=*/ 10001L,
- /*isFullChargeStart=*/ false);
+ /* entry= */ null,
+ /* batteryUsageStats= */ null,
+ /* batteryLevel= */ 12,
+ /* batteryStatus= */ BatteryManager.BATTERY_STATUS_FULL,
+ /* batteryHealth= */ BatteryManager.BATTERY_HEALTH_COLD,
+ /* bootTimestamp= */ 101L,
+ /* timestamp= */ 10001L,
+ /* isFullChargeStart= */ false);
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
@@ -234,8 +230,7 @@
.isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
assertThat(deviceBatteryState.getBatteryHealth())
.isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
- assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP))
- .isEqualTo(10001L);
+ assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP)).isEqualTo(10001L);
assertThat(values.getAsString(BatteryHistEntry.KEY_PACKAGE_NAME))
.isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
}
@@ -273,11 +268,10 @@
.setType(BatteryEventType.POWER_CONNECTED)
.setBatteryLevel(66)
.build();
- final ContentValues values =
- ConvertUtils.convertBatteryEventToContentValues(batteryEvent);
+ final ContentValues values = ConvertUtils.convertBatteryEventToContentValues(batteryEvent);
assertThat(values.getAsLong(BatteryEventEntity.KEY_TIMESTAMP)).isEqualTo(10001L);
- assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)).isEqualTo(
- BatteryEventType.POWER_CONNECTED.getNumber());
+ assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE))
+ .isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber());
assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL)).isEqualTo(66);
}
@@ -302,8 +296,7 @@
final int expectedType = 3;
when(mMockBatteryEntry.getUid()).thenReturn(1001);
when(mMockBatteryEntry.getLabel()).thenReturn("Settings");
- when(mMockBatteryEntry.getDefaultPackageName())
- .thenReturn("com.android.settings.battery");
+ when(mMockBatteryEntry.getDefaultPackageName()).thenReturn("com.android.settings.battery");
when(mMockBatteryEntry.isHidden()).thenReturn(true);
when(mBatteryUsageStats.getConsumedPower()).thenReturn(5.1);
when(mMockBatteryEntry.getConsumedPower()).thenReturn(1.1);
@@ -319,23 +312,16 @@
.thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
final BatteryHistEntry batteryHistEntry =
- ConvertUtils.convertToBatteryHistEntry(
- mMockBatteryEntry,
- mBatteryUsageStats);
+ ConvertUtils.convertToBatteryHistEntry(mMockBatteryEntry, mBatteryUsageStats);
assertThat(batteryHistEntry.mUid).isEqualTo(1001L);
- assertThat(batteryHistEntry.mUserId)
- .isEqualTo(UserHandle.getUserId(1001));
- assertThat(batteryHistEntry.mAppLabel)
- .isEqualTo("Settings");
- assertThat(batteryHistEntry.mPackageName)
- .isEqualTo("com.android.settings.battery");
+ assertThat(batteryHistEntry.mUserId).isEqualTo(UserHandle.getUserId(1001));
+ assertThat(batteryHistEntry.mAppLabel).isEqualTo("Settings");
+ assertThat(batteryHistEntry.mPackageName).isEqualTo("com.android.settings.battery");
assertThat(batteryHistEntry.mIsHidden).isTrue();
- assertThat(batteryHistEntry.mBootTimestamp)
- .isEqualTo(0L);
+ assertThat(batteryHistEntry.mBootTimestamp).isEqualTo(0L);
assertThat(batteryHistEntry.mTimestamp).isEqualTo(0L);
- assertThat(batteryHistEntry.mZoneId)
- .isEqualTo(TimeZone.getDefault().getID());
+ assertThat(batteryHistEntry.mZoneId).isEqualTo(TimeZone.getDefault().getID());
assertThat(batteryHistEntry.mTotalPower).isEqualTo(5.1);
assertThat(batteryHistEntry.mConsumePower).isEqualTo(1.1);
assertThat(batteryHistEntry.mForegroundUsageConsumePower).isEqualTo(1.2);
@@ -343,10 +329,8 @@
assertThat(batteryHistEntry.mBackgroundUsageConsumePower).isEqualTo(1.4);
assertThat(batteryHistEntry.mCachedUsageConsumePower).isEqualTo(1.5);
assertThat(batteryHistEntry.mPercentOfTotal).isEqualTo(0.3);
- assertThat(batteryHistEntry.mForegroundUsageTimeInMs)
- .isEqualTo(1234L);
- assertThat(batteryHistEntry.mBackgroundUsageTimeInMs)
- .isEqualTo(5689L);
+ assertThat(batteryHistEntry.mForegroundUsageTimeInMs).isEqualTo(1234L);
+ assertThat(batteryHistEntry.mBackgroundUsageTimeInMs).isEqualTo(5689L);
assertThat(batteryHistEntry.mDrainType).isEqualTo(expectedType);
assertThat(batteryHistEntry.mConsumerType)
.isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
@@ -359,20 +343,15 @@
public void convertToBatteryHistEntry_nullBatteryEntry_returnsExpectedResult() {
final BatteryHistEntry batteryHistEntry =
ConvertUtils.convertToBatteryHistEntry(
- /*entry=*/ null,
- /*batteryUsageStats=*/ null);
+ /* entry= */ null, /* batteryUsageStats= */ null);
- assertThat(batteryHistEntry.mBootTimestamp)
- .isEqualTo(0L);
- assertThat(batteryHistEntry.mTimestamp)
- .isEqualTo(0);
- assertThat(batteryHistEntry.mZoneId)
- .isEqualTo(TimeZone.getDefault().getID());
+ assertThat(batteryHistEntry.mBootTimestamp).isEqualTo(0L);
+ assertThat(batteryHistEntry.mTimestamp).isEqualTo(0);
+ assertThat(batteryHistEntry.mZoneId).isEqualTo(TimeZone.getDefault().getID());
assertThat(batteryHistEntry.mBatteryLevel).isEqualTo(0);
assertThat(batteryHistEntry.mBatteryStatus).isEqualTo(0);
assertThat(batteryHistEntry.mBatteryHealth).isEqualTo(0);
- assertThat(batteryHistEntry.mPackageName)
- .isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
+ assertThat(batteryHistEntry.mPackageName).isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
}
@Test
@@ -387,8 +366,8 @@
when(mMockPackageManager.getPackageUidAsUser(any(), anyInt())).thenReturn(1001);
final long userId = 2;
- final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(
- mContext, mUsageStatsManager, event, userId);
+ final AppUsageEvent appUsageEvent =
+ ConvertUtils.convertToAppUsageEvent(mContext, mUsageStatsManager, event, userId);
assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L);
assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.ACTIVITY_RESUMED);
assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1");
@@ -426,14 +405,14 @@
final AppUsageEvent appUsageEvent =
ConvertUtils.convertToAppUsageEvent(
- mContext, mUsageStatsManager, event, /*userId=*/ 0);
+ mContext, mUsageStatsManager, event, /* userId= */ 0);
assertThat(appUsageEvent).isNull();
}
@Test
public void convertToAppUsageEvent_failToGetUid_returnsNull()
- throws PackageManager.NameNotFoundException {
+ throws PackageManager.NameNotFoundException {
final Event event = new Event();
event.mEventType = UsageEvents.Event.DEVICE_SHUTDOWN;
event.mPackage = "com.android.settings1";
@@ -449,24 +428,27 @@
@Test
public void convertToAppUsageEvent_returnExpectedResult() {
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_UID,
- AppUsageEventEntity.KEY_USER_ID,
- AppUsageEventEntity.KEY_PACKAGE_NAME,
- AppUsageEventEntity.KEY_TIMESTAMP,
- AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE,
- AppUsageEventEntity.KEY_TASK_ROOT_PACKAGE_NAME,
- AppUsageEventEntity.KEY_INSTANCE_ID});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_UID,
+ AppUsageEventEntity.KEY_USER_ID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_TIMESTAMP,
+ AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE,
+ AppUsageEventEntity.KEY_TASK_ROOT_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_INSTANCE_ID
+ });
cursor.addRow(
- new Object[]{
- 101L,
- 1001L,
- "com.android.settings1",
- 10001L,
- AppUsageEventType.DEVICE_SHUTDOWN.getNumber(),
- "com.android.settings2",
- 100001L});
+ new Object[] {
+ 101L,
+ 1001L,
+ "com.android.settings1",
+ 10001L,
+ AppUsageEventType.DEVICE_SHUTDOWN.getNumber(),
+ "com.android.settings2",
+ 100001L
+ });
cursor.moveToFirst();
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(cursor);
@@ -482,20 +464,23 @@
@Test
public void convertToAppUsageEvent_emptyInstanceIdAndRootName_returnExpectedResult() {
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_UID,
- AppUsageEventEntity.KEY_USER_ID,
- AppUsageEventEntity.KEY_PACKAGE_NAME,
- AppUsageEventEntity.KEY_TIMESTAMP,
- AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_UID,
+ AppUsageEventEntity.KEY_USER_ID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_TIMESTAMP,
+ AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE
+ });
cursor.addRow(
- new Object[]{
- 101L,
- 1001L,
- "com.android.settings1",
- 10001L,
- AppUsageEventType.DEVICE_SHUTDOWN.getNumber()});
+ new Object[] {
+ 101L,
+ 1001L,
+ "com.android.settings1",
+ 10001L,
+ AppUsageEventType.DEVICE_SHUTDOWN.getNumber()
+ });
cursor.moveToFirst();
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(cursor);
@@ -511,8 +496,8 @@
@Test
public void convertToBatteryEvent_normalCase_returnsExpectedResult() {
- final BatteryEvent batteryEvent = ConvertUtils.convertToBatteryEvent(
- 666L, BatteryEventType.POWER_DISCONNECTED, 88);
+ final BatteryEvent batteryEvent =
+ ConvertUtils.convertToBatteryEvent(666L, BatteryEventType.POWER_DISCONNECTED, 88);
assertThat(batteryEvent.getTimestamp()).isEqualTo(666L);
assertThat(batteryEvent.getType()).isEqualTo(BatteryEventType.POWER_DISCONNECTED);
assertThat(batteryEvent.getBatteryLevel()).isEqualTo(88);
@@ -520,8 +505,9 @@
@Test
public void convertToBatteryEventList_normalCase_returnsExpectedResult() {
- final BatteryLevelData batteryLevelData = new BatteryLevelData(Map.of(
- 1691589600000L, 98, 1691596800000L, 90, 1691596812345L, 80));
+ final BatteryLevelData batteryLevelData =
+ new BatteryLevelData(
+ Map.of(1691589600000L, 98, 1691596800000L, 90, 1691596812345L, 80));
final List<BatteryEvent> batteryEventList =
ConvertUtils.convertToBatteryEventList(batteryLevelData);
@@ -537,14 +523,20 @@
@Test
public void convertToBatteryUsageSlotList_normalCase_returnsExpectedResult() {
- BatteryDiffData batteryDiffData1 = new BatteryDiffData(
- mContext, 11L, 12L, 13, 14, 15, List.of(), List.of(), Set.of(), Set.of(), false);
- BatteryDiffData batteryDiffData2 = new BatteryDiffData(
- mContext, 21L, 22L, 23, 24, 25, List.of(), List.of(), Set.of(), Set.of(), false);
- BatteryDiffData batteryDiffData3 = new BatteryDiffData(
- mContext, 31L, 32L, 33, 34, 35, List.of(), List.of(), Set.of(), Set.of(), false);
- final Map<Long, BatteryDiffData> batteryDiffDataMap = Map.of(
- 11L, batteryDiffData1, 21L, batteryDiffData2, 31L, batteryDiffData3);
+ BatteryDiffData batteryDiffData1 =
+ new BatteryDiffData(
+ mContext, 11L, 12L, 13, 14, 15, List.of(), List.of(), Set.of(), Set.of(),
+ false);
+ BatteryDiffData batteryDiffData2 =
+ new BatteryDiffData(
+ mContext, 21L, 22L, 23, 24, 25, List.of(), List.of(), Set.of(), Set.of(),
+ false);
+ BatteryDiffData batteryDiffData3 =
+ new BatteryDiffData(
+ mContext, 31L, 32L, 33, 34, 35, List.of(), List.of(), Set.of(), Set.of(),
+ false);
+ final Map<Long, BatteryDiffData> batteryDiffDataMap =
+ Map.of(11L, batteryDiffData1, 21L, batteryDiffData2, 31L, batteryDiffData3);
final List<BatteryUsageSlot> batteryUsageSlotList =
ConvertUtils.convertToBatteryUsageSlotList(batteryDiffDataMap);
@@ -556,8 +548,7 @@
@Test
public void getLocale_nullContext_returnDefaultLocale() {
- assertThat(ConvertUtils.getLocale(/*context=*/ null))
- .isEqualTo(Locale.getDefault());
+ assertThat(ConvertUtils.getLocale(/* context= */ null)).isEqualTo(Locale.getDefault());
}
@Test
@@ -578,8 +569,9 @@
final String packageName = "com.android.settings1";
final String taskRootPackageName = "com.android.settings2";
- assertThat(ConvertUtils.getEffectivePackageName(
- mContext, mUsageStatsManager, packageName, taskRootPackageName))
+ assertThat(
+ ConvertUtils.getEffectivePackageName(
+ mContext, mUsageStatsManager, packageName, taskRootPackageName))
.isEqualTo(packageName);
}
@@ -588,8 +580,9 @@
final String packageName = "com.android.settings1";
final String taskRootPackageName = "com.android.settings2";
- assertThat(ConvertUtils.getEffectivePackageName(
- mContext, mUsageStatsManager, packageName, taskRootPackageName))
+ assertThat(
+ ConvertUtils.getEffectivePackageName(
+ mContext, mUsageStatsManager, packageName, taskRootPackageName))
.isEqualTo(packageName);
}
@@ -599,8 +592,9 @@
final String packageName = "com.android.settings1";
final String taskRootPackageName = "com.android.settings2";
- assertThat(ConvertUtils.getEffectivePackageName(
- mContext, mUsageStatsManager, packageName, taskRootPackageName))
+ assertThat(
+ ConvertUtils.getEffectivePackageName(
+ mContext, mUsageStatsManager, packageName, taskRootPackageName))
.isEqualTo(taskRootPackageName);
}
@@ -609,11 +603,19 @@
ConvertUtils.sUsageSource = USAGE_SOURCE_TASK_ROOT_ACTIVITY;
final String packageName = "com.android.settings1";
- assertThat(ConvertUtils.getEffectivePackageName(
- mContext, mUsageStatsManager, packageName, /*taskRootPackageName=*/ null))
+ assertThat(
+ ConvertUtils.getEffectivePackageName(
+ mContext,
+ mUsageStatsManager,
+ packageName,
+ /* taskRootPackageName= */ null))
.isEqualTo(packageName);
- assertThat(ConvertUtils.getEffectivePackageName(
- mContext, mUsageStatsManager, packageName, /*taskRootPackageName=*/ ""))
+ assertThat(
+ ConvertUtils.getEffectivePackageName(
+ mContext,
+ mUsageStatsManager,
+ packageName,
+ /* taskRootPackageName= */ ""))
.isEqualTo(packageName);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java
index 601d3f3..6227790 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java
@@ -70,18 +70,12 @@
private Context mContext;
private DataProcessManager mDataProcessManager;
- @Mock
- private IUsageStatsManager mUsageStatsManager;
- @Mock
- private UserManager mUserManager;
- @Mock
- private BatteryStatsManager mBatteryStatsManager;
- @Mock
- private BatteryUsageStats mBatteryUsageStats;
- @Mock
- private Intent mIntent;
- @Captor
- private ArgumentCaptor<BatteryUsageStatsQuery> mBatteryUsageStatsQueryCaptor;
+ @Mock private IUsageStatsManager mUsageStatsManager;
+ @Mock private UserManager mUserManager;
+ @Mock private BatteryStatsManager mBatteryStatsManager;
+ @Mock private BatteryUsageStats mBatteryUsageStats;
+ @Mock private Intent mIntent;
+ @Captor private ArgumentCaptor<BatteryUsageStatsQuery> mBatteryUsageStatsQueryCaptor;
@Before
public void setUp() {
@@ -91,22 +85,26 @@
DataProcessor.sTestSystemAppsPackageNames = Set.of();
DataProcessor.sUsageStatsManager = mUsageStatsManager;
doReturn(mContext).when(mContext).getApplicationContext();
- doReturn(mUserManager)
+ doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
+ doReturn(mBatteryStatsManager)
.when(mContext)
- .getSystemService(UserManager.class);
- doReturn(mBatteryStatsManager).when(mContext).getSystemService(
- Context.BATTERY_STATS_SERVICE);
- doReturn(mBatteryUsageStats).when(
- mBatteryStatsManager).getBatteryUsageStats(mBatteryUsageStatsQueryCaptor.capture());
+ .getSystemService(Context.BATTERY_STATS_SERVICE);
+ doReturn(mBatteryUsageStats)
+ .when(mBatteryStatsManager)
+ .getBatteryUsageStats(mBatteryUsageStatsQueryCaptor.capture());
doReturn(mIntent).when(mContext).registerReceiver(any(), any());
doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt());
- mDataProcessManager = new DataProcessManager(
- mContext, /*handler=*/ null, /*rawStartTimestamp=*/ 0L,
- /*lastFullChargeTimestamp=*/ 0L, /*callbackFunction=*/ null,
- /*hourlyBatteryLevelsPerDay=*/ new ArrayList<>(),
- /*batteryHistoryMap=*/ new HashMap<>());
+ mDataProcessManager =
+ new DataProcessManager(
+ mContext,
+ /* handler= */ null,
+ /* rawStartTimestamp= */ 0L,
+ /* lastFullChargeTimestamp= */ 0L,
+ /* callbackFunction= */ null,
+ /* hourlyBatteryLevelsPerDay= */ new ArrayList<>(),
+ /* batteryHistoryMap= */ new HashMap<>());
}
@After
@@ -119,18 +117,20 @@
@LooperMode(LooperMode.Mode.LEGACY)
public void constructor_noLevelData() {
final DataProcessManager dataProcessManager =
- new DataProcessManager(mContext, /*handler=*/ null, /*callbackFunction=*/ null);
+ new DataProcessManager(mContext, /* handler= */ null, /* callbackFunction= */ null);
assertThat(dataProcessManager.getShowScreenOnTime()).isFalse();
}
@Test
@LooperMode(LooperMode.Mode.LEGACY)
public void start_loadEmptyDatabaseAppUsageData() {
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_UID,
- AppUsageEventEntity.KEY_PACKAGE_NAME,
- AppUsageEventEntity.KEY_TIMESTAMP});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_UID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_TIMESTAMP
+ });
DatabaseUtils.sFakeSupplier = () -> cursor;
doReturn(true).when(mUserManager).isUserUnlocked(anyInt());
@@ -166,9 +166,9 @@
new BatteryLevelData.PeriodBatteryLevelData(batteryLevelMap2, timestamps2));
// Fake current usage data.
final UsageEvents.Event event1 =
- getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1, packageName);
+ getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /* timestamp= */ 1, packageName);
final UsageEvents.Event event2 =
- getUsageEvent(UsageEvents.Event.ACTIVITY_STOPPED, /*timestamp=*/ 2, packageName);
+ getUsageEvent(UsageEvents.Event.ACTIVITY_STOPPED, /* timestamp= */ 2, packageName);
final List<UsageEvents.Event> events = new ArrayList<>();
events.add(event1);
events.add(event2);
@@ -182,40 +182,68 @@
doReturn(new ArrayList<>()).when(mUserManager).getUserProfiles();
// Fake database usage data.
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE,
- AppUsageEventEntity.KEY_TIMESTAMP,
- AppUsageEventEntity.KEY_USER_ID,
- AppUsageEventEntity.KEY_INSTANCE_ID,
- AppUsageEventEntity.KEY_PACKAGE_NAME
- });
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE,
+ AppUsageEventEntity.KEY_TIMESTAMP,
+ AppUsageEventEntity.KEY_USER_ID,
+ AppUsageEventEntity.KEY_INSTANCE_ID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME
+ });
// Adds fake data into the cursor.
- cursor.addRow(new Object[] {
- AppUsageEventType.ACTIVITY_RESUMED.getNumber(), /*timestamp=*/ 3, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName});
- cursor.addRow(new Object[] {
- AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 4, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName});
- cursor.addRow(new Object[] {
- AppUsageEventType.ACTIVITY_RESUMED.getNumber(), /*timestamp=*/ 5, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName});
- cursor.addRow(new Object[] {
- AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 6, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName});
- DatabaseUtils.sFakeSupplier = new Supplier<>() {
- private int mTimes = 0;
- @Override
- public Cursor get() {
- mTimes++;
- return mTimes <= 2 ? null : cursor;
- }
- };
+ cursor.addRow(
+ new Object[] {
+ AppUsageEventType.ACTIVITY_RESUMED.getNumber(),
+ /* timestamp= */ 3,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName
+ });
+ cursor.addRow(
+ new Object[] {
+ AppUsageEventType.ACTIVITY_STOPPED.getNumber(),
+ /* timestamp= */ 4,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName
+ });
+ cursor.addRow(
+ new Object[] {
+ AppUsageEventType.ACTIVITY_RESUMED.getNumber(),
+ /* timestamp= */ 5,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName
+ });
+ cursor.addRow(
+ new Object[] {
+ AppUsageEventType.ACTIVITY_STOPPED.getNumber(),
+ /* timestamp= */ 6,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName
+ });
+ DatabaseUtils.sFakeSupplier =
+ new Supplier<>() {
+ private int mTimes = 0;
- final DataProcessManager dataProcessManager = new DataProcessManager(
- mContext, /*handler=*/ null, /*rawStartTimestamp=*/ 2L,
- /*lastFullChargeTimestamp=*/ 1L, /*callbackFunction=*/ null,
- hourlyBatteryLevelsPerDay, /*batteryHistoryMap=*/ new HashMap<>());
+ @Override
+ public Cursor get() {
+ mTimes++;
+ return mTimes <= 2 ? null : cursor;
+ }
+ };
+
+ final DataProcessManager dataProcessManager =
+ new DataProcessManager(
+ mContext,
+ /* handler= */ null,
+ /* rawStartTimestamp= */ 2L,
+ /* lastFullChargeTimestamp= */ 1L,
+ /* callbackFunction= */ null,
+ hourlyBatteryLevelsPerDay,
+ /* batteryHistoryMap= */ new HashMap<>());
dataProcessManager.start();
assertThat(dataProcessManager.getIsCurrentAppUsageLoaded()).isTrue();
@@ -226,17 +254,17 @@
Collections.sort(appUsageEventList, DataProcessor.APP_USAGE_EVENT_TIMESTAMP_COMPARATOR);
assertThat(appUsageEventList.size()).isEqualTo(6);
assertAppUsageEvent(
- appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1);
+ appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 1);
assertAppUsageEvent(
- appUsageEventList.get(1), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2);
+ appUsageEventList.get(1), AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 2);
assertAppUsageEvent(
- appUsageEventList.get(2), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3);
+ appUsageEventList.get(2), AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 3);
assertAppUsageEvent(
- appUsageEventList.get(3), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4);
+ appUsageEventList.get(3), AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 4);
assertAppUsageEvent(
- appUsageEventList.get(4), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 5);
+ appUsageEventList.get(4), AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 5);
assertAppUsageEvent(
- appUsageEventList.get(5), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 6);
+ appUsageEventList.get(5), AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 6);
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
appUsagePeriodMap = dataProcessManager.getAppUsagePeriodMap();
@@ -267,18 +295,20 @@
@LooperMode(LooperMode.Mode.LEGACY)
public void start_currentUserLocked_emptyAppUsageList() throws RemoteException {
final UsageEvents.Event event =
- getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1, "package");
+ getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /* timestamp= */ 1, "package");
final List<UsageEvents.Event> events = new ArrayList<>();
events.add(event);
doReturn(getUsageEvents(events))
.when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), any());
doReturn(false).when(mUserManager).isUserUnlocked(anyInt());
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_UID,
- AppUsageEventEntity.KEY_PACKAGE_NAME,
- AppUsageEventEntity.KEY_TIMESTAMP});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_UID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_TIMESTAMP
+ });
// Adds fake data into the cursor.
cursor.addRow(new Object[] {101L, "app name1", 1001L});
DatabaseUtils.sFakeSupplier = () -> cursor;
@@ -293,25 +323,30 @@
@Test
@LooperMode(LooperMode.Mode.LEGACY)
public void getBatteryLevelData_emptyHistoryMap_returnNull() {
- assertThat(DataProcessManager.getBatteryLevelData(
- mContext,
- /*handler=*/ null,
- /*isFromPeriodJob=*/ false,
- /*asyncResponseDelegate=*/ null)).isNull();
- assertThat(DataProcessManager.getBatteryLevelData(
- mContext,
- /*handler=*/ null,
- /*isFromPeriodJob=*/ true,
- /*asyncResponseDelegate=*/ null)).isNull();
+ assertThat(
+ DataProcessManager.getBatteryLevelData(
+ mContext,
+ /* handler= */ null,
+ /* isFromPeriodJob= */ false,
+ /* asyncResponseDelegate= */ null))
+ .isNull();
+ assertThat(
+ DataProcessManager.getBatteryLevelData(
+ mContext,
+ /* handler= */ null,
+ /* isFromPeriodJob= */ true,
+ /* asyncResponseDelegate= */ null))
+ .isNull();
}
@Test
public void getBatteryLevelData_allDataInOneHour_returnExpectedResult() {
// The timestamps and the current time are within half hour before an even hour.
final long[] timestamps = {
- DateUtils.HOUR_IN_MILLIS * 2 - 300L,
- DateUtils.HOUR_IN_MILLIS * 2 - 200L,
- DateUtils.HOUR_IN_MILLIS * 2 - 100L};
+ DateUtils.HOUR_IN_MILLIS * 2 - 300L,
+ DateUtils.HOUR_IN_MILLIS * 2 - 200L,
+ DateUtils.HOUR_IN_MILLIS * 2 - 100L
+ };
final int[] levels = {100, 99, 98};
DataProcessManager.sFakeBatteryHistoryMap = createHistoryMap(timestamps, levels);
DataProcessor.sTestCurrentTimeMillis = timestamps[timestamps.length - 1];
@@ -319,13 +354,12 @@
final BatteryLevelData resultData =
DataProcessManager.getBatteryLevelData(
mContext,
- /*handler=*/ null,
- /*isFromPeriodJob=*/ false,
- /*asyncResponseDelegate=*/ null);
+ /* handler= */ null,
+ /* isFromPeriodJob= */ false,
+ /* asyncResponseDelegate= */ null);
- final List<Long> expectedDailyTimestamps = List.of(
- DateUtils.HOUR_IN_MILLIS * 2 - 300L,
- DateUtils.HOUR_IN_MILLIS * 2 - 100L);
+ final List<Long> expectedDailyTimestamps =
+ List.of(DateUtils.HOUR_IN_MILLIS * 2 - 300L, DateUtils.HOUR_IN_MILLIS * 2 - 100L);
final List<Integer> expectedDailyLevels = List.of(100, 66);
final List<List<Long>> expectedHourlyTimestamps = List.of(expectedDailyTimestamps);
final List<List<Integer>> expectedHourlyLevels = List.of(expectedDailyLevels);
@@ -348,13 +382,14 @@
final BatteryLevelData resultData =
DataProcessManager.getBatteryLevelData(
mContext,
- /*handler=*/ null,
- /*isFromPeriodJob=*/ false,
- /*asyncResponseDelegate=*/ null);
+ /* handler= */ null,
+ /* isFromPeriodJob= */ false,
+ /* asyncResponseDelegate= */ null);
- final List<Long> expectedDailyTimestamps = List.of(
- 1640966400000L, // 2022-01-01 00:00:00
- 1640970000000L); // 2022-01-01 01:00:00
+ final List<Long> expectedDailyTimestamps =
+ List.of(
+ 1640966400000L, // 2022-01-01 00:00:00
+ 1640970000000L); // 2022-01-01 01:00:00
final List<Integer> expectedDailyLevels = List.of(100, 66);
final List<List<Long>> expectedHourlyTimestamps = List.of(expectedDailyTimestamps);
final List<List<Integer>> expectedHourlyLevels = List.of(expectedDailyLevels);
@@ -400,16 +435,11 @@
private static ContentValues getContentValuesWithBatteryLevel(final int level) {
final ContentValues values = new ContentValues();
final DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
- .setBatteryLevel(level)
- .build();
+ DeviceBatteryState.newBuilder().setBatteryLevel(level).build();
final BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
- .setDeviceBatteryState(deviceBatteryState)
- .build();
- values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+ BatteryInformation.newBuilder().setDeviceBatteryState(deviceBatteryState).build();
+ values.put(
+ BatteryHistEntry.KEY_BATTERY_INFORMATION,
ConvertUtils.convertBatteryInformationToString(batteryInformation));
return values;
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
index 636a7a3..7a67240 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -98,18 +98,19 @@
DataProcessor.sTestSystemAppsPackageNames = Set.of();
DataProcessor.sUsageStatsManager = mUsageStatsManager;
- doReturn(mIntent).when(mContext).registerReceiver(
- isA(BroadcastReceiver.class), isA(IntentFilter.class));
+ doReturn(mIntent)
+ .when(mContext)
+ .registerReceiver(isA(BroadcastReceiver.class), isA(IntentFilter.class));
doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt());
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
- doReturn(new int[]{0}).when(mUserManager).getProfileIdsWithDisabled(anyInt());
+ doReturn(new int[] {0}).when(mUserManager).getProfileIdsWithDisabled(anyInt());
}
@Test
public void getAppUsageEvents_returnExpectedResult() throws RemoteException {
- UserInfo userInfo = new UserInfo(/*id=*/ 0, "user_0", /*flags=*/ 0);
+ UserInfo userInfo = new UserInfo(/* id= */ 0, "user_0", /* flags= */ 0);
final List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(userInfo);
doReturn(userInfoList).when(mUserManager).getAliveUsers();
@@ -126,7 +127,7 @@
@Test
public void getAppUsageEvents_lockedUser_returnNull() {
- UserInfo userInfo = new UserInfo(/*id=*/ 0, "user_0", /*flags=*/ 0);
+ UserInfo userInfo = new UserInfo(/* id= */ 0, "user_0", /* flags= */ 0);
final List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(userInfo);
doReturn(userInfoList).when(mUserManager).getAliveUsers();
@@ -140,12 +141,13 @@
@Test
public void getAppUsageEvents_nullUsageEvents_returnNull() throws RemoteException {
- UserInfo userInfo = new UserInfo(/*id=*/ 0, "user_0", /*flags=*/ 0);
+ UserInfo userInfo = new UserInfo(/* id= */ 0, "user_0", /* flags= */ 0);
final List<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(userInfo);
doReturn(userInfoList).when(mUserManager).getAliveUsers();
doReturn(true).when(mUserManager).isUserUnlocked(userInfo.id);
- doReturn(null).when(mUsageStatsManager)
+ doReturn(null)
+ .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString());
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext);
@@ -178,7 +180,8 @@
public void getAppUsageEventsForUser_nullUsageEvents_returnNull() throws RemoteException {
final int userId = 1;
doReturn(true).when(mUserManager).isUserUnlocked(userId);
- doReturn(null).when(mUsageStatsManager)
+ doReturn(null)
+ .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString());
assertThat(DataProcessor.getAppUsageEventsForUser(mContext, userId, 0)).isNull();
@@ -206,52 +209,112 @@
new BatteryLevelData.PeriodBatteryLevelData(batteryLevelMap2, timestamps2));
final List<AppUsageEvent> appUsageEventList = new ArrayList<>();
// Adds some events before the start timestamp.
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 1,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 2,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
// Adds the valid app usage events.
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 4200000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4500000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 12600000L, /*userId=*/ 2,
- /*instanceId=*/ 3, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 15600000L, /*userId=*/ 2,
- /*instanceId=*/ 3, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 16200000L, /*userId=*/ 2,
- /*instanceId=*/ 3, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 18000000L, /*userId=*/ 2,
- /*instanceId=*/ 3, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 17200000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 17800000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 46000000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 47800000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 49000000L, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 59600000L, /*userId=*/ 1,
- /*instanceId=*/ 4, packageName));
- appUsageEventList.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 61200000L, /*userId=*/ 1,
- /*instanceId=*/ 4, packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 4200000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 4500000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 12600000L,
+ /* userId= */ 2,
+ /* instanceId= */ 3,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 15600000L,
+ /* userId= */ 2,
+ /* instanceId= */ 3,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 16200000L,
+ /* userId= */ 2,
+ /* instanceId= */ 3,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 18000000L,
+ /* userId= */ 2,
+ /* instanceId= */ 3,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 17200000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 17800000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 46000000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 47800000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 49000000L,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 59600000L,
+ /* userId= */ 1,
+ /* instanceId= */ 4,
+ packageName));
+ appUsageEventList.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 61200000L,
+ /* userId= */ 1,
+ /* instanceId= */ 4,
+ packageName));
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>> periodMap =
DataProcessor.generateAppUsagePeriodMap(
@@ -292,18 +355,22 @@
new ArrayList<>();
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(new ArrayMap<>(), new ArrayList<>()));
- assertThat(DataProcessor.generateAppUsagePeriodMap(
- mContext, hourlyBatteryLevelsPerDay, new ArrayList<>(), new ArrayList<>()))
+ assertThat(
+ DataProcessor.generateAppUsagePeriodMap(
+ mContext,
+ hourlyBatteryLevelsPerDay,
+ new ArrayList<>(),
+ new ArrayList<>()))
.isNull();
}
@Test
public void generateAppUsageEventListFromUsageEvents_returnExpectedResult() {
- Event event1 = getUsageEvent(Event.NOTIFICATION_INTERRUPTION, /*timestamp=*/ 1);
- Event event2 = getUsageEvent(Event.ACTIVITY_RESUMED, /*timestamp=*/ 2);
- Event event3 = getUsageEvent(Event.ACTIVITY_STOPPED, /*timestamp=*/ 3);
- Event event4 = getUsageEvent(Event.DEVICE_SHUTDOWN, /*timestamp=*/ 4);
- Event event5 = getUsageEvent(Event.ACTIVITY_RESUMED, /*timestamp=*/ 5);
+ Event event1 = getUsageEvent(Event.NOTIFICATION_INTERRUPTION, /* timestamp= */ 1);
+ Event event2 = getUsageEvent(Event.ACTIVITY_RESUMED, /* timestamp= */ 2);
+ Event event3 = getUsageEvent(Event.ACTIVITY_STOPPED, /* timestamp= */ 3);
+ Event event4 = getUsageEvent(Event.DEVICE_SHUTDOWN, /* timestamp= */ 4);
+ Event event5 = getUsageEvent(Event.ACTIVITY_RESUMED, /* timestamp= */ 5);
event5.mPackage = null;
List<Event> events1 = new ArrayList<>();
events1.add(event1);
@@ -325,17 +392,16 @@
assertThat(appUsageEventList).hasSize(3);
assertAppUsageEvent(
- appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 2);
+ appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 2);
assertAppUsageEvent(
- appUsageEventList.get(1), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 3);
+ appUsageEventList.get(1), AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 3);
assertAppUsageEvent(
- appUsageEventList.get(2), AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 4);
+ appUsageEventList.get(2), AppUsageEventType.DEVICE_SHUTDOWN, /* timestamp= */ 4);
}
@Test
public void getHistoryMapWithExpectedTimestamps_emptyHistoryMap_returnEmptyMap() {
- assertThat(DataProcessor
- .getHistoryMapWithExpectedTimestamps(mContext, new HashMap<>()))
+ assertThat(DataProcessor.getHistoryMapWithExpectedTimestamps(mContext, new HashMap<>()))
.isEmpty();
}
@@ -343,11 +409,11 @@
public void getHistoryMapWithExpectedTimestamps_returnExpectedMap() {
// Timezone GMT+8
final long[] timestamps = {
- 1640966700000L, // 2022-01-01 00:05:00
- 1640970180000L, // 2022-01-01 01:03:00
- 1640973840000L, // 2022-01-01 02:04:00
- 1640978100000L, // 2022-01-01 03:15:00
- 1640981400000L // 2022-01-01 04:10:00
+ 1640966700000L, // 2022-01-01 00:05:00
+ 1640970180000L, // 2022-01-01 01:03:00
+ 1640973840000L, // 2022-01-01 02:04:00
+ 1640978100000L, // 2022-01-01 03:15:00
+ 1640981400000L // 2022-01-01 04:10:00
};
final int[] levels = {100, 94, 90, 82, 50};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -359,12 +425,12 @@
// Timezone GMT+8
final long[] expectedTimestamps = {
- 1640966700000L, // 2022-01-01 00:05:00
- 1640970000000L, // 2022-01-01 01:00:00
- 1640973600000L, // 2022-01-01 02:00:00
- 1640977200000L, // 2022-01-01 03:00:00
- 1640980800000L, // 2022-01-01 04:00:00
- 1640981400000L // 2022-01-01 04:10:00
+ 1640966700000L, // 2022-01-01 00:05:00
+ 1640970000000L, // 2022-01-01 01:00:00
+ 1640973600000L, // 2022-01-01 02:00:00
+ 1640977200000L, // 2022-01-01 03:00:00
+ 1640980800000L, // 2022-01-01 04:00:00
+ 1640981400000L // 2022-01-01 04:10:00
};
final int[] expectedLevels = {100, 94, 90, 84, 56, 98};
assertThat(resultMap).hasSize(expectedLevels.length);
@@ -372,19 +438,23 @@
assertThat(resultMap.get(expectedTimestamps[index]).get(FAKE_ENTRY_KEY).mBatteryLevel)
.isEqualTo(expectedLevels[index]);
}
- assertThat(resultMap.get(expectedTimestamps[expectedLevels.length - 1]).containsKey(
- DataProcessor.CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER)).isTrue();
+ assertThat(
+ resultMap
+ .get(expectedTimestamps[expectedLevels.length - 1])
+ .containsKey(
+ DataProcessor.CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER))
+ .isTrue();
}
@Test
public void getLevelDataThroughProcessedHistoryMap_OneDayData_returnExpectedResult() {
// Timezone GMT+8
final long[] timestamps = {
- 1640966400000L, // 2022-01-01 00:00:00
- 1640970000000L, // 2022-01-01 01:00:00
- 1640973600000L, // 2022-01-01 02:00:00
- 1640977200000L, // 2022-01-01 03:00:00
- 1640980800000L // 2022-01-01 04:00:00
+ 1640966400000L, // 2022-01-01 00:00:00
+ 1640970000000L, // 2022-01-01 01:00:00
+ 1640973600000L, // 2022-01-01 02:00:00
+ 1640977200000L, // 2022-01-01 03:00:00
+ 1640980800000L // 2022-01-01 04:00:00
};
final int[] levels = {100, 94, 90, 82, 50};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -396,12 +466,10 @@
final List<Long> expectedDailyTimestamps = List.of(timestamps[0], timestamps[4]);
final List<Integer> expectedDailyLevels = List.of(levels[0], levels[4]);
- final List<List<Long>> expectedHourlyTimestamps = List.of(
- List.of(timestamps[0], timestamps[2], timestamps[4])
- );
- final List<List<Integer>> expectedHourlyLevels = List.of(
- List.of(levels[0], levels[2], levels[4])
- );
+ final List<List<Long>> expectedHourlyTimestamps =
+ List.of(List.of(timestamps[0], timestamps[2], timestamps[4]));
+ final List<List<Integer>> expectedHourlyLevels =
+ List.of(List.of(levels[0], levels[2], levels[4]));
verifyExpectedBatteryLevelData(
resultData,
expectedDailyTimestamps,
@@ -414,10 +482,10 @@
public void getLevelDataThroughProcessedHistoryMap_MultipleDaysData_returnExpectedResult() {
// Timezone GMT+8
final long[] timestamps = {
- 1641038400000L, // 2022-01-01 20:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- 1641067200000L, // 2022-01-02 04:00:00
- 1641081600000L, // 2022-01-02 08:00:00
+ 1641038400000L, // 2022-01-01 20:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641067200000L, // 2022-01-02 04:00:00
+ 1641081600000L, // 2022-01-02 08:00:00
};
final int[] levels = {100, 94, 90, 82};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -427,29 +495,30 @@
final BatteryLevelData resultData =
DataProcessor.getLevelDataThroughProcessedHistoryMap(mContext, batteryHistoryMap);
- final List<Long> expectedDailyTimestamps = List.of(
- 1641038400000L, // 2022-01-01 20:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641081600000L // 2022-01-02 08:00:00
- );
+ final List<Long> expectedDailyTimestamps =
+ List.of(
+ 1641038400000L, // 2022-01-01 20:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641081600000L // 2022-01-02 08:00:00
+ );
final List<Integer> expectedDailyLevels = new ArrayList<>();
expectedDailyLevels.add(100);
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
expectedDailyLevels.add(82);
- final List<List<Long>> expectedHourlyTimestamps = List.of(
+ final List<List<Long>> expectedHourlyTimestamps =
List.of(
- 1641038400000L, // 2022-01-01 20:00:00
- 1641045600000L, // 2022-01-01 22:00:00
- 1641052800000L // 2022-01-02 00:00:00
- ),
- List.of(
- 1641052800000L, // 2022-01-02 00:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- 1641067200000L, // 2022-01-02 04:00:00
- 1641074400000L, // 2022-01-02 06:00:00
- 1641081600000L // 2022-01-02 08:00:00
- )
- );
+ List.of(
+ 1641038400000L, // 2022-01-01 20:00:00
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641052800000L // 2022-01-02 00:00:00
+ ),
+ List.of(
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641067200000L, // 2022-01-02 04:00:00
+ 1641074400000L, // 2022-01-02 06:00:00
+ 1641081600000L // 2022-01-02 08:00:00
+ ));
final List<Integer> expectedHourlyLevels1 = new ArrayList<>();
expectedHourlyLevels1.add(100);
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
@@ -460,10 +529,8 @@
expectedHourlyLevels2.add(90);
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
expectedHourlyLevels2.add(82);
- final List<List<Integer>> expectedHourlyLevels = List.of(
- expectedHourlyLevels1,
- expectedHourlyLevels2
- );
+ final List<List<Integer>> expectedHourlyLevels =
+ List.of(expectedHourlyLevels1, expectedHourlyLevels2);
verifyExpectedBatteryLevelData(
resultData,
expectedDailyTimestamps,
@@ -477,8 +544,8 @@
// Timezone PST 2022-11-06 has an extra 01:00:00 - 01:59:59 for daylight saving.
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
final long[] timestamps = {
- 1667667600000L, // 2022-11-05 10:00:00
- 1667829600000L // 2022-11-07 06:00:00
+ 1667667600000L, // 2022-11-05 10:00:00
+ 1667829600000L // 2022-11-07 06:00:00
};
final int[] levels = {100, 88};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -488,51 +555,52 @@
final BatteryLevelData resultData =
DataProcessor.getLevelDataThroughProcessedHistoryMap(mContext, batteryHistoryMap);
- final List<Long> expectedDailyTimestamps = List.of(
- 1667667600000L, // 2022-11-05 10:00:00
- 1667718000000L, // 2022-11-06 00:00:00
- 1667808000000L, // 2022-11-07 00:00:00
- 1667829600000L // 2022-11-07 06:00:00
- );
+ final List<Long> expectedDailyTimestamps =
+ List.of(
+ 1667667600000L, // 2022-11-05 10:00:00
+ 1667718000000L, // 2022-11-06 00:00:00
+ 1667808000000L, // 2022-11-07 00:00:00
+ 1667829600000L // 2022-11-07 06:00:00
+ );
final List<Integer> expectedDailyLevels = new ArrayList<>();
expectedDailyLevels.add(100);
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
expectedDailyLevels.add(88);
- final List<List<Long>> expectedHourlyTimestamps = List.of(
+ final List<List<Long>> expectedHourlyTimestamps =
List.of(
- 1667667600000L, // 2022-11-05 10:00:00
- 1667674800000L, // 2022-11-05 12:00:00
- 1667682000000L, // 2022-11-05 14:00:00
- 1667689200000L, // 2022-11-05 16:00:00
- 1667696400000L, // 2022-11-05 18:00:00
- 1667703600000L, // 2022-11-05 20:00:00
- 1667710800000L, // 2022-11-05 22:00:00
- 1667718000000L // 2022-11-06 00:00:00
- ),
- List.of(
- 1667718000000L, // 2022-11-06 00:00:00
- 1667725200000L, // 2022-11-06 01:00:00 after daylight saving change
- 1667732400000L, // 2022-11-06 03:00:00
- 1667739600000L, // 2022-11-06 05:00:00
- 1667746800000L, // 2022-11-06 07:00:00
- 1667754000000L, // 2022-11-06 09:00:00
- 1667761200000L, // 2022-11-06 11:00:00
- 1667768400000L, // 2022-11-06 13:00:00
- 1667775600000L, // 2022-11-06 15:00:00
- 1667782800000L, // 2022-11-06 17:00:00
- 1667790000000L, // 2022-11-06 19:00:00
- 1667797200000L, // 2022-11-06 21:00:00
- 1667804400000L, // 2022-11-06 23:00:00
- 1667808000000L // 2022-11-07 00:00:00
- ),
- List.of(
- 1667808000000L, // 2022-11-07 00:00:00
- 1667815200000L, // 2022-11-07 02:00:00
- 1667822400000L, // 2022-11-07 04:00:00
- 1667829600000L // 2022-11-07 06:00:00
- )
- );
+ List.of(
+ 1667667600000L, // 2022-11-05 10:00:00
+ 1667674800000L, // 2022-11-05 12:00:00
+ 1667682000000L, // 2022-11-05 14:00:00
+ 1667689200000L, // 2022-11-05 16:00:00
+ 1667696400000L, // 2022-11-05 18:00:00
+ 1667703600000L, // 2022-11-05 20:00:00
+ 1667710800000L, // 2022-11-05 22:00:00
+ 1667718000000L // 2022-11-06 00:00:00
+ ),
+ List.of(
+ 1667718000000L, // 2022-11-06 00:00:00
+ 1667725200000L, // 2022-11-06 01:00:00 after daylight saving change
+ 1667732400000L, // 2022-11-06 03:00:00
+ 1667739600000L, // 2022-11-06 05:00:00
+ 1667746800000L, // 2022-11-06 07:00:00
+ 1667754000000L, // 2022-11-06 09:00:00
+ 1667761200000L, // 2022-11-06 11:00:00
+ 1667768400000L, // 2022-11-06 13:00:00
+ 1667775600000L, // 2022-11-06 15:00:00
+ 1667782800000L, // 2022-11-06 17:00:00
+ 1667790000000L, // 2022-11-06 19:00:00
+ 1667797200000L, // 2022-11-06 21:00:00
+ 1667804400000L, // 2022-11-06 23:00:00
+ 1667808000000L // 2022-11-07 00:00:00
+ ),
+ List.of(
+ 1667808000000L, // 2022-11-07 00:00:00
+ 1667815200000L, // 2022-11-07 02:00:00
+ 1667822400000L, // 2022-11-07 04:00:00
+ 1667829600000L // 2022-11-07 06:00:00
+ ));
final List<Integer> expectedHourlyLevels1 = new ArrayList<>();
expectedHourlyLevels1.add(100);
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
@@ -562,11 +630,8 @@
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
expectedHourlyLevels3.add(88);
- final List<List<Integer>> expectedHourlyLevels = List.of(
- expectedHourlyLevels1,
- expectedHourlyLevels2,
- expectedHourlyLevels3
- );
+ final List<List<Integer>> expectedHourlyLevels =
+ List.of(expectedHourlyLevels1, expectedHourlyLevels2, expectedHourlyLevels3);
verifyExpectedBatteryLevelData(
resultData,
expectedDailyTimestamps,
@@ -580,8 +645,8 @@
// Timezone PST 2022-03-13 has no 02:00:00 - 02:59:59 for daylight saving.
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
final long[] timestamps = {
- 1647151200000L, // 2022-03-12 22:00:00
- 1647262800000L // 2022-03-14 06:00:00
+ 1647151200000L, // 2022-03-12 22:00:00
+ 1647262800000L // 2022-03-14 06:00:00
};
final int[] levels = {100, 88};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -591,44 +656,45 @@
final BatteryLevelData resultData =
DataProcessor.getLevelDataThroughProcessedHistoryMap(mContext, batteryHistoryMap);
- final List<Long> expectedDailyTimestamps = List.of(
- 1647151200000L, // 2022-03-12 22:00:00
- 1647158400000L, // 2022-03-13 00:00:00
- 1647241200000L, // 2022-03-14 00:00:00
- 1647262800000L // 2022-03-14 06:00:00
- );
+ final List<Long> expectedDailyTimestamps =
+ List.of(
+ 1647151200000L, // 2022-03-12 22:00:00
+ 1647158400000L, // 2022-03-13 00:00:00
+ 1647241200000L, // 2022-03-14 00:00:00
+ 1647262800000L // 2022-03-14 06:00:00
+ );
final List<Integer> expectedDailyLevels = new ArrayList<>();
expectedDailyLevels.add(100);
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
expectedDailyLevels.add(88);
- final List<List<Long>> expectedHourlyTimestamps = List.of(
+ final List<List<Long>> expectedHourlyTimestamps =
List.of(
- 1647151200000L, // 2022-03-12 22:00:00
- 1647158400000L // 2022-03-13 00:00:00
- ),
- List.of(
- 1647158400000L, // 2022-03-13 00:00:00
- 1647165600000L, // 2022-03-13 03:00:00 after daylight saving change
- 1647172800000L, // 2022-03-13 05:00:00
- 1647180000000L, // 2022-03-13 07:00:00
- 1647187200000L, // 2022-03-13 09:00:00
- 1647194400000L, // 2022-03-13 11:00:00
- 1647201600000L, // 2022-03-13 13:00:00
- 1647208800000L, // 2022-03-13 15:00:00
- 1647216000000L, // 2022-03-13 17:00:00
- 1647223200000L, // 2022-03-13 19:00:00
- 1647230400000L, // 2022-03-13 21:00:00
- 1647237600000L, // 2022-03-13 23:00:00
- 1647241200000L // 2022-03-14 00:00:00
- ),
- List.of(
- 1647241200000L, // 2022-03-14 00:00:00
- 1647248400000L, // 2022-03-14 02:00:00
- 1647255600000L, // 2022-03-14 04:00:00
- 1647262800000L // 2022-03-14 06:00:00
- )
- );
+ List.of(
+ 1647151200000L, // 2022-03-12 22:00:00
+ 1647158400000L // 2022-03-13 00:00:00
+ ),
+ List.of(
+ 1647158400000L, // 2022-03-13 00:00:00
+ 1647165600000L, // 2022-03-13 03:00:00 after daylight saving change
+ 1647172800000L, // 2022-03-13 05:00:00
+ 1647180000000L, // 2022-03-13 07:00:00
+ 1647187200000L, // 2022-03-13 09:00:00
+ 1647194400000L, // 2022-03-13 11:00:00
+ 1647201600000L, // 2022-03-13 13:00:00
+ 1647208800000L, // 2022-03-13 15:00:00
+ 1647216000000L, // 2022-03-13 17:00:00
+ 1647223200000L, // 2022-03-13 19:00:00
+ 1647230400000L, // 2022-03-13 21:00:00
+ 1647237600000L, // 2022-03-13 23:00:00
+ 1647241200000L // 2022-03-14 00:00:00
+ ),
+ List.of(
+ 1647241200000L, // 2022-03-14 00:00:00
+ 1647248400000L, // 2022-03-14 02:00:00
+ 1647255600000L, // 2022-03-14 04:00:00
+ 1647262800000L // 2022-03-14 06:00:00
+ ));
final List<Integer> expectedHourlyLevels1 = new ArrayList<>();
expectedHourlyLevels1.add(100);
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
@@ -651,11 +717,8 @@
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
expectedHourlyLevels3.add(88);
- final List<List<Integer>> expectedHourlyLevels = List.of(
- expectedHourlyLevels1,
- expectedHourlyLevels2,
- expectedHourlyLevels3
- );
+ final List<List<Integer>> expectedHourlyLevels =
+ List.of(expectedHourlyLevels1, expectedHourlyLevels2, expectedHourlyLevels3);
verifyExpectedBatteryLevelData(
resultData,
expectedDailyTimestamps,
@@ -666,8 +729,9 @@
@Test
public void getTimestampSlots_emptyRawList_returnEmptyList() {
- final List<Long> resultList = DataProcessor.getTimestampSlots(
- new ArrayList<>(), 1641038400000L); // 2022-01-01 20:00:00
+ final List<Long> resultList =
+ DataProcessor.getTimestampSlots(
+ new ArrayList<>(), 1641038400000L); // 2022-01-01 20:00:00
assertThat(resultList).isEmpty();
}
@@ -756,20 +820,24 @@
@Test
public void findNearestTimestamp_returnExpectedResult() {
- long[] results = DataProcessor.findNearestTimestamp(
- Arrays.asList(10L, 20L, 30L, 40L), /*target=*/ 15L);
+ long[] results =
+ DataProcessor.findNearestTimestamp(
+ Arrays.asList(10L, 20L, 30L, 40L), /* target= */ 15L);
assertThat(results).isEqualTo(new long[] {10L, 20L});
- results = DataProcessor.findNearestTimestamp(
- Arrays.asList(10L, 20L, 30L, 40L), /*target=*/ 10L);
+ results =
+ DataProcessor.findNearestTimestamp(
+ Arrays.asList(10L, 20L, 30L, 40L), /* target= */ 10L);
assertThat(results).isEqualTo(new long[] {10L, 10L});
- results = DataProcessor.findNearestTimestamp(
- Arrays.asList(10L, 20L, 30L, 40L), /*target=*/ 5L);
+ results =
+ DataProcessor.findNearestTimestamp(
+ Arrays.asList(10L, 20L, 30L, 40L), /* target= */ 5L);
assertThat(results).isEqualTo(new long[] {0L, 10L});
- results = DataProcessor.findNearestTimestamp(
- Arrays.asList(10L, 20L, 30L, 40L), /*target=*/ 50L);
+ results =
+ DataProcessor.findNearestTimestamp(
+ Arrays.asList(10L, 20L, 30L, 40L), /* target= */ 50L);
assertThat(results).isEqualTo(new long[] {40L, 0L});
}
@@ -781,36 +849,100 @@
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(new ArrayMap<>(), new ArrayList<>()));
- assertThat(DataProcessor.getBatteryDiffDataMap(mContext, hourlyBatteryLevelsPerDay,
- new HashMap<>(), /*appUsagePeriodMap=*/ null, Set.of(), Set.of())).isEmpty();
+ assertThat(
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ hourlyBatteryLevelsPerDay,
+ new HashMap<>(),
+ /* appUsagePeriodMap= */ null,
+ Set.of(),
+ Set.of()))
+ .isEmpty();
}
@Test
public void getBatteryDiffDataMap_normalFlow_returnExpectedResult() {
final int userId = mContext.getUserId();
- final long[] batteryHistoryKeys = new long[]{
- 1641045600000L, // 2022-01-01 22:00:00
- 1641049200000L, // 2022-01-01 23:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- };
- final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = Map.of(
- batteryHistoryKeys[0], Map.of(FAKE_PACKAGE_NAME, createBatteryHistEntry(
- FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0, 0, 0,
- 0, 0, 0L, userId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, 0L, 0L, false)),
- batteryHistoryKeys[1], Map.of(FAKE_PACKAGE_NAME, createBatteryHistEntry(
- FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 5, 0, 0,
- 0, 0, 0L, userId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, 0L, 0L, false)),
- batteryHistoryKeys[2], Map.of(FAKE_PACKAGE_NAME, createBatteryHistEntry(
- FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 16, 0, 0,
- 0, 0, 0L, userId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, 0L, 0L, false)));
+ final long[] batteryHistoryKeys =
+ new long[] {
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ };
+ final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
+ Map.of(
+ batteryHistoryKeys[0],
+ Map.of(
+ FAKE_PACKAGE_NAME,
+ createBatteryHistEntry(
+ FAKE_PACKAGE_NAME,
+ "fake_label",
+ /* consumePower= */ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0L,
+ userId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ 0L,
+ 0L,
+ false)),
+ batteryHistoryKeys[1],
+ Map.of(
+ FAKE_PACKAGE_NAME,
+ createBatteryHistEntry(
+ FAKE_PACKAGE_NAME,
+ "fake_label",
+ /* consumePower= */ 5,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0L,
+ userId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ 0L,
+ 0L,
+ false)),
+ batteryHistoryKeys[2],
+ Map.of(
+ FAKE_PACKAGE_NAME,
+ createBatteryHistEntry(
+ FAKE_PACKAGE_NAME,
+ "fake_label",
+ /* consumePower= */ 16,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0L,
+ userId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ 0L,
+ 0L,
+ false)));
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
- appUsagePeriodMap = Map.of(0, Map.of(0, Map.of(Long.valueOf(userId), Map.of(
- FAKE_PACKAGE_NAME, List.of(buildAppUsagePeriod(0, 6))))));
+ appUsagePeriodMap =
+ Map.of(
+ 0,
+ Map.of(
+ 0,
+ Map.of(
+ Long.valueOf(userId),
+ Map.of(
+ FAKE_PACKAGE_NAME,
+ List.of(buildAppUsagePeriod(0, 6))))));
- Map<Long, BatteryDiffData> batteryDiffDataMap = DataProcessor.getBatteryDiffDataMap(
- mContext, batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
- appUsagePeriodMap, Set.of(), Set.of());
+ Map<Long, BatteryDiffData> batteryDiffDataMap =
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ batteryHistoryMap,
+ appUsagePeriodMap,
+ Set.of(),
+ Set.of());
assertThat(batteryDiffDataMap).hasSize(1);
assertThat(batteryDiffDataMap).containsKey(batteryHistoryKeys[0]);
@@ -821,31 +953,48 @@
@Test
public void generateBatteryUsageMap_returnsExpectedResult() {
- final long[] batteryHistoryKeys = new long[]{
- 1641045600000L, // 2022-01-01 22:00:00
- 1641049200000L, // 2022-01-01 23:00:00
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L, // 2022-01-02 01:00:00
- 1641060000000L, // 2022-01-02 02:00:00
- };
+ final long[] batteryHistoryKeys =
+ new long[] {
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L, // 2022-01-02 01:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ };
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final int currentUserId = mContext.getUserId();
- final BatteryHistEntry fakeEntry = createBatteryHistEntry(
- FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
- /*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L,
- /*isHidden=*/ false);
+ final BatteryHistEntry fakeEntry =
+ createBatteryHistEntry(
+ FAKE_PACKAGE_NAME,
+ "fake_label",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 0L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
// Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>();
- BatteryHistEntry entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 5.0,
- /*foregroundUsageConsumePower=*/ 2, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ BatteryHistEntry entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 5.0,
+ /* foregroundUsageConsumePower= */ 2,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 3,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
@@ -855,69 +1004,125 @@
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 20.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 15L,
- /*backgroundUsageTimeInMs=*/ 25L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 20.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 15L,
+ /* backgroundUsageTimeInMs= */ 25L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
// Adds the index = 3 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 40.0,
- /*foregroundUsageConsumePower=*/ 8, /*foregroundServiceUsageConsumePower=*/ 8,
- /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 25L,
- /*backgroundUsageTimeInMs=*/ 35L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 40.0,
+ /* foregroundUsageConsumePower= */ 8,
+ /* foregroundServiceUsageConsumePower= */ 8,
+ /* backgroundUsageConsumePower= */ 8,
+ /* cachedUsageConsumePower= */ 8,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 25L,
+ /* backgroundUsageTimeInMs= */ 35L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package3", "Screen", /*consumePower=*/ 10.0,
- /*foregroundUsageConsumePower=*/ 4, /*foregroundServiceUsageConsumePower=*/ 2,
- /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
- /*uid=*/ 3L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 40L,
- /*backgroundUsageTimeInMs=*/ 50L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package3",
+ "Screen",
+ /* consumePower= */ 10.0,
+ /* foregroundUsageConsumePower= */ 4,
+ /* foregroundServiceUsageConsumePower= */ 2,
+ /* backgroundUsageConsumePower= */ 2,
+ /* cachedUsageConsumePower= */ 2,
+ /* uid= */ 3L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /* foregroundUsageTimeInMs= */ 40L,
+ /* backgroundUsageTimeInMs= */ 50L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package4", "label4", /*consumePower=*/ 15.0,
- /*foregroundUsageConsumePower=*/ 6, /*foregroundServiceUsageConsumePower=*/ 3,
- /*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 3,
- /*uid=*/ 4L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L,
- /*backgroundUsageTimeInMs=*/ 5L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package4",
+ "label4",
+ /* consumePower= */ 15.0,
+ /* foregroundUsageConsumePower= */ 6,
+ /* foregroundServiceUsageConsumePower= */ 3,
+ /* backgroundUsageConsumePower= */ 3,
+ /* cachedUsageConsumePower= */ 3,
+ /* uid= */ 4L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 5L,
+ /* backgroundUsageTimeInMs= */ 5L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[3], entryMap);
// Adds the index = 4 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 40.0,
- /*foregroundUsageConsumePower=*/ 14, /*foregroundServiceUsageConsumePower=*/ 9,
- /*backgroundUsageConsumePower=*/ 9, /*cachedUsageConsumePower=*/ 8,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
- /*backgroundUsageTimeInMs=*/ 40L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 40.0,
+ /* foregroundUsageConsumePower= */ 14,
+ /* foregroundServiceUsageConsumePower= */ 9,
+ /* backgroundUsageConsumePower= */ 9,
+ /* cachedUsageConsumePower= */ 8,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 30L,
+ /* backgroundUsageTimeInMs= */ 40L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package3", "Screen", /*consumePower=*/ 20.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*uid=*/ 3L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 50L,
- /*backgroundUsageTimeInMs=*/ 60L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package3",
+ "Screen",
+ /* consumePower= */ 20.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* uid= */ 3L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /* foregroundUsageTimeInMs= */ 50L,
+ /* backgroundUsageTimeInMs= */ 60L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package4", "label4", /*consumePower=*/ 40.0,
- /*foregroundUsageConsumePower=*/ 8, /*foregroundServiceUsageConsumePower=*/ 8,
- /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
- /*uid=*/ 4L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L,
- /*backgroundUsageTimeInMs=*/ 5L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package4",
+ "label4",
+ /* consumePower= */ 40.0,
+ /* foregroundUsageConsumePower= */ 8,
+ /* foregroundServiceUsageConsumePower= */ 8,
+ /* backgroundUsageConsumePower= */ 8,
+ /* cachedUsageConsumePower= */ 8,
+ /* uid= */ 4L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 5L,
+ /* backgroundUsageTimeInMs= */ 5L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[4], entryMap);
@@ -938,18 +1143,22 @@
appUsageMap = new HashMap<>();
userPeriodMap = new HashMap<>();
appUsageMap.put(Long.valueOf(currentUserId), userPeriodMap);
- userPeriodMap.put("package2",
- List.of(buildAppUsagePeriod(2, 7), buildAppUsagePeriod(5, 9)));
- userPeriodMap.put("package3",
- List.of(buildAppUsagePeriod(10, 15), buildAppUsagePeriod(25, 29)));
+ userPeriodMap.put(
+ "package2", List.of(buildAppUsagePeriod(2, 7), buildAppUsagePeriod(5, 9)));
+ userPeriodMap.put(
+ "package3", List.of(buildAppUsagePeriod(10, 15), buildAppUsagePeriod(25, 29)));
appUsagePeriodMap.get(1).put(0, appUsageMap);
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
DataProcessor.generateBatteryUsageMap(
mContext,
- DataProcessor.getBatteryDiffDataMap(mContext,
- batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
- appUsagePeriodMap, Set.of(), Set.of()),
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ batteryHistoryMap,
+ appUsagePeriodMap,
+ Set.of(),
+ Set.of()),
batteryLevelData);
BatteryDiffData resultDiffData =
@@ -958,146 +1167,261 @@
.get(DataProcessor.SELECTED_INDEX_ALL);
assertThat(resultDiffData.getScreenOnTime()).isEqualTo(36L);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 2L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 50.0,
- /*foregroundUsageConsumePower=*/ 14, /*foregroundServiceUsageConsumePower=*/ 9,
- /*backgroundUsageConsumePower=*/ 9, /*cachedUsageConsumePower=*/ 8,
- /*foregroundUsageTimeInMs=*/ 30, /*backgroundUsageTimeInMs=*/ 40,
- /*screenOnTimeInMs=*/ 12);
+ resultDiffData.getAppDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 2L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 50.0,
+ /* foregroundUsageConsumePower= */ 14,
+ /* foregroundServiceUsageConsumePower= */ 9,
+ /* backgroundUsageConsumePower= */ 9,
+ /* cachedUsageConsumePower= */ 8,
+ /* foregroundUsageTimeInMs= */ 30,
+ /* backgroundUsageTimeInMs= */ 40,
+ /* screenOnTimeInMs= */ 12);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(1), currentUserId, /*uid=*/ 4L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 50.0,
- /*foregroundUsageConsumePower=*/ 8, /*foregroundServiceUsageConsumePower=*/ 8,
- /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
- /*foregroundUsageTimeInMs=*/ 5, /*backgroundUsageTimeInMs=*/ 5,
- /*screenOnTimeInMs=*/ 0);
+ resultDiffData.getAppDiffEntryList().get(1),
+ currentUserId,
+ /* uid= */ 4L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 50.0,
+ /* foregroundUsageConsumePower= */ 8,
+ /* foregroundServiceUsageConsumePower= */ 8,
+ /* backgroundUsageConsumePower= */ 8,
+ /* cachedUsageConsumePower= */ 8,
+ /* foregroundUsageTimeInMs= */ 5,
+ /* backgroundUsageTimeInMs= */ 5,
+ /* screenOnTimeInMs= */ 0);
assertBatteryDiffEntry(
- resultDiffData.getSystemDiffEntryList().get(0), currentUserId, /*uid=*/ 3L,
- ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 16, /*backgroundUsageTimeInMs=*/ 60,
- /*screenOnTimeInMs=*/ 9);
+ resultDiffData.getSystemDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 3L,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 16,
+ /* backgroundUsageTimeInMs= */ 60,
+ /* screenOnTimeInMs= */ 9);
resultDiffData = resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 2L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 15, /*backgroundUsageTimeInMs=*/ 25,
- /*screenOnTimeInMs=*/ 5);
+ resultDiffData.getAppDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 2L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 15,
+ /* backgroundUsageTimeInMs= */ 25,
+ /* screenOnTimeInMs= */ 5);
resultDiffData = resultMap.get(1).get(DataProcessor.SELECTED_INDEX_ALL);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 4L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 66.66666666666666,
- /*foregroundUsageConsumePower=*/ 8, /*foregroundServiceUsageConsumePower=*/ 8,
- /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
- /*foregroundUsageTimeInMs=*/ 5, /*backgroundUsageTimeInMs=*/ 5,
- /*screenOnTimeInMs=*/ 0);
+ resultDiffData.getAppDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 4L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 66.66666666666666,
+ /* foregroundUsageConsumePower= */ 8,
+ /* foregroundServiceUsageConsumePower= */ 8,
+ /* backgroundUsageConsumePower= */ 8,
+ /* cachedUsageConsumePower= */ 8,
+ /* foregroundUsageTimeInMs= */ 5,
+ /* backgroundUsageTimeInMs= */ 5,
+ /* screenOnTimeInMs= */ 0);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(1), currentUserId, /*uid=*/ 2L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 33.33333333333333,
- /*foregroundUsageConsumePower=*/ 9, /*foregroundServiceUsageConsumePower=*/ 4,
- /*backgroundUsageConsumePower=*/ 4, /*cachedUsageConsumePower=*/ 3,
- /*foregroundUsageTimeInMs=*/ 15, /*backgroundUsageTimeInMs=*/ 15,
- /*screenOnTimeInMs=*/ 7);
+ resultDiffData.getAppDiffEntryList().get(1),
+ currentUserId,
+ /* uid= */ 2L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 33.33333333333333,
+ /* foregroundUsageConsumePower= */ 9,
+ /* foregroundServiceUsageConsumePower= */ 4,
+ /* backgroundUsageConsumePower= */ 4,
+ /* cachedUsageConsumePower= */ 3,
+ /* foregroundUsageTimeInMs= */ 15,
+ /* backgroundUsageTimeInMs= */ 15,
+ /* screenOnTimeInMs= */ 7);
assertBatteryDiffEntry(
- resultDiffData.getSystemDiffEntryList().get(0), currentUserId, /*uid=*/ 3L,
- ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 16, /*backgroundUsageTimeInMs=*/ 60,
- /*screenOnTimeInMs=*/ 9);
+ resultDiffData.getSystemDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 3L,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 16,
+ /* backgroundUsageTimeInMs= */ 60,
+ /* screenOnTimeInMs= */ 9);
}
@Test
public void generateBatteryUsageMap_multipleUsers_returnsExpectedResult() {
- final long[] batteryHistoryKeys = new long[]{
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L, // 2022-01-02 01:00:00
- 1641060000000L // 2022-01-02 02:00:00
- };
+ final long[] batteryHistoryKeys =
+ new long[] {
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L, // 2022-01-02 01:00:00
+ 1641060000000L // 2022-01-02 02:00:00
+ };
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final int currentUserId = mContext.getUserId();
// Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>();
- BatteryHistEntry entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 5.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ BatteryHistEntry entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 5.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 10.0,
- /*foregroundUsageConsumePower=*/ 7, /*foregroundServiceUsageConsumePower=*/ 1,
- /*backgroundUsageConsumePower=*/ 1, /*cachedUsageConsumePower=*/ 1,
- /*uid=*/ 2L, currentUserId + 1,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 10.0,
+ /* foregroundUsageConsumePower= */ 7,
+ /* foregroundServiceUsageConsumePower= */ 1,
+ /* backgroundUsageConsumePower= */ 1,
+ /* cachedUsageConsumePower= */ 1,
+ /* uid= */ 2L,
+ currentUserId + 1,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 5.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 3L, currentUserId + 2,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
- /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 5.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 3L,
+ currentUserId + 2,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 20L,
+ /* backgroundUsageTimeInMs= */ 30L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 15.0,
- /*foregroundUsageConsumePower=*/ 9, /*foregroundServiceUsageConsumePower=*/ 2,
- /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
- /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 15.0,
+ /* foregroundUsageConsumePower= */ 9,
+ /* foregroundServiceUsageConsumePower= */ 2,
+ /* backgroundUsageConsumePower= */ 2,
+ /* cachedUsageConsumePower= */ 2,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 20L,
+ /* backgroundUsageTimeInMs= */ 30L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 30.0,
- /*foregroundUsageConsumePower=*/ 20, /*foregroundServiceUsageConsumePower=*/ 6,
- /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
- /*uid=*/ 2L, currentUserId + 1,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 30.0,
+ /* foregroundUsageConsumePower= */ 20,
+ /* foregroundServiceUsageConsumePower= */ 6,
+ /* backgroundUsageConsumePower= */ 2,
+ /* cachedUsageConsumePower= */ 2,
+ /* uid= */ 2L,
+ currentUserId + 1,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 15.0,
- /*foregroundUsageConsumePower=*/ 10, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 3L, currentUserId + 2,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
- /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 15.0,
+ /* foregroundUsageConsumePower= */ 10,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 3L,
+ currentUserId + 2,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 30L,
+ /* backgroundUsageTimeInMs= */ 30L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 25.0,
- /*foregroundUsageConsumePower=*/ 10, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
- /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 25.0,
+ /* foregroundUsageConsumePower= */ 10,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 20L,
+ /* backgroundUsageTimeInMs= */ 30L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 50.0,
- /*foregroundUsageConsumePower=*/ 20, /*foregroundServiceUsageConsumePower=*/ 10,
- /*backgroundUsageConsumePower=*/ 10, /*cachedUsageConsumePower=*/ 10,
- /*uid=*/ 2L, currentUserId + 1,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 50.0,
+ /* foregroundUsageConsumePower= */ 20,
+ /* foregroundServiceUsageConsumePower= */ 10,
+ /* backgroundUsageConsumePower= */ 10,
+ /* cachedUsageConsumePower= */ 10,
+ /* uid= */ 2L,
+ currentUserId + 1,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 20L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 25.0,
- /*foregroundUsageConsumePower=*/ 10, /*foregroundServiceUsageConsumePower=*/ 10,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 3L, currentUserId + 2,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
- /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 25.0,
+ /* foregroundUsageConsumePower= */ 10,
+ /* foregroundServiceUsageConsumePower= */ 10,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 3L,
+ currentUserId + 2,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 30L,
+ /* backgroundUsageTimeInMs= */ 30L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
@@ -1105,9 +1429,13 @@
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
DataProcessor.generateBatteryUsageMap(
mContext,
- DataProcessor.getBatteryDiffDataMap(mContext,
- batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
- /*appUsagePeriodMap=*/ null, Set.of(), Set.of()),
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ batteryHistoryMap,
+ /* appUsagePeriodMap= */ null,
+ Set.of(),
+ Set.of()),
batteryLevelData);
final BatteryDiffData resultDiffData =
@@ -1116,12 +1444,18 @@
.get(DataProcessor.SELECTED_INDEX_ALL);
assertThat(resultDiffData.getScreenOnTime()).isEqualTo(0L);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 1L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 10,
- /*screenOnTimeInMs=*/ 0);
+ resultDiffData.getAppDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 1L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 10,
+ /* backgroundUsageTimeInMs= */ 10,
+ /* screenOnTimeInMs= */ 0);
assertThat(resultDiffData.getSystemDiffEntryList()).isEmpty();
assertThat(resultMap.get(0).get(0)).isNotNull();
assertThat(resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL)).isNotNull();
@@ -1129,44 +1463,69 @@
@Test
public void generateBatteryUsageMap_usageTimeExceed_returnsExpectedResult() {
- final long[] batteryHistoryKeys = new long[]{
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L, // 2022-01-02 01:00:00
- 1641060000000L // 2022-01-02 02:00:00
- };
+ final long[] batteryHistoryKeys =
+ new long[] {
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L, // 2022-01-02 01:00:00
+ 1641060000000L // 2022-01-02 02:00:00
+ };
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final int currentUserId = mContext.getUserId();
// Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>();
- BatteryHistEntry entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ BatteryHistEntry entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 500.0,
- /*foregroundUsageConsumePower=*/ 200, /*foregroundServiceUsageConsumePower=*/ 100,
- /*backgroundUsageConsumePower=*/ 100, /*cachedUsageConsumePower=*/ 100,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 3600000L,
- /*backgroundUsageTimeInMs=*/ 7200000L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 500.0,
+ /* foregroundUsageConsumePower= */ 200,
+ /* foregroundServiceUsageConsumePower= */ 100,
+ /* backgroundUsageConsumePower= */ 100,
+ /* cachedUsageConsumePower= */ 100,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 3600000L,
+ /* backgroundUsageTimeInMs= */ 7200000L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
@@ -1185,9 +1544,13 @@
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
DataProcessor.generateBatteryUsageMap(
mContext,
- DataProcessor.getBatteryDiffDataMap(mContext,
- batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
- appUsagePeriodMap, Set.of(), Set.of()),
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ batteryHistoryMap,
+ appUsagePeriodMap,
+ Set.of(),
+ Set.of()),
batteryLevelData);
final BatteryDiffData resultDiffData =
@@ -1200,10 +1563,8 @@
final BatteryDiffEntry resultEntry = resultDiffData.getAppDiffEntryList().get(0);
assertThat(resultEntry.mForegroundUsageTimeInMs)
.isEqualTo(Math.round(entry.mForegroundUsageTimeInMs * ratio));
- assertThat(resultEntry.mBackgroundUsageTimeInMs)
- .isEqualTo(0);
- assertThat(resultEntry.mConsumePower)
- .isEqualTo(entry.mConsumePower * ratio);
+ assertThat(resultEntry.mBackgroundUsageTimeInMs).isEqualTo(0);
+ assertThat(resultEntry.mConsumePower).isEqualTo(entry.mConsumePower * ratio);
assertThat(resultEntry.mForegroundUsageConsumePower)
.isEqualTo(entry.mForegroundUsageConsumePower * ratio);
assertThat(resultEntry.mForegroundServiceUsageConsumePower)
@@ -1219,80 +1580,132 @@
@Test
public void generateBatteryUsageMap_hideApplicationEntries_returnsExpectedResult() {
- final long[] batteryHistoryKeys = new long[]{
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L, // 2022-01-02 01:00:00
- 1641060000000L // 2022-01-02 02:00:00
- };
+ final long[] batteryHistoryKeys =
+ new long[] {
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L, // 2022-01-02 01:00:00
+ 1641060000000L // 2022-01-02 02:00:00
+ };
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final int currentUserId = mContext.getUserId();
// Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>();
- BatteryHistEntry entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ BatteryHistEntry entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 10.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 10.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 10.0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 10.0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
- when(mPowerUsageFeatureProvider.getHideApplicationSet())
- .thenReturn(Set.of("package1"));
+ when(mPowerUsageFeatureProvider.getHideApplicationSet()).thenReturn(Set.of("package1"));
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
DataProcessor.generateBatteryUsageMap(
mContext,
- DataProcessor.getBatteryDiffDataMap(mContext,
- batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
- /*appUsagePeriodMap=*/ null, Set.of(), Set.of()),
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ batteryHistoryMap,
+ /* appUsagePeriodMap= */ null,
+ Set.of(),
+ Set.of()),
batteryLevelData);
final BatteryDiffData resultDiffData =
@@ -1300,78 +1713,133 @@
.get(DataProcessor.SELECTED_INDEX_ALL)
.get(DataProcessor.SELECTED_INDEX_ALL);
assertBatteryDiffEntry(
- resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 2L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 20,
- /*screenOnTimeInMs=*/ 0);
+ resultDiffData.getAppDiffEntryList().get(0),
+ currentUserId,
+ /* uid= */ 2L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* foregroundUsageTimeInMs= */ 10,
+ /* backgroundUsageTimeInMs= */ 20,
+ /* screenOnTimeInMs= */ 0);
}
@Test
public void generateBatteryUsageMap_hideBackgroundUsageTime_returnsExpectedResult() {
- final long[] batteryHistoryKeys = new long[]{
- 1641052800000L, // 2022-01-02 00:00:00
- 1641056400000L, // 2022-01-02 01:00:00
- 1641060000000L // 2022-01-02 02:00:00
- };
+ final long[] batteryHistoryKeys =
+ new long[] {
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L, // 2022-01-02 01:00:00
+ 1641060000000L // 2022-01-02 02:00:00
+ };
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final int currentUserId = mContext.getUserId();
// Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>();
- BatteryHistEntry entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ BatteryHistEntry entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
- /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 0L,
+ /* backgroundUsageTimeInMs= */ 0L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data.
entryMap = new HashMap<>();
- entry = createBatteryHistEntry(
- "package1", "label1", /*consumePower=*/ 10.0,
- /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*uid=*/ 1L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package1",
+ "label1",
+ /* consumePower= */ 10.0,
+ /* foregroundUsageConsumePower= */ 5,
+ /* foregroundServiceUsageConsumePower= */ 5,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* uid= */ 1L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
- entry = createBatteryHistEntry(
- "package2", "label2", /*consumePower=*/ 10.0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
- /*uid=*/ 2L, currentUserId,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
- /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
+ entry =
+ createBatteryHistEntry(
+ "package2",
+ "label2",
+ /* consumePower= */ 10.0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 5,
+ /* cachedUsageConsumePower= */ 5,
+ /* uid= */ 2L,
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* foregroundUsageTimeInMs= */ 10L,
+ /* backgroundUsageTimeInMs= */ 20L,
+ /* isHidden= */ false);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
@@ -1381,9 +1849,13 @@
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
DataProcessor.generateBatteryUsageMap(
mContext,
- DataProcessor.getBatteryDiffDataMap(mContext,
- batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
- /*appUsagePeriodMap=*/ null, Set.of(), Set.of()),
+ DataProcessor.getBatteryDiffDataMap(
+ mContext,
+ batteryLevelData.getHourlyBatteryLevelsPerDay(),
+ batteryHistoryMap,
+ /* appUsagePeriodMap= */ null,
+ Set.of(),
+ Set.of()),
batteryLevelData);
final BatteryDiffData resultDiffData =
@@ -1398,11 +1870,13 @@
@Test
public void generateBatteryDiffData_emptyBatteryEntryList_returnEmptyBatteryDiffData() {
- final BatteryDiffData batteryDiffData = DataProcessor.generateBatteryDiffData(mContext,
- System.currentTimeMillis(),
- DataProcessor.convertToBatteryHistEntry(null, mBatteryUsageStats),
- /* systemAppsPackageNames= */ Set.of(),
- /* systemAppsUids= */ Set.of());
+ final BatteryDiffData batteryDiffData =
+ DataProcessor.generateBatteryDiffData(
+ mContext,
+ System.currentTimeMillis(),
+ DataProcessor.convertToBatteryHistEntry(null, mBatteryUsageStats),
+ /* systemAppsPackageNames= */ Set.of(),
+ /* systemAppsUids= */ Set.of());
assertThat(batteryDiffData.getAppDiffEntryList()).isEmpty();
assertThat(batteryDiffData.getSystemDiffEntryList()).isEmpty();
}
@@ -1450,37 +1924,60 @@
doReturn(10L).when(mMockBatteryEntry4).getTimeInBackgroundMs();
doReturn(4).when(mMockBatteryEntry4).getUid();
doReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY)
- .when(mMockBatteryEntry4).getConsumerType();
+ .when(mMockBatteryEntry4)
+ .getConsumerType();
doReturn(BatteryConsumer.POWER_COMPONENT_CAMERA)
- .when(mMockBatteryEntry4).getPowerComponentId();
+ .when(mMockBatteryEntry4)
+ .getPowerComponentId();
- final BatteryDiffData batteryDiffData = DataProcessor.generateBatteryDiffData(mContext,
- System.currentTimeMillis(),
- DataProcessor.convertToBatteryHistEntry(batteryEntryList, mBatteryUsageStats),
- /* systemAppsPackageNames= */ Set.of(),
- /* systemAppsUids= */ Set.of());
+ final BatteryDiffData batteryDiffData =
+ DataProcessor.generateBatteryDiffData(
+ mContext,
+ System.currentTimeMillis(),
+ DataProcessor.convertToBatteryHistEntry(
+ batteryEntryList, mBatteryUsageStats),
+ /* systemAppsPackageNames= */ Set.of(),
+ /* systemAppsUids= */ Set.of());
assertBatteryDiffEntry(
- batteryDiffData.getAppDiffEntryList().get(0), 0, /*uid=*/ 2L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 0.5, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*foregroundUsageTimeInMs=*/ 20, /*backgroundUsageTimeInMs=*/ 20,
- /*screenOnTimeInMs=*/ 0);
+ batteryDiffData.getAppDiffEntryList().get(0),
+ 0,
+ /* uid= */ 2L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 0.5,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* foregroundUsageTimeInMs= */ 20,
+ /* backgroundUsageTimeInMs= */ 20,
+ /* screenOnTimeInMs= */ 0);
assertBatteryDiffEntry(
- batteryDiffData.getAppDiffEntryList().get(1), 0, /*uid=*/ 1L,
- ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 0.0,
- /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
- /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
- /*foregroundUsageTimeInMs=*/ 30, /*backgroundUsageTimeInMs=*/ 40,
- /*screenOnTimeInMs=*/ 0);
+ batteryDiffData.getAppDiffEntryList().get(1),
+ 0,
+ /* uid= */ 1L,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /* consumePercentage= */ 0.0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0,
+ /* foregroundUsageTimeInMs= */ 30,
+ /* backgroundUsageTimeInMs= */ 40,
+ /* screenOnTimeInMs= */ 0);
assertBatteryDiffEntry(
- batteryDiffData.getSystemDiffEntryList().get(0), 0, /*uid=*/ 4L,
- ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*consumePercentage=*/ 100.0,
- /*foregroundUsageConsumePower=*/ 0.9, /*foregroundServiceUsageConsumePower=*/ 0.2,
- /*backgroundUsageConsumePower=*/ 0.3, /*cachedUsageConsumePower=*/ 0.1,
- /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 10,
- /*screenOnTimeInMs=*/ 0);
+ batteryDiffData.getSystemDiffEntryList().get(0),
+ 0,
+ /* uid= */ 4L,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /* consumePercentage= */ 100.0,
+ /* foregroundUsageConsumePower= */ 0.9,
+ /* foregroundServiceUsageConsumePower= */ 0.2,
+ /* backgroundUsageConsumePower= */ 0.3,
+ /* cachedUsageConsumePower= */ 0.1,
+ /* foregroundUsageTimeInMs= */ 10,
+ /* backgroundUsageTimeInMs= */ 10,
+ /* screenOnTimeInMs= */ 0);
}
@Test
@@ -1489,43 +1986,91 @@
final String packageName1 = "com.android.settings1";
final String packageName2 = "com.android.settings2";
// Fake multiple instances in one package.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 1,
- /*instanceId=*/ 2, packageName1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 2, /*userId=*/ 1,
- /*instanceId=*/ 3, packageName1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 1,
- /*instanceId=*/ 3, packageName1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 2, /*userId=*/ 1,
- /*instanceId=*/ 5, packageName2));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 1,
- /*instanceId=*/ 5, packageName2));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 1,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName1));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 2,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName1));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 3,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName1));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 4,
+ /* userId= */ 1,
+ /* instanceId= */ 2,
+ packageName1));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 2,
+ /* userId= */ 1,
+ /* instanceId= */ 3,
+ packageName1));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 4,
+ /* userId= */ 1,
+ /* instanceId= */ 3,
+ packageName1));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 2,
+ /* userId= */ 1,
+ /* instanceId= */ 5,
+ packageName2));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 4,
+ /* userId= */ 1,
+ /* instanceId= */ 5,
+ packageName2));
// Fake one instance in one package.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1, /*userId=*/ 2,
- /*instanceId=*/ 4, packageName2));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2, /*userId=*/ 2,
- /*instanceId=*/ 4, packageName2));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3, /*userId=*/ 2,
- /*instanceId=*/ 4, packageName2));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 2,
- /*instanceId=*/ 4, packageName2));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 1,
+ /* userId= */ 2,
+ /* instanceId= */ 4,
+ packageName2));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 2,
+ /* userId= */ 2,
+ /* instanceId= */ 4,
+ packageName2));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_RESUMED,
+ /* timestamp= */ 3,
+ /* userId= */ 2,
+ /* instanceId= */ 4,
+ packageName2));
+ appUsageEvents.add(
+ buildAppUsageEvent(
+ AppUsageEventType.ACTIVITY_STOPPED,
+ /* timestamp= */ 4,
+ /* userId= */ 2,
+ /* instanceId= */ 4,
+ packageName2));
final Map<Long, Map<String, List<AppUsagePeriod>>> appUsagePeriodMap =
DataProcessor.buildAppUsagePeriodList(
@@ -1552,65 +2097,69 @@
@Test
public void buildAppUsagePeriodList_emptyEventList_returnNull() {
- assertThat(DataProcessor.buildAppUsagePeriodList(
- mContext, new ArrayList<>(), new ArrayList<>(), 0, 1)).isNull();
+ assertThat(
+ DataProcessor.buildAppUsagePeriodList(
+ mContext, new ArrayList<>(), new ArrayList<>(), 0, 1))
+ .isNull();
}
@Test
public void buildAppUsagePeriodList_emptyActivityList_returnNull() {
final List<AppUsageEvent> appUsageEvents = new ArrayList<>();
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 2));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.DEVICE_SHUTDOWN, /* timestamp= */ 1));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.DEVICE_SHUTDOWN, /* timestamp= */ 2));
- assertThat(DataProcessor.buildAppUsagePeriodList(
- mContext, appUsageEvents, new ArrayList<>(), 0, 3)).isNull();
+ assertThat(
+ DataProcessor.buildAppUsagePeriodList(
+ mContext, appUsageEvents, new ArrayList<>(), 0, 3))
+ .isNull();
}
@Test
public void buildAppUsagePeriodListPerInstance_returnExpectedResult() {
final List<AppUsageEvent> appUsageEvents = new ArrayList<>();
// Fake data earlier than time range.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 1));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 2));
// Fake resume event earlier than time range.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 120000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 3));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 120000));
// Fake normal data.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 150000));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 200000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 150000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 200000));
// Fake two adjacent resume events.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 300000));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 400000));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 500000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 300000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 400000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 500000));
// Fake no start event when stop event happens.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 600000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_STOPPED, /* timestamp= */ 600000));
// There exists start event when device shutdown event happens. Shutdown is later than
// default complete time.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 700000));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 800000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 700000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.DEVICE_SHUTDOWN, /* timestamp= */ 800000));
// There exists start event when device shutdown event happens. Shutdown is earlier than
// default complete time.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 900000));
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 910000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 900000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.DEVICE_SHUTDOWN, /* timestamp= */ 910000));
// There exists start event when the period ends.
- appUsageEvents.add(buildAppUsageEvent(
- AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1000000));
+ appUsageEvents.add(
+ buildAppUsageEvent(AppUsageEventType.ACTIVITY_RESUMED, /* timestamp= */ 1000000));
final List<AppUsagePeriod> appUsagePeriodList =
DataProcessor.buildAppUsagePeriodListPerInstance(appUsageEvents, 100000, 1100000);
@@ -1627,17 +2176,26 @@
@Test
public void excludePowerConnectedTime_startEndNotCharging_returnExpectedResult() {
- final List<AppUsagePeriod> appUsagePeriodList = List.of(
- AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
- final List<BatteryEvent> batteryEventList = List.of(
- BatteryEvent.newBuilder().setTimestamp(50).setType(
- BatteryEventType.POWER_DISCONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(166).setType(
- BatteryEventType.POWER_CONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(188).setType(
- BatteryEventType.POWER_DISCONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(280).setType(
- BatteryEventType.POWER_CONNECTED).build());
+ final List<AppUsagePeriod> appUsagePeriodList =
+ List.of(AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
+ final List<BatteryEvent> batteryEventList =
+ List.of(
+ BatteryEvent.newBuilder()
+ .setTimestamp(50)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(166)
+ .setType(BatteryEventType.POWER_CONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(188)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(280)
+ .setType(BatteryEventType.POWER_CONNECTED)
+ .build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
@@ -1650,21 +2208,34 @@
@Test
public void excludePowerConnectedTime_startEndInCharging_returnExpectedResult() {
- final List<AppUsagePeriod> appUsagePeriodList = List.of(
- AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
- final List<BatteryEvent> batteryEventList = List.of(
- BatteryEvent.newBuilder().setTimestamp(50).setType(
- BatteryEventType.POWER_DISCONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(80).setType(
- BatteryEventType.POWER_CONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(120).setType(
- BatteryEventType.POWER_DISCONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(150).setType(
- BatteryEventType.POWER_CONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(160).setType(
- BatteryEventType.POWER_DISCONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(180).setType(
- BatteryEventType.POWER_CONNECTED).build());
+ final List<AppUsagePeriod> appUsagePeriodList =
+ List.of(AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
+ final List<BatteryEvent> batteryEventList =
+ List.of(
+ BatteryEvent.newBuilder()
+ .setTimestamp(50)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(80)
+ .setType(BatteryEventType.POWER_CONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(120)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(150)
+ .setType(BatteryEventType.POWER_CONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(160)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(180)
+ .setType(BatteryEventType.POWER_CONNECTED)
+ .build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
@@ -1677,13 +2248,18 @@
@Test
public void excludePowerConnectedTime_wholePeriodNotCharging_returnExpectedResult() {
- final List<AppUsagePeriod> appUsagePeriodList = List.of(
- AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
- final List<BatteryEvent> batteryEventList = List.of(
- BatteryEvent.newBuilder().setTimestamp(50).setType(
- BatteryEventType.POWER_DISCONNECTED).build(),
- BatteryEvent.newBuilder().setTimestamp(80).setType(
- BatteryEventType.POWER_CONNECTED).build());
+ final List<AppUsagePeriod> appUsagePeriodList =
+ List.of(AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
+ final List<BatteryEvent> batteryEventList =
+ List.of(
+ BatteryEvent.newBuilder()
+ .setTimestamp(50)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build(),
+ BatteryEvent.newBuilder()
+ .setTimestamp(80)
+ .setType(BatteryEventType.POWER_CONNECTED)
+ .build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
@@ -1694,11 +2270,14 @@
@Test
public void excludePowerConnectedTime_wholePeriodInCharging_returnExpectedResult() {
- final List<AppUsagePeriod> appUsagePeriodList = List.of(
- AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
- final List<BatteryEvent> batteryEventList = List.of(
- BatteryEvent.newBuilder().setTimestamp(50).setType(
- BatteryEventType.POWER_DISCONNECTED).build());
+ final List<AppUsagePeriod> appUsagePeriodList =
+ List.of(AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
+ final List<BatteryEvent> batteryEventList =
+ List.of(
+ BatteryEvent.newBuilder()
+ .setTimestamp(50)
+ .setType(BatteryEventType.POWER_DISCONNECTED)
+ .build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
@@ -1762,32 +2341,32 @@
private static ContentValues getContentValuesWithBatteryLevel(final int level) {
final ContentValues values = new ContentValues();
final DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
- .setBatteryLevel(level)
- .build();
+ DeviceBatteryState.newBuilder().setBatteryLevel(level).build();
final BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
- .setDeviceBatteryState(deviceBatteryState)
- .build();
- values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+ BatteryInformation.newBuilder().setDeviceBatteryState(deviceBatteryState).build();
+ values.put(
+ BatteryHistEntry.KEY_BATTERY_INFORMATION,
ConvertUtils.convertBatteryInformationToString(batteryInformation));
return values;
}
private static BatteryHistEntry createBatteryHistEntry(
- final String packageName, final String appLabel, final double consumePower,
+ final String packageName,
+ final String appLabel,
+ final double consumePower,
final double foregroundUsageConsumePower,
final double foregroundServiceUsageConsumePower,
- final double backgroundUsageConsumePower, final double cachedUsageConsumePower,
- final long uid, final long userId, final int consumerType,
- final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
+ final double backgroundUsageConsumePower,
+ final double cachedUsageConsumePower,
+ final long uid,
+ final long userId,
+ final int consumerType,
+ final long foregroundUsageTimeInMs,
+ final long backgroundUsageTimeInMs,
final boolean isHidden) {
// Only insert required fields.
final BatteryInformation batteryInformation =
- BatteryInformation
- .newBuilder()
+ BatteryInformation.newBuilder()
.setAppLabel(appLabel)
.setConsumePower(consumePower)
.setForegroundUsageConsumePower(foregroundUsageConsumePower)
@@ -1803,7 +2382,8 @@
values.put(BatteryHistEntry.KEY_UID, uid);
values.put(BatteryHistEntry.KEY_USER_ID, userId);
values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, consumerType);
- values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+ values.put(
+ BatteryHistEntry.KEY_BATTERY_INFORMATION,
ConvertUtils.convertBatteryInformationToString(batteryInformation));
return new BatteryHistEntry(values);
}
@@ -1817,8 +2397,7 @@
return UsageEvents.CREATOR.createFromParcel(parcel);
}
- private Event getUsageEvent(
- final int eventType, final long timestamp) {
+ private Event getUsageEvent(final int eventType, final long timestamp) {
final Event event = new Event();
event.mEventType = eventType;
event.mPackage = "package";
@@ -1828,8 +2407,7 @@
private AppUsageEvent buildAppUsageEvent(final AppUsageEventType type, final long timestamp) {
return buildAppUsageEvent(
- type, timestamp, /*userId=*/ 1, /*instanceId=*/ 2,
- "com.android.settings");
+ type, timestamp, /* userId= */ 1, /* instanceId= */ 2, "com.android.settings");
}
private AppUsageEvent buildAppUsageEvent(
@@ -1848,10 +2426,7 @@
}
private AppUsagePeriod buildAppUsagePeriod(final long start, final long end) {
- return AppUsagePeriod.newBuilder()
- .setStartTime(start)
- .setEndTime(end)
- .build();
+ return AppUsagePeriod.newBuilder().setStartTime(start).setEndTime(end).build();
}
private void assertAppUsageEvent(
@@ -1918,12 +2493,17 @@
}
private static void assertBatteryDiffEntry(
- final BatteryDiffEntry entry, final long userId, final long uid,
- final int consumerType, final double consumePercentage,
+ final BatteryDiffEntry entry,
+ final long userId,
+ final long uid,
+ final int consumerType,
+ final double consumePercentage,
final double foregroundUsageConsumePower,
final double foregroundServiceUsageConsumePower,
- final double backgroundUsageConsumePower, final double cachedUsageConsumePower,
- final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
+ final double backgroundUsageConsumePower,
+ final double cachedUsageConsumePower,
+ final long foregroundUsageTimeInMs,
+ final long backgroundUsageTimeInMs,
final long screenOnTimeInMs) {
assertThat(entry.mUserId).isEqualTo(userId);
assertThat(entry.mUid).isEqualTo(uid);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
index 12bd457..c31a2b6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
@@ -117,9 +117,7 @@
.setType(AppUsageEventType.ACTIVITY_STOPPED)
.build();
final AppUsageEvent appUsageEvent3 =
- AppUsageEvent.newBuilder()
- .setType(AppUsageEventType.DEVICE_SHUTDOWN)
- .build();
+ AppUsageEvent.newBuilder().setType(AppUsageEventType.DEVICE_SHUTDOWN).build();
appUsageEventList.add(appUsageEvent1);
appUsageEventList.add(appUsageEvent2);
appUsageEventList.add(appUsageEvent3);
@@ -135,10 +133,9 @@
// Verifies the inserted ContentValues into content provider.
final ContentValues[] valuesArray =
new ContentValues[] {valuesList.get(0), valuesList.get(1)};
- verify(mMockContentResolver).bulkInsert(
- DatabaseUtils.APP_USAGE_EVENT_URI, valuesArray);
- verify(mMockContentResolver).notifyChange(
- DatabaseUtils.APP_USAGE_EVENT_URI, /*observer=*/ null);
+ verify(mMockContentResolver).bulkInsert(DatabaseUtils.APP_USAGE_EVENT_URI, valuesArray);
+ verify(mMockContentResolver)
+ .notifyChange(DatabaseUtils.APP_USAGE_EVENT_URI, /* observer= */ null);
}
@Test
@@ -161,12 +158,10 @@
final ContentValues contentValues =
DatabaseUtils.sendBatteryEventData(mContext, batteryEvent);
- assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_TIMESTAMP))
- .isEqualTo(10001L);
+ assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_TIMESTAMP)).isEqualTo(10001L);
assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE))
.isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber());
- assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL))
- .isEqualTo(66);
+ assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL)).isEqualTo(66);
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(DatabaseUtils.BATTERY_EVENT_URI, contentValues);
}
@@ -175,9 +170,12 @@
public void sendBatteryEntryData_nullBatteryIntent_returnsNullValue() {
doReturn(null).when(mContext).registerReceiver(any(), any());
assertThat(
- DatabaseUtils.sendBatteryEntryData(
- mContext, System.currentTimeMillis(), /*batteryEntryList=*/ null,
- mBatteryUsageStats, /*isFullChargeStart=*/ false))
+ DatabaseUtils.sendBatteryEntryData(
+ mContext,
+ System.currentTimeMillis(),
+ /* batteryEntryList= */ null,
+ mBatteryUsageStats,
+ /* isFullChargeStart= */ false))
.isNull();
}
@@ -200,7 +198,7 @@
System.currentTimeMillis(),
batteryEntryList,
mBatteryUsageStats,
- /*isFullChargeStart=*/ false);
+ /* isFullChargeStart= */ false);
assertThat(valuesList).hasSize(2);
// Verifies the ContentValues content.
@@ -209,10 +207,9 @@
// Verifies the inserted ContentValues into content provider.
final ContentValues[] valuesArray =
new ContentValues[] {valuesList.get(0), valuesList.get(1)};
- verify(mMockContentResolver).bulkInsert(
- DatabaseUtils.BATTERY_CONTENT_URI, valuesArray);
- verify(mMockContentResolver).notifyChange(
- DatabaseUtils.BATTERY_CONTENT_URI, /*observer=*/ null);
+ verify(mMockContentResolver).bulkInsert(DatabaseUtils.BATTERY_CONTENT_URI, valuesArray);
+ verify(mMockContentResolver)
+ .notifyChange(DatabaseUtils.BATTERY_CONTENT_URI, /* observer= */ null);
}
@Test
@@ -225,14 +222,14 @@
System.currentTimeMillis(),
new ArrayList<>(),
mBatteryUsageStats,
- /*isFullChargeStart=*/ false);
+ /* isFullChargeStart= */ false);
assertThat(valuesList).hasSize(1);
verifyFakeBatteryEntryContentValues(valuesList.get(0));
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(any(), any());
- verify(mMockContentResolver).notifyChange(
- DatabaseUtils.BATTERY_CONTENT_URI, /*observer=*/ null);
+ verify(mMockContentResolver)
+ .notifyChange(DatabaseUtils.BATTERY_CONTENT_URI, /* observer= */ null);
}
@Test
@@ -243,16 +240,16 @@
DatabaseUtils.sendBatteryEntryData(
mContext,
System.currentTimeMillis(),
- /*batteryEntryList=*/ null,
+ /* batteryEntryList= */ null,
mBatteryUsageStats,
- /*isFullChargeStart=*/ false);
+ /* isFullChargeStart= */ false);
assertThat(valuesList).hasSize(1);
verifyFakeBatteryEntryContentValues(valuesList.get(0));
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(any(), any());
- verify(mMockContentResolver).notifyChange(
- DatabaseUtils.BATTERY_CONTENT_URI, /*observer=*/ null);
+ verify(mMockContentResolver)
+ .notifyChange(DatabaseUtils.BATTERY_CONTENT_URI, /* observer= */ null);
}
@Test
@@ -263,16 +260,16 @@
DatabaseUtils.sendBatteryEntryData(
mContext,
System.currentTimeMillis(),
- /*batteryEntryList=*/ null,
- /*batteryUsageStats=*/ null,
- /*isFullChargeStart=*/ false);
+ /* batteryEntryList= */ null,
+ /* batteryUsageStats= */ null,
+ /* isFullChargeStart= */ false);
assertThat(valuesList).hasSize(1);
verifyFakeBatteryEntryContentValues(valuesList.get(0));
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(any(), any());
- verify(mMockContentResolver).notifyChange(
- DatabaseUtils.BATTERY_CONTENT_URI, /*observer=*/ null);
+ verify(mMockContentResolver)
+ .notifyChange(DatabaseUtils.BATTERY_CONTENT_URI, /* observer= */ null);
}
@Test
@@ -282,16 +279,20 @@
DatabaseUtils.sFakeSupplier = () -> cursor;
final long earliestTimestamp = 10001L;
- assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
- mContext, /*userId=*/ 0, earliestTimestamp)).isEqualTo(earliestTimestamp);
+ assertThat(
+ DatabaseUtils.getAppUsageStartTimestampOfUser(
+ mContext, /* userId= */ 0, earliestTimestamp))
+ .isEqualTo(earliestTimestamp);
}
@Test
public void getAppUsageStartTimestampOfUser_nullCursor_returnEarliestTimestamp() {
DatabaseUtils.sFakeSupplier = () -> null;
final long earliestTimestamp = 10001L;
- assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
- mContext, /*userId=*/ 0, earliestTimestamp)).isEqualTo(earliestTimestamp);
+ assertThat(
+ DatabaseUtils.getAppUsageStartTimestampOfUser(
+ mContext, /* userId= */ 0, earliestTimestamp))
+ .isEqualTo(earliestTimestamp);
}
@Test
@@ -304,50 +305,62 @@
DatabaseUtils.sFakeSupplier = () -> cursor;
final long earliestTimestamp1 = 1001L;
- assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
- mContext, /*userId=*/ 0, earliestTimestamp1)).isEqualTo(returnedTimestamp + 1);
+ assertThat(
+ DatabaseUtils.getAppUsageStartTimestampOfUser(
+ mContext, /* userId= */ 0, earliestTimestamp1))
+ .isEqualTo(returnedTimestamp + 1);
final long earliestTimestamp2 = 100001L;
- assertThat(DatabaseUtils.getAppUsageStartTimestampOfUser(
- mContext, /*userId=*/ 0, earliestTimestamp2)).isEqualTo(earliestTimestamp2);
+ assertThat(
+ DatabaseUtils.getAppUsageStartTimestampOfUser(
+ mContext, /* userId= */ 0, earliestTimestamp2))
+ .isEqualTo(earliestTimestamp2);
}
@Test
public void getAppUsageEventForUsers_emptyCursorContent_returnEmptyMap() {
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_UID,
- AppUsageEventEntity.KEY_USER_ID,
- AppUsageEventEntity.KEY_PACKAGE_NAME,
- AppUsageEventEntity.KEY_TIMESTAMP,
- AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_UID,
+ AppUsageEventEntity.KEY_USER_ID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_TIMESTAMP,
+ AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE
+ });
DatabaseUtils.sFakeSupplier = () -> cursor;
- assertThat(DatabaseUtils.getAppUsageEventForUsers(
- mContext,
- /*calendar=*/ null,
- /*userIds=*/ new ArrayList<>(),
- /*startTimestampOfLevelData=*/ 0)).isEmpty();
+ assertThat(
+ DatabaseUtils.getAppUsageEventForUsers(
+ mContext,
+ /* calendar= */ null,
+ /* userIds= */ new ArrayList<>(),
+ /* startTimestampOfLevelData= */ 0))
+ .isEmpty();
}
@Test
public void getAppUsageEventForUsers_nullCursor_returnEmptyMap() {
DatabaseUtils.sFakeSupplier = () -> null;
- assertThat(DatabaseUtils.getAppUsageEventForUsers(
- mContext,
- /*calendar=*/ null,
- /*userIds=*/ new ArrayList<>(),
- /*startTimestampOfLevelData=*/ 0)).isEmpty();
+ assertThat(
+ DatabaseUtils.getAppUsageEventForUsers(
+ mContext,
+ /* calendar= */ null,
+ /* userIds= */ new ArrayList<>(),
+ /* startTimestampOfLevelData= */ 0))
+ .isEmpty();
}
@Test
public void getAppUsageEventForUsers_returnExpectedMap() {
final Long timestamp1 = 1001L;
final Long timestamp2 = 1002L;
- final MatrixCursor cursor = new MatrixCursor(
- new String[]{
- AppUsageEventEntity.KEY_UID,
- AppUsageEventEntity.KEY_PACKAGE_NAME,
- AppUsageEventEntity.KEY_TIMESTAMP});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ AppUsageEventEntity.KEY_UID,
+ AppUsageEventEntity.KEY_PACKAGE_NAME,
+ AppUsageEventEntity.KEY_TIMESTAMP
+ });
// Adds fake data into the cursor.
cursor.addRow(new Object[] {101L, "app name1", timestamp1});
cursor.addRow(new Object[] {101L, "app name2", timestamp2});
@@ -355,11 +368,12 @@
cursor.addRow(new Object[] {101L, "app name4", timestamp2});
DatabaseUtils.sFakeSupplier = () -> cursor;
- final List<AppUsageEvent> appUsageEventList = DatabaseUtils.getAppUsageEventForUsers(
- mContext,
- /*calendar=*/ null,
- /*userIds=*/ new ArrayList<>(),
- /*startTimestampOfLevelData=*/ 0);
+ final List<AppUsageEvent> appUsageEventList =
+ DatabaseUtils.getAppUsageEventForUsers(
+ mContext,
+ /* calendar= */ null,
+ /* userIds= */ new ArrayList<>(),
+ /* startTimestampOfLevelData= */ 0);
assertThat(appUsageEventList.get(0).getPackageName()).isEqualTo("app name1");
assertThat(appUsageEventList.get(1).getPackageName()).isEqualTo("app name2");
@@ -369,11 +383,13 @@
@Test
public void getHistoryMap_emptyCursorContent_returnEmptyMap() {
- final MatrixCursor cursor = new MatrixCursor(
- new String[] {
- BatteryHistEntry.KEY_UID,
- BatteryHistEntry.KEY_USER_ID,
- BatteryHistEntry.KEY_TIMESTAMP});
+ final MatrixCursor cursor =
+ new MatrixCursor(
+ new String[] {
+ BatteryHistEntry.KEY_UID,
+ BatteryHistEntry.KEY_USER_ID,
+ BatteryHistEntry.KEY_TIMESTAMP
+ });
DatabaseUtils.sFakeSupplier = () -> cursor;
assertThat(DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, 0)).isEmpty();
@@ -391,14 +407,22 @@
final Long timestamp2 = Long.valueOf(1002L);
final MatrixCursor cursor = getMatrixCursor();
// Adds fake data into the cursor.
- cursor.addRow(new Object[] {
- "app name1", timestamp1, 1, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, true});
- cursor.addRow(new Object[] {
- "app name2", timestamp2, 2, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false});
- cursor.addRow(new Object[] {
- "app name3", timestamp2, 3, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false});
- cursor.addRow(new Object[] {
- "app name4", timestamp2, 4, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false});
+ cursor.addRow(
+ new Object[] {
+ "app name1", timestamp1, 1, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, true
+ });
+ cursor.addRow(
+ new Object[] {
+ "app name2", timestamp2, 2, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false
+ });
+ cursor.addRow(
+ new Object[] {
+ "app name3", timestamp2, 3, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false
+ });
+ cursor.addRow(
+ new Object[] {
+ "app name4", timestamp2, 4, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false
+ });
DatabaseUtils.sFakeSupplier = () -> cursor;
final Map<Long, Map<String, BatteryHistEntry>> batteryHistMap =
@@ -421,8 +445,9 @@
public void getHistoryMap_withWorkProfile_returnExpectedMap()
throws PackageManager.NameNotFoundException {
doReturn("com.fake.package").when(mContext).getPackageName();
- doReturn(mMockContext).when(mContext).createPackageContextAsUser(
- "com.fake.package", /*flags=*/ 0, UserHandle.OWNER);
+ doReturn(mMockContext)
+ .when(mContext)
+ .createPackageContextAsUser("com.fake.package", /* flags= */ 0, UserHandle.OWNER);
doReturn(UserHandle.CURRENT).when(mContext).getUser();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(true).when(mUserManager).isManagedProfile();
@@ -440,9 +465,8 @@
public void removeUsageSource_hasNoData() {
DatabaseUtils.removeUsageSource(mContext);
assertThat(
- DatabaseUtils
- .getSharedPreferences(mContext)
- .contains(DatabaseUtils.KEY_LAST_USAGE_SOURCE))
+ DatabaseUtils.getSharedPreferences(mContext)
+ .contains(DatabaseUtils.KEY_LAST_USAGE_SOURCE))
.isFalse();
}
@@ -457,9 +481,8 @@
DatabaseUtils.removeUsageSource(mContext);
assertThat(
- DatabaseUtils
- .getSharedPreferences(mContext)
- .contains(DatabaseUtils.KEY_LAST_USAGE_SOURCE))
+ DatabaseUtils.getSharedPreferences(mContext)
+ .contains(DatabaseUtils.KEY_LAST_USAGE_SOURCE))
.isFalse();
}
@@ -482,9 +505,10 @@
assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager))
.isEqualTo(USAGE_SOURCE_TASK_ROOT_ACTIVITY);
assertThat(
- DatabaseUtils
- .getSharedPreferences(mContext)
- .getInt(DatabaseUtils.KEY_LAST_USAGE_SOURCE, USAGE_SOURCE_CURRENT_ACTIVITY))
+ DatabaseUtils.getSharedPreferences(mContext)
+ .getInt(
+ DatabaseUtils.KEY_LAST_USAGE_SOURCE,
+ USAGE_SOURCE_CURRENT_ACTIVITY))
.isEqualTo(USAGE_SOURCE_TASK_ROOT_ACTIVITY);
}
@@ -495,9 +519,10 @@
assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager))
.isEqualTo(USAGE_SOURCE_CURRENT_ACTIVITY);
assertThat(
- DatabaseUtils
- .getSharedPreferences(mContext)
- .getInt(DatabaseUtils.KEY_LAST_USAGE_SOURCE, USAGE_SOURCE_CURRENT_ACTIVITY))
+ DatabaseUtils.getSharedPreferences(mContext)
+ .getInt(
+ DatabaseUtils.KEY_LAST_USAGE_SOURCE,
+ USAGE_SOURCE_CURRENT_ACTIVITY))
.isEqualTo(USAGE_SOURCE_CURRENT_ACTIVITY);
}
@@ -506,20 +531,16 @@
final String preferenceKey = "test_preference_key";
DatabaseUtils.recordDateTime(mContext, preferenceKey);
- assertThat(DatabaseUtils.getSharedPreferences(mContext).contains(preferenceKey))
- .isTrue();
+ assertThat(DatabaseUtils.getSharedPreferences(mContext).contains(preferenceKey)).isTrue();
}
@Test
public void dump_dumpExpectedData() {
- DatabaseUtils.recordDateTime(mContext,
- Intent.ACTION_BATTERY_LEVEL_CHANGED);
- DatabaseUtils.recordDateTime(mContext,
- BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
- DatabaseUtils.recordDateTime(mContext,
- DatabaseUtils.KEY_LAST_LOAD_FULL_CHARGE_TIME);
- DatabaseUtils.recordDateTime(mContext,
- DatabaseUtils.KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
+ DatabaseUtils.recordDateTime(mContext, Intent.ACTION_BATTERY_LEVEL_CHANGED);
+ DatabaseUtils.recordDateTime(
+ mContext, BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
+ DatabaseUtils.recordDateTime(mContext, DatabaseUtils.KEY_LAST_LOAD_FULL_CHARGE_TIME);
+ DatabaseUtils.recordDateTime(mContext, DatabaseUtils.KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
final StringWriter stringWriter = new StringWriter();
final PrintWriter printWriter = new PrintWriter(stringWriter);
@@ -570,8 +591,7 @@
.isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
assertThat(deviceBatteryState.getBatteryHealth())
.isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
- assertThat(values.getAsString("packageName"))
- .isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
+ assertThat(values.getAsString("packageName")).isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
}
private static Intent getBatteryIntent() {
@@ -586,10 +606,11 @@
private static MatrixCursor getMatrixCursor() {
return new MatrixCursor(
new String[] {
- BatteryHistEntry.KEY_PACKAGE_NAME,
- BatteryHistEntry.KEY_TIMESTAMP,
- BatteryHistEntry.KEY_UID,
- BatteryHistEntry.KEY_CONSUMER_TYPE,
- BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START});
+ BatteryHistEntry.KEY_PACKAGE_NAME,
+ BatteryHistEntry.KEY_TIMESTAMP,
+ BatteryHistEntry.KEY_UID,
+ BatteryHistEntry.KEY_CONSUMER_TYPE,
+ BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START
+ });
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManagerTest.java
index efbce12..6990535 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManagerTest.java
@@ -57,7 +57,7 @@
@Test
public void refreshJob_refreshesAlarmJob() {
- mPeriodicJobManager.refreshJob(/*fromBoot=*/ false);
+ mPeriodicJobManager.refreshJob(/* fromBoot= */ false);
final ShadowAlarmManager.ScheduledAlarm alarm =
mShadowAlarmManager.peekNextScheduledAlarm();
@@ -71,12 +71,13 @@
public void getTriggerAtMillis_withoutOffset_returnsExpectedResult() {
long timeSlotUnit = PeriodicJobManager.DATA_FETCH_INTERVAL_MINUTE;
// Sets the current time.
- Duration currentTimeDuration =
- Duration.ofMinutes(timeSlotUnit * 2);
+ Duration currentTimeDuration = Duration.ofMinutes(timeSlotUnit * 2);
FakeClock fakeClock = new FakeClock();
fakeClock.setCurrentTime(currentTimeDuration);
- assertThat(PeriodicJobManager.getTriggerAtMillis(mContext, fakeClock, /*fromBoot=*/ false))
+ assertThat(
+ PeriodicJobManager.getTriggerAtMillis(
+ mContext, fakeClock, /* fromBoot= */ false))
.isEqualTo(currentTimeDuration.plusMinutes(timeSlotUnit).toMillis());
}
@@ -86,10 +87,9 @@
// Sets the current time.
Duration currentTimeDuration = Duration.ofMinutes(timeSlotUnit * 2);
FakeClock fakeClock = new FakeClock();
- fakeClock.setCurrentTime(
- currentTimeDuration.plusMinutes(1L).plusMillis(51L));
+ fakeClock.setCurrentTime(currentTimeDuration.plusMinutes(1L).plusMillis(51L));
- assertThat(PeriodicJobManager.getTriggerAtMillis(mContext, fakeClock, /*fromBoot=*/ true))
+ assertThat(PeriodicJobManager.getTriggerAtMillis(mContext, fakeClock, /* fromBoot= */ true))
.isEqualTo(currentTimeDuration.plusMinutes(timeSlotUnit).toMillis());
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java
index c9a3e64..d111de2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java
@@ -86,14 +86,14 @@
@Test
public void onReceive_nullIntent_notRefreshesJob() {
- mReceiver.onReceive(mContext, /*intent=*/ null);
+ mReceiver.onReceive(mContext, /* intent= */ null);
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull();
}
@Test
public void onReceive_containsExpiredData_clearsExpiredDataFromDatabase()
throws InterruptedException {
- insertExpiredData(/*shiftDay=*/ DatabaseUtils.DATA_RETENTION_INTERVAL_DAY);
+ insertExpiredData(/* shiftDay= */ DatabaseUtils.DATA_RETENTION_INTERVAL_DAY);
mReceiver.onReceive(mContext, JOB_UPDATE_INTENT);
@@ -104,7 +104,7 @@
@Test
public void onReceive_withoutExpiredData_notClearsExpiredDataFromDatabase()
throws InterruptedException {
- insertExpiredData(/*shiftDay=*/ DatabaseUtils.DATA_RETENTION_INTERVAL_DAY - 1);
+ insertExpiredData(/* shiftDay= */ DatabaseUtils.DATA_RETENTION_INTERVAL_DAY - 1);
mReceiver.onReceive(mContext, JOB_UPDATE_INTENT);
@@ -129,5 +129,4 @@
// Ensures the testing environment is correct.
assertThat(mDao.getAllAfter(0)).hasSize(3);
}
-
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreferenceTest.java
index 22509de..ef4460b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreferenceTest.java
@@ -53,8 +53,12 @@
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
- mRootView = LayoutInflater.from(mContext)
- .inflate(com.android.settingslib.widget.preference.app.R.layout.preference_app, null);
+ mRootView =
+ LayoutInflater.from(mContext)
+ .inflate(
+ com.android.settingslib.widget.preference.app.R.layout
+ .preference_app,
+ null);
mWidgetView =
LayoutInflater.from(mContext).inflate(R.layout.preference_widget_summary, null);
final LinearLayout widgetFrame = mRootView.findViewById(android.R.id.widget_frame);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
index 9753bd2..6c09e78 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
@@ -55,14 +55,10 @@
private Predicate<PowerAnomalyEvent> mCardFilterPredicate;
private Predicate<PowerAnomalyEvent> mSlotFilterPredicate;
- @Mock
- private BatteryTipsController mBatteryTipsController;
- @Mock
- private BatteryChartPreferenceController mBatteryChartPreferenceController;
- @Mock
- private ScreenOnTimeController mScreenOnTimeController;
- @Mock
- private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
+ @Mock private BatteryTipsController mBatteryTipsController;
+ @Mock private BatteryChartPreferenceController mBatteryChartPreferenceController;
+ @Mock private ScreenOnTimeController mScreenOnTimeController;
+ @Mock private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
@Before
public void setUp() {
@@ -75,10 +71,13 @@
mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
mPowerUsageAdvanced.mScreenOnTimeController = mScreenOnTimeController;
mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
- mPowerUsageAdvanced.mBatteryLevelData = Optional.of(new BatteryLevelData(Map.of(
- 1694354400000L, 1, // 2023-09-10 22:00:00
- 1694361600000L, 2, // 2023-09-11 00:00:00
- 1694368800000L, 3))); // 2023-09-11 02:00:00
+ mPowerUsageAdvanced.mBatteryLevelData =
+ Optional.of(
+ new BatteryLevelData(
+ Map.of(
+ 1694354400000L, 1, // 2023-09-10 22:00:00
+ 1694361600000L, 2, // 2023-09-11 00:00:00
+ 1694368800000L, 3))); // 2023-09-11 02:00:00
doReturn(mContext).when(mPowerUsageAdvanced).getContext();
mSlotFilterPredicate = PowerAnomalyEvent::hasWarningItemInfo;
}
@@ -86,15 +85,17 @@
@Test
public void getFilterAnomalyEvent_withEmptyOrNullList_getNull() {
prepareCardFilterPredicate(null);
- assertThat(PowerUsageAdvanced
- .getAnomalyEvent(null, mCardFilterPredicate)).isNull();
- assertThat(PowerUsageAdvanced
- .getAnomalyEvent(null, mSlotFilterPredicate)).isNull();
- assertThat(PowerUsageAdvanced.getAnomalyEvent(
- BatteryTestUtils.createEmptyPowerAnomalyEventList(), mCardFilterPredicate))
+ assertThat(PowerUsageAdvanced.getAnomalyEvent(null, mCardFilterPredicate)).isNull();
+ assertThat(PowerUsageAdvanced.getAnomalyEvent(null, mSlotFilterPredicate)).isNull();
+ assertThat(
+ PowerUsageAdvanced.getAnomalyEvent(
+ BatteryTestUtils.createEmptyPowerAnomalyEventList(),
+ mCardFilterPredicate))
.isNull();
- assertThat(PowerUsageAdvanced.getAnomalyEvent(
- BatteryTestUtils.createEmptyPowerAnomalyEventList(), mSlotFilterPredicate))
+ assertThat(
+ PowerUsageAdvanced.getAnomalyEvent(
+ BatteryTestUtils.createEmptyPowerAnomalyEventList(),
+ mSlotFilterPredicate))
.isNull();
}
@@ -104,12 +105,10 @@
BatteryTestUtils.createNonEmptyPowerAnomalyEventList();
final PowerAnomalyEvent slotEvent =
- PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
- mSlotFilterPredicate);
+ PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList, mSlotFilterPredicate);
prepareCardFilterPredicate(slotEvent);
final PowerAnomalyEvent cardEvent =
- PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
- mCardFilterPredicate);
+ PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList, mCardFilterPredicate);
assertThat(cardEvent).isEqualTo(BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent());
assertThat(slotEvent).isNull();
@@ -123,12 +122,10 @@
DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, PowerAnomalyKey.KEY_BRIGHTNESS.name());
final PowerAnomalyEvent slotEvent =
- PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
- mSlotFilterPredicate);
+ PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList, mSlotFilterPredicate);
prepareCardFilterPredicate(slotEvent);
final PowerAnomalyEvent cardEvent =
- PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
- mCardFilterPredicate);
+ PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList, mCardFilterPredicate);
assertThat(cardEvent).isEqualTo(BatteryTestUtils.createScreenTimeoutAnomalyEvent());
assertThat(slotEvent).isNull();
@@ -144,12 +141,10 @@
}
final PowerAnomalyEvent slotEvent =
- PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
- mSlotFilterPredicate);
+ PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList, mSlotFilterPredicate);
prepareCardFilterPredicate(slotEvent);
final PowerAnomalyEvent cardEvent =
- PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
- mCardFilterPredicate);
+ PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList, mCardFilterPredicate);
assertThat(cardEvent).isNull();
assertThat(slotEvent).isNull();
@@ -165,9 +160,10 @@
.isEqualTo(event.getEventId());
verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyRejectListener(isNull());
- verify(mPowerUsageAdvanced.mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
- eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
- eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ verify(mPowerUsageAdvanced.mBatteryChartPreferenceController)
+ .onHighlightSlotIndexUpdate(
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
}
@Test
@@ -180,10 +176,14 @@
.isEqualTo(event.getEventId());
verify(mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
verify(mBatteryTipsController).setOnAnomalyRejectListener(isNull());
- assertThat(mPowerUsageAdvanced.mBatteryLevelData.get().getIndexByTimestamps(
- event.getWarningItemInfo().getStartTimestamp(),
- event.getWarningItemInfo().getEndTimestamp()
- )).isEqualTo(Pair.create(1, 0));
+ assertThat(
+ mPowerUsageAdvanced
+ .mBatteryLevelData
+ .get()
+ .getIndexByTimestamps(
+ event.getWarningItemInfo().getStartTimestamp(),
+ event.getWarningItemInfo().getEndTimestamp()))
+ .isEqualTo(Pair.create(1, 0));
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
}
@@ -192,8 +192,7 @@
public void onDisplayAnomalyEventUpdated_withSettingsCardAndAppsSlotEvent_showExpected() {
final PowerAnomalyEvent settingsEvent =
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
- final PowerAnomalyEvent appsEvent =
- BatteryTestUtils.createAppAnomalyEvent();
+ final PowerAnomalyEvent appsEvent = BatteryTestUtils.createAppAnomalyEvent();
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(settingsEvent, appsEvent);
@@ -207,8 +206,9 @@
private void prepareCardFilterPredicate(PowerAnomalyEvent slotEvent) {
final Set<String> dismissedPowerAnomalyKeys =
DatabaseUtils.getDismissedPowerAnomalyKeys(mContext);
- mCardFilterPredicate = event -> !dismissedPowerAnomalyKeys.contains(
- event.getDismissRecordKey())
- && (event.equals(slotEvent) || !event.hasWarningItemInfo());
+ mCardFilterPredicate =
+ event ->
+ !dismissedPowerAnomalyKeys.contains(event.getDismissRecordKey())
+ && (event.equals(slotEvent) || !event.hasWarningItemInfo());
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBaseTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBaseTest.java
index 68766e6..399101b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBaseTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageBaseTest.java
@@ -52,10 +52,8 @@
@Config(shadows = ShadowDashboardFragment.class)
public class PowerUsageBaseTest {
- @Mock
- private LoaderManager mLoaderManager;
- @Mock
- private Loader<BatteryUsageStats> mBatteryUsageStatsLoader;
+ @Mock private LoaderManager mLoaderManager;
+ @Mock private Loader<BatteryUsageStats> mBatteryUsageStatsLoader;
private TestFragment mFragment;
@Before
@@ -77,16 +75,19 @@
final Bundle bundle = new Bundle();
bundle.putInt(KEY_REFRESH_TYPE, BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_STATUS);
bundle.putBoolean(KEY_INCLUDE_HISTORY, false);
- doReturn(mBatteryUsageStatsLoader).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER);
+ doReturn(mBatteryUsageStatsLoader)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER);
doReturn(false).when(mBatteryUsageStatsLoader).isReset();
mFragment.restartBatteryStatsLoader(
BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_STATUS);
verify(mLoaderManager)
- .restartLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER),
- refEq(bundle), any());
+ .restartLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER),
+ refEq(bundle),
+ any());
}
@Test
@@ -94,16 +95,19 @@
final Bundle bundle = new Bundle();
bundle.putInt(KEY_REFRESH_TYPE, BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_STATUS);
bundle.putBoolean(KEY_INCLUDE_HISTORY, false);
- doReturn(mBatteryUsageStatsLoader).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER);
+ doReturn(mBatteryUsageStatsLoader)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER);
doReturn(true).when(mBatteryUsageStatsLoader).isReset();
mFragment.restartBatteryStatsLoader(
BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_STATUS);
verify(mLoaderManager)
- .initLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER),
- refEq(bundle), any());
+ .initLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER),
+ refEq(bundle),
+ any());
}
@Test
@@ -111,14 +115,18 @@
final Bundle bundle = new Bundle();
bundle.putInt(KEY_REFRESH_TYPE, BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_STATUS);
bundle.putBoolean(KEY_INCLUDE_HISTORY, false);
- doReturn(null).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER);
+ doReturn(null)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER);
mFragment.restartBatteryStatsLoader(
BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_STATUS);
- verify(mLoaderManager).initLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER),
- refEq(bundle), any());
+ verify(mLoaderManager)
+ .initLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_USAGE_STATS_LOADER),
+ refEq(bundle),
+ any());
}
private static class TestFragment extends PowerUsageBase {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
index 579d4a9..19d5e59 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
@@ -70,9 +70,10 @@
// TODO: Improve this test class so that it starts up the real activity and fragment.
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {
- com.android.settings.testutils.shadow.ShadowFragment.class,
-})
+@Config(
+ shadows = {
+ com.android.settings.testutils.shadow.ShadowFragment.class,
+ })
public class PowerUsageSummaryTest {
private static Intent sAdditionalBatteryInfoIntent;
@@ -81,26 +82,16 @@
sAdditionalBatteryInfoIntent = new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
}
- @Mock
- private SettingsActivity mSettingsActivity;
- @Mock
- private LoaderManager mLoaderManager;
- @Mock
- private Loader<BatteryTip> mBatteryTipLoader;
- @Mock
- private Loader<BatteryInfo> mBatteryInfoLoader;
- @Mock
- private ContentResolver mContentResolver;
- @Mock
- private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
- @Mock
- private VisibilityLoggerMixin mVisibilityLoggerMixin;
- @Mock
- private PreferenceScreen mPreferenceScreen;
- @Mock
- private Preference mBatteryUsagePreference;
- @Mock
- private Preference mHelpPreference;
+ @Mock private SettingsActivity mSettingsActivity;
+ @Mock private LoaderManager mLoaderManager;
+ @Mock private Loader<BatteryTip> mBatteryTipLoader;
+ @Mock private Loader<BatteryInfo> mBatteryInfoLoader;
+ @Mock private ContentResolver mContentResolver;
+ @Mock private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
+ @Mock private VisibilityLoggerMixin mVisibilityLoggerMixin;
+ @Mock private PreferenceScreen mPreferenceScreen;
+ @Mock private Preference mBatteryUsagePreference;
+ @Mock private Preference mHelpPreference;
private Context mRealContext;
private TestFragment mFragment;
@@ -120,8 +111,8 @@
.thenReturn(sAdditionalBatteryInfoIntent);
mFragment.mBatteryUtils = Mockito.spy(new BatteryUtils(mRealContext));
ReflectionHelpers.setField(mFragment, "mVisibilityLoggerMixin", mVisibilityLoggerMixin);
- ReflectionHelpers.setField(mFragment, "mBatteryBroadcastReceiver",
- mBatteryBroadcastReceiver);
+ ReflectionHelpers.setField(
+ mFragment, "mBatteryBroadcastReceiver", mBatteryBroadcastReceiver);
doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
when(mFragment.getContentResolver()).thenReturn(mContentResolver);
when(mFragment.findPreference(KEY_BATTERY_USAGE)).thenReturn(mBatteryUsagePreference);
@@ -157,42 +148,46 @@
@Test
public void restartBatteryTipLoader() {
- //TODO: add policy logic here when BatteryTipPolicy is implemented
- doReturn(mBatteryTipLoader).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER);
+ // TODO: add policy logic here when BatteryTipPolicy is implemented
+ doReturn(mBatteryTipLoader)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER);
doReturn(false).when(mBatteryTipLoader).isReset();
mFragment.restartBatteryTipLoader();
- verify(mLoaderManager).restartLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER),
- eq(Bundle.EMPTY), any());
+ verify(mLoaderManager)
+ .restartLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER), eq(Bundle.EMPTY), any());
}
@Test
public void restartBatteryTipLoader_nullLoader_initLoader() {
- doReturn(null).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER);
+ doReturn(null)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER);
mFragment.restartBatteryTipLoader();
- verify(mLoaderManager).initLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER),
- eq(Bundle.EMPTY), any());
+ verify(mLoaderManager)
+ .initLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER), eq(Bundle.EMPTY), any());
}
@Test
public void restartBatteryTipLoader_loaderReset_initLoader() {
- doReturn(mBatteryTipLoader).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER);
+ doReturn(mBatteryTipLoader)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER);
doReturn(true).when(mBatteryTipLoader).isReset();
mFragment.restartBatteryTipLoader();
-
- verify(mLoaderManager).initLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER),
- eq(Bundle.EMPTY), any());
+ verify(mLoaderManager)
+ .initLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_TIP_LOADER), eq(Bundle.EMPTY), any());
}
-
@Test
public void refreshUi_contextNull_doNothing() {
doReturn(null).when(mFragment).getContext();
@@ -256,18 +251,19 @@
public void onResume_registerContentObserver() {
mFragment.onResume();
- verify(mContentResolver).registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
- false,
- mFragment.mSettingsObserver);
+ verify(mContentResolver)
+ .registerContentObserver(
+ Settings.Global.getUriFor(
+ Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
+ false,
+ mFragment.mSettingsObserver);
}
@Test
public void onPause_unregisterContentObserver() {
mFragment.onPause();
- verify(mContentResolver).unregisterContentObserver(
- mFragment.mSettingsObserver);
+ verify(mContentResolver).unregisterContentObserver(mFragment.mSettingsObserver);
}
@Test
@@ -276,9 +272,11 @@
mFragment.restartBatteryInfoLoader();
- verify(mLoaderManager, never()).restartLoader(
- PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER, Bundle.EMPTY,
- mFragment.mBatteryInfoLoaderCallbacks);
+ verify(mLoaderManager, never())
+ .restartLoader(
+ PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER,
+ Bundle.EMPTY,
+ mFragment.mBatteryInfoLoaderCallbacks);
}
@Test
@@ -287,45 +285,59 @@
mFragment.restartBatteryInfoLoader();
- verify(mLoaderManager, never()).restartLoader(
- PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER, Bundle.EMPTY,
- mFragment.mBatteryInfoLoaderCallbacks);
+ verify(mLoaderManager, never())
+ .restartLoader(
+ PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER,
+ Bundle.EMPTY,
+ mFragment.mBatteryInfoLoaderCallbacks);
}
@Test
public void restartBatteryInfoLoader() {
- doReturn(mBatteryInfoLoader).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER);
+ doReturn(mBatteryInfoLoader)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER);
doReturn(false).when(mBatteryTipLoader).isReset();
mFragment.restartBatteryInfoLoader();
- verify(mLoaderManager).restartLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER),
- eq(Bundle.EMPTY), any());
+ verify(mLoaderManager)
+ .restartLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER),
+ eq(Bundle.EMPTY),
+ any());
}
@Test
public void restartBatteryInfoLoader_nullLoader_initLoader() {
- doReturn(null).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER);
+ doReturn(null)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER);
mFragment.restartBatteryInfoLoader();
- verify(mLoaderManager).initLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER),
- eq(Bundle.EMPTY), any());
+ verify(mLoaderManager)
+ .initLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER),
+ eq(Bundle.EMPTY),
+ any());
}
@Test
public void restartBatteryInfoLoader_loaderReset_initLoader() {
mFragment.setIsBatteryPresent(true);
- doReturn(mBatteryInfoLoader).when(mLoaderManager).getLoader(
- PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER);
+ doReturn(mBatteryInfoLoader)
+ .when(mLoaderManager)
+ .getLoader(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER);
doReturn(true).when(mBatteryInfoLoader).isReset();
mFragment.restartBatteryInfoLoader();
- verify(mLoaderManager).initLoader(eq(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER),
- eq(Bundle.EMPTY), any());
+ verify(mLoaderManager)
+ .initLoader(
+ eq(PowerUsageBase.LoaderIndex.BATTERY_INFO_LOADER),
+ eq(Bundle.EMPTY),
+ any());
}
private static class TestFragment extends PowerUsageSummary {
@@ -357,5 +369,4 @@
return mLoaderManager;
}
}
-
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java
index acf4a2e..282ec9e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java
@@ -46,10 +46,8 @@
private Context mContext;
private ScreenOnTimeController mScreenOnTimeController;
- @Mock
- private PreferenceCategory mRootPreference;
- @Mock
- private TextViewPreference mScreenOnTimeTextPreference;
+ @Mock private PreferenceCategory mRootPreference;
+ @Mock private TextViewPreference mScreenOnTimeTextPreference;
@Before
public void setUp() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreferenceTest.java
index 4c2192c..8050984 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreferenceTest.java
@@ -42,14 +42,13 @@
private Context mContext;
private SpinnerPreference mSpinnerPreference;
- @Mock
- private Spinner mMockSpinner;
+ @Mock private Spinner mMockSpinner;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- mSpinnerPreference = new SpinnerPreference(mContext, /*attrs=*/ null);
+ mSpinnerPreference = new SpinnerPreference(mContext, /* attrs= */ null);
}
@Test
@@ -59,7 +58,7 @@
@Test
public void initializeSpinner_returnExpectedResult() {
- final String[] items = new String[]{"item1", "item2"};
+ final String[] items = new String[] {"item1", "item2"};
mSpinnerPreference.initializeSpinner(items, null);
assertThat(mSpinnerPreference.mItems).isEqualTo(items);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TextViewPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TextViewPreferenceTest.java
index ca7e9dd..caccc87 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TextViewPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TextViewPreferenceTest.java
@@ -41,13 +41,13 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- mTextViewPreference = new TextViewPreference(mContext, /*attrs=*/ null);
+ mTextViewPreference = new TextViewPreference(mContext, /* attrs= */ null);
}
@Test
public void constructor_returnExpectedResult() {
- assertThat(mTextViewPreference.getLayoutResource()).isEqualTo(
- R.layout.preference_text_view);
+ assertThat(mTextViewPreference.getLayoutResource())
+ .isEqualTo(R.layout.preference_text_view);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TimestampUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TimestampUtilsTest.java
index 23787c7..1aae61c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TimestampUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TimestampUtilsTest.java
@@ -36,11 +36,9 @@
@Test
public void getNextHourTimestamp_returnExpectedResult() {
// 2021-02-28 06:00:00 => 2021-02-28 07:00:00
- assertThat(TimestampUtils.getNextHourTimestamp(1614463200000L))
- .isEqualTo(1614466800000L);
+ assertThat(TimestampUtils.getNextHourTimestamp(1614463200000L)).isEqualTo(1614466800000L);
// 2021-12-31 23:59:59 => 2022-01-01 00:00:00
- assertThat(TimestampUtils.getNextHourTimestamp(16409663999999L))
- .isEqualTo(16409664000000L);
+ assertThat(TimestampUtils.getNextHourTimestamp(16409663999999L)).isEqualTo(16409664000000L);
}
@Test
@@ -66,11 +64,9 @@
@Test
public void getTimestampOfNextDay_returnExpectedResult() {
// 2021-02-28 06:00:00 => 2021-03-01 00:00:00
- assertThat(TimestampUtils.getNextDayTimestamp(1614463200000L))
- .isEqualTo(1614528000000L);
+ assertThat(TimestampUtils.getNextDayTimestamp(1614463200000L)).isEqualTo(1614528000000L);
// 2021-12-31 16:00:00 => 2022-01-01 00:00:00
- assertThat(TimestampUtils.getNextDayTimestamp(1640937600000L))
- .isEqualTo(1640966400000L);
+ assertThat(TimestampUtils.getNextDayTimestamp(1640937600000L)).isEqualTo(1640966400000L);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java
index 45d4065..d998106 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProviderTest.java
@@ -52,7 +52,7 @@
mPrintWriter = new PrintWriter(mStringWriter);
mContext = ApplicationProvider.getApplicationContext();
mBugReportContentProvider = new BugReportContentProvider();
- mBugReportContentProvider.attachInfo(mContext, /*info=*/ null);
+ mBugReportContentProvider.attachInfo(mContext, /* info= */ null);
// Inserts fake data into database for testing.
BatteryTestUtils.setUpBatteryStateDatabase(mContext);
BatteryTestUtils.insertDataToBatteryStateTable(
@@ -60,15 +60,15 @@
BatteryTestUtils.insertDataToBatteryStateTable(
mContext, System.currentTimeMillis(), PACKAGE_NAME2);
BatteryTestUtils.insertDataToAppUsageEventTable(
- mContext, /*userId=*/ 1, System.currentTimeMillis(), PACKAGE_NAME3);
+ mContext, /* userId= */ 1, System.currentTimeMillis(), PACKAGE_NAME3);
BatteryTestUtils.insertDataToAppUsageEventTable(
- mContext, /*userId=*/ 1, System.currentTimeMillis(), PACKAGE_NAME4);
+ mContext, /* userId= */ 1, System.currentTimeMillis(), PACKAGE_NAME4);
}
@Test
public void dump_nullContext_notDumpsBatteryUsageData() {
mBugReportContentProvider = new BugReportContentProvider();
- mBugReportContentProvider.attachInfo(/*context=*/ null, /*info=*/ null);
+ mBugReportContentProvider.attachInfo(/* context= */ null, /* info= */ null);
mBugReportContentProvider.dump(FileDescriptor.out, mPrintWriter, new String[] {});
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDaoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDaoTest.java
index 4883d4f..219120e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDaoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventDaoTest.java
@@ -61,13 +61,13 @@
BatteryTestUtils.insertDataToAppUsageEventTable(
mContext, USER_ID2, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToAppUsageEventTable(
- mContext, USER_ID1, TIMESTAMP1, PACKAGE_NAME1, /*multiple=*/ true);
+ mContext, USER_ID1, TIMESTAMP1, PACKAGE_NAME1, /* multiple= */ true);
}
@After
public void closeDb() {
mDatabase.close();
- BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
+ BatteryStateDatabase.setBatteryStateDatabase(/* database= */ null);
}
@Test
@@ -147,7 +147,7 @@
@Test
public void getInstance_createNewInstance() throws Exception {
- BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
+ BatteryStateDatabase.setBatteryStateDatabase(/* database= */ null);
assertThat(BatteryStateDatabase.getInstance(mContext)).isNotNull();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntityTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntityTest.java
index 3cbf845..eb72b96 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntityTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/AppUsageEventEntityTest.java
@@ -35,16 +35,16 @@
final int instanceId = 100001;
final String taskRootPackageName = "com.android.settings2";
- AppUsageEventEntity entity = AppUsageEventEntity
- .newBuilder()
- .setUid(uid)
- .setUserId(userId)
- .setTimestamp(timestamp)
- .setAppUsageEventType(appUsageEventType)
- .setPackageName(packageName)
- .setInstanceId(instanceId)
- .setTaskRootPackageName(taskRootPackageName)
- .build();
+ AppUsageEventEntity entity =
+ AppUsageEventEntity.newBuilder()
+ .setUid(uid)
+ .setUserId(userId)
+ .setTimestamp(timestamp)
+ .setAppUsageEventType(appUsageEventType)
+ .setPackageName(packageName)
+ .setInstanceId(instanceId)
+ .setTaskRootPackageName(taskRootPackageName)
+ .build();
// Verifies the app relative information.
assertThat(entity.uid).isEqualTo(uid);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java
index 8462867..d36f2b5 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventDaoTest.java
@@ -57,22 +57,23 @@
@After
public void closeDb() {
mDatabase.close();
- BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
+ BatteryStateDatabase.setBatteryStateDatabase(/* database= */ null);
}
-
@Test
public void getLastFullChargeTimestamp_normalFlow_expectedBehavior() throws Exception {
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(TIMESTAMP1)
- .setBatteryEventType(3)
- .setBatteryLevel(100)
- .build());
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(TIMESTAMP2)
- .setBatteryEventType(4)
- .setBatteryLevel(96)
- .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(TIMESTAMP1)
+ .setBatteryEventType(3)
+ .setBatteryLevel(100)
+ .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(TIMESTAMP2)
+ .setBatteryEventType(4)
+ .setBatteryLevel(96)
+ .build());
final Cursor cursor = mBatteryEventDao.getLastFullChargeTimestamp();
assertThat(cursor.getCount()).isEqualTo(1);
@@ -83,11 +84,12 @@
@Test
public void getLastFullChargeTimestamp_noLastFullChargeTime_returns0() throws Exception {
mBatteryEventDao.clearAll();
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(TIMESTAMP2)
- .setBatteryEventType(4)
- .setBatteryLevel(96)
- .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(TIMESTAMP2)
+ .setBatteryEventType(4)
+ .setBatteryLevel(96)
+ .build());
final Cursor cursor = mBatteryEventDao.getLastFullChargeTimestamp();
@@ -98,26 +100,25 @@
@Test
public void getAllAfter_normalFlow_returnExpectedResult() {
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(100L)
- .setBatteryEventType(1)
- .setBatteryLevel(66)
- .build());
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(200L)
- .setBatteryEventType(2)
- .setBatteryLevel(88)
- .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(100L)
+ .setBatteryEventType(1)
+ .setBatteryLevel(66)
+ .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(200L)
+ .setBatteryEventType(2)
+ .setBatteryLevel(88)
+ .build());
final Cursor cursor = mBatteryEventDao.getAllAfter(160L, List.of(1, 2));
assertThat(cursor.getCount()).isEqualTo(1);
cursor.moveToFirst();
- assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP)))
- .isEqualTo(200L);
- assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE)))
- .isEqualTo(2);
- assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL)))
- .isEqualTo(88);
+ assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP))).isEqualTo(200L);
+ assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE))).isEqualTo(2);
+ assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL))).isEqualTo(88);
mBatteryEventDao.clearAll();
assertThat(mBatteryEventDao.getAll()).isEmpty();
@@ -125,26 +126,51 @@
@Test
public void getAllAfter_filterBatteryTypes_returnExpectedResult() {
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(100L)
- .setBatteryEventType(1)
- .setBatteryLevel(66)
- .build());
- mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
- .setTimestamp(200L)
- .setBatteryEventType(2)
- .setBatteryLevel(88)
- .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(100L)
+ .setBatteryEventType(1)
+ .setBatteryLevel(66)
+ .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(200L)
+ .setBatteryEventType(2)
+ .setBatteryLevel(88)
+ .build());
final Cursor cursor = mBatteryEventDao.getAllAfter(0L, List.of(1));
assertThat(cursor.getCount()).isEqualTo(1);
cursor.moveToFirst();
- assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP)))
- .isEqualTo(100L);
- assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE)))
- .isEqualTo(1);
- assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL)))
- .isEqualTo(66);
+ assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP))).isEqualTo(100L);
+ assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE))).isEqualTo(1);
+ assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL))).isEqualTo(66);
+
+ mBatteryEventDao.clearAll();
+ assertThat(mBatteryEventDao.getAll()).isEmpty();
+ }
+
+ @Test
+ public void getAllAfter_filterTimestamp_returnExpectedResult() {
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(100L)
+ .setBatteryEventType(1)
+ .setBatteryLevel(66)
+ .build());
+ mBatteryEventDao.insert(
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(200L)
+ .setBatteryEventType(1)
+ .setBatteryLevel(88)
+ .build());
+
+ final Cursor cursor = mBatteryEventDao.getAllAfter(200L, List.of(1));
+ assertThat(cursor.getCount()).isEqualTo(1);
+ cursor.moveToFirst();
+ assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP))).isEqualTo(200L);
+ assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE))).isEqualTo(1);
+ assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL))).isEqualTo(88);
mBatteryEventDao.clearAll();
assertThat(mBatteryEventDao.getAll()).isEmpty();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java
index a34d651..6aa7157 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryEventEntityTest.java
@@ -32,12 +32,12 @@
final int batteryEventType = 1;
final int batteryLevel = 66;
- BatteryEventEntity entity = BatteryEventEntity
- .newBuilder()
- .setTimestamp(timestamp)
- .setBatteryEventType(batteryEventType)
- .setBatteryLevel(batteryLevel)
- .build();
+ BatteryEventEntity entity =
+ BatteryEventEntity.newBuilder()
+ .setTimestamp(timestamp)
+ .setBatteryEventType(batteryEventType)
+ .setBatteryLevel(batteryLevel)
+ .build();
// Verifies the app relative information.
assertThat(entity.timestamp).isEqualTo(timestamp);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java
index b3dba4e..cc1d7b4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java
@@ -57,14 +57,17 @@
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateTable(
- mContext, TIMESTAMP1, PACKAGE_NAME1, /*multiple=*/ true,
- /*isFullChargeStart=*/ true);
+ mContext,
+ TIMESTAMP1,
+ PACKAGE_NAME1,
+ /* multiple= */ true,
+ /* isFullChargeStart= */ true);
}
@After
public void closeDb() {
mDatabase.close();
- BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
+ BatteryStateDatabase.setBatteryStateDatabase(/* database= */ null);
}
@Test
@@ -136,29 +139,25 @@
@Test
public void getInstance_createNewInstance_returnsExpectedResult() throws Exception {
- BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
+ BatteryStateDatabase.setBatteryStateDatabase(/* database= */ null);
assertThat(BatteryStateDatabase.getInstance(mContext)).isNotNull();
}
@Test
public void getDistinctTimestampCount_normalFlow_returnsExpectedResult() {
- assertThat(mBatteryStateDao.getDistinctTimestampCount(/*timestamp=*/ 0))
- .isEqualTo(3);
- assertThat(mBatteryStateDao.getDistinctTimestampCount(TIMESTAMP1))
- .isEqualTo(2);
+ assertThat(mBatteryStateDao.getDistinctTimestampCount(/* timestamp= */ 0)).isEqualTo(3);
+ assertThat(mBatteryStateDao.getDistinctTimestampCount(TIMESTAMP1)).isEqualTo(2);
}
@Test
public void getDistinctTimestamps_normalFlow_returnsExpectedResult() {
- final List<Long> timestamps =
- mBatteryStateDao.getDistinctTimestamps(/*timestamp=*/ 0);
+ final List<Long> timestamps = mBatteryStateDao.getDistinctTimestamps(/* timestamp= */ 0);
assertThat(timestamps).hasSize(3);
assertThat(timestamps).containsExactly(TIMESTAMP1, TIMESTAMP2, TIMESTAMP3);
}
- private static void assertBatteryState(
- BatteryState state, long timestamp, String packageName) {
+ private static void assertBatteryState(BatteryState state, long timestamp, String packageName) {
assertThat(state.timestamp).isEqualTo(timestamp);
assertThat(state.packageName).isEqualTo(packageName);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
index 9b9003e..e48f250 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
@@ -41,15 +41,13 @@
@Before
public void setUp() {
final DeviceBatteryState deviceBatteryState =
- DeviceBatteryState
- .newBuilder()
+ DeviceBatteryState.newBuilder()
.setBatteryLevel(BATTERY_LEVEL)
.setBatteryStatus(BATTERY_STATUS)
.setBatteryHealth(BATTERY_HEALTH)
.build();
mBatteryInformation =
- BatteryInformation
- .newBuilder()
+ BatteryInformation.newBuilder()
.setDeviceBatteryState(deviceBatteryState)
.setBootTimestamp(101L)
.setIsHidden(true)
@@ -78,8 +76,8 @@
assertThat(state.timestamp).isEqualTo(100001L);
assertThat(state.consumerType).isEqualTo(2);
assertThat(state.isFullChargeCycleStart).isTrue();
- assertThat(state.batteryInformation).isEqualTo(
- ConvertUtils.convertBatteryInformationToString(mBatteryInformation));
+ assertThat(state.batteryInformation)
+ .isEqualTo(ConvertUtils.convertBatteryInformationToString(mBatteryInformation));
}
private static BatteryState create(BatteryInformation batteryInformation) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDaoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDaoTest.java
index 6f73954..1501bbd 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDaoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotDaoTest.java
@@ -61,7 +61,7 @@
@After
public void closeDb() {
mDatabase.close();
- BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
+ BatteryStateDatabase.setBatteryStateDatabase(/* database= */ null);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntityTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntityTest.java
index ef276eb..4c037b9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntityTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryUsageSlotEntityTest.java
@@ -31,11 +31,11 @@
final long timestamp = 10001L;
final String batteryUsageSlotString = "batteryUsageSlotString";
- BatteryUsageSlotEntity entity = BatteryUsageSlotEntity
- .newBuilder()
- .setTimestamp(timestamp)
- .setBatteryUsageSlot(batteryUsageSlotString)
- .build();
+ BatteryUsageSlotEntity entity =
+ BatteryUsageSlotEntity.newBuilder()
+ .setTimestamp(timestamp)
+ .setBatteryUsageSlot(batteryUsageSlotString)
+ .build();
// Verifies the app relative information.
assertThat(entity.timestamp).isEqualTo(timestamp);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
new file mode 100644
index 0000000..cdf1514
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2023 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.datasaver;
+
+import static android.net.NetworkPolicyManager.POLICY_NONE;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+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)
+public class DynamicDenylistManagerTest {
+
+ private static final String FAKE_UID_1 = "package_uid_1";
+ private static final String FAKE_UID_2 = "package_uid_2";
+
+ private SharedPreferences mManualDenyListPref;
+ private SharedPreferences mDynamicDenyListPref;
+ private DynamicDenylistManager mDynamicDenylistManager;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application.getApplicationContext();
+ mDynamicDenylistManager = new DynamicDenylistManager(mContext);
+ mManualDenyListPref = mDynamicDenylistManager.getManualDenylistPref();
+ mDynamicDenyListPref = mDynamicDenylistManager.getDynamicDenylistPref();
+ }
+
+ @After
+ public void tearDown() {
+ mDynamicDenylistManager.clearManualDenylistPref();
+ mDynamicDenylistManager.clearDynamicDenylistPref();
+ }
+
+ @Test
+ public void getManualDenylistPref_isEmpty() {
+ assertThat(mManualDenyListPref.getAll()).isEmpty();
+ }
+
+ @Test
+ public void getDynamicDenylistPref_isEmpty() {
+ assertThat(mDynamicDenyListPref.getAll()).isEmpty();
+ }
+
+ @Test
+ public void getManualDenylistPref_initiated_containsExpectedValue() {
+ mManualDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+
+ assertThat(mManualDenyListPref.getAll().size()).isEqualTo(1);
+ assertTrue(mManualDenyListPref.contains(FAKE_UID_1));
+ }
+
+ @Test
+ public void getDynamicDenylistPref_initiated_containsExpectedValue() {
+ mDynamicDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+
+ assertThat(mDynamicDenyListPref.getAll()).hasSize(1);
+ assertTrue(mDynamicDenyListPref.contains(FAKE_UID_1));
+ }
+
+ @Test
+ public void updateManualDenylist_policyReject_addsUid() {
+ mDynamicDenylistManager.updateManualDenylist(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND);
+
+ assertThat(mManualDenyListPref.getAll()).hasSize(1);
+ assertTrue(mManualDenyListPref.contains(FAKE_UID_1));
+ }
+
+ @Test
+ public void updateManualDenylist_policyNone_removesUid() {
+ mManualDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+ assertTrue(mManualDenyListPref.contains(FAKE_UID_1));
+
+ mDynamicDenylistManager.updateManualDenylist(FAKE_UID_1, POLICY_NONE);
+
+ assertThat(mManualDenyListPref.getAll()).isEmpty();
+ }
+
+ @Test
+ public void updateManualDenylist_samePolicy_doNothing() {
+ mManualDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+ assertTrue(mManualDenyListPref.contains(FAKE_UID_1));
+
+ mDynamicDenylistManager.updateManualDenylist(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND);
+
+ assertThat(mManualDenyListPref.getAll()).hasSize(1);
+ }
+
+ @Test
+ public void isManualDenylist_returnsFalse() {
+ assertFalse(mDynamicDenylistManager.isInManualDenylist(FAKE_UID_1));
+ }
+
+ @Test
+ public void isManualDenylist_incorrectUid_returnsFalse() {
+ mManualDenyListPref.edit().putInt(FAKE_UID_2, POLICY_REJECT_METERED_BACKGROUND).apply();
+
+ assertFalse(mDynamicDenylistManager.isInManualDenylist(FAKE_UID_1));
+ }
+
+ @Test
+ public void isManualDenylist_initiated_returnsTrue() {
+ mManualDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+
+ assertTrue(mDynamicDenylistManager.isInManualDenylist(FAKE_UID_1));
+ }
+
+ @Test
+ public void clearManualDenylistPref_isEmpty() {
+ mManualDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+ assertThat(mManualDenyListPref.getAll()).hasSize(1);
+ assertTrue(mManualDenyListPref.contains(FAKE_UID_1));
+
+ mDynamicDenylistManager.clearManualDenylistPref();
+
+ assertThat(mManualDenyListPref.getAll()).isEmpty();
+ }
+
+ @Test
+ public void clearDynamicDenylistPref_isEmpty() {
+ mDynamicDenyListPref.edit().putInt(FAKE_UID_1, POLICY_REJECT_METERED_BACKGROUND).apply();
+ assertThat(mDynamicDenyListPref.getAll()).hasSize(1);
+ assertTrue(mDynamicDenyListPref.contains(FAKE_UID_1));
+
+ mDynamicDenylistManager.clearDynamicDenylistPref();
+
+ assertThat(mDynamicDenyListPref.getAll()).isEmpty();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceControllerTest.java
index 4806b8a..b8070d3 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardSettingsPreferenceControllerTest.java
@@ -56,6 +56,9 @@
})
public class KeyboardSettingsPreferenceControllerTest {
+ private static final int VENDOR_ID = 123;
+ private static final int PRODUCT_ID = 456;
+
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -88,7 +91,9 @@
"TEST_DEVICE",
mInputDeviceIdentifier,
"TEST_DEVICE_LABEL",
- address);
+ address,
+ VENDOR_ID,
+ PRODUCT_ID);
List<HardKeyboardDeviceInfo> keyboards = new ArrayList<>();
keyboards.add(deviceInfo);
when(mController.getHardKeyboardList()).thenReturn(keyboards);
diff --git a/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java
index df05203..9ddfd5b 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java
@@ -52,6 +52,8 @@
private static final String DEVICE_NAME = "deviceName";
private static final String LAYOUT_LABEL = "deviceLayutLabel";
private static final String BLUETOOTHADDRESS = "deviceBluetoothAddress";
+ private static final int VENDOR_ID = 123;
+ private static final int PRODUCT_ID = 456;
@Mock
private Context mContext;
@@ -84,7 +86,9 @@
DEVICE_NAME,
mIdentifier,
LAYOUT_LABEL,
- BLUETOOTHADDRESS));
+ BLUETOOTHADDRESS,
+ VENDOR_ID,
+ PRODUCT_ID));
mController = spy(new PhysicalKeyboardPreferenceController(context, null));
when(mController.getKeyboards()).thenReturn(keyboards);
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadBottomPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadBottomPreferenceControllerTest.java
index bf2d8b0..fa73768 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadBottomPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadBottomPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.UserHandle;
import android.provider.Settings;
@@ -26,10 +31,14 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@@ -39,16 +48,20 @@
com.android.settings.testutils.shadow.ShadowSystemSettings.class,
})
public class TrackpadBottomPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "trackpad_bottom_right_tap";
private static final String SETTING_KEY = Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE;
private Context mContext;
private TrackpadBottomPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadBottomPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -74,6 +87,10 @@
UserHandle.USER_CURRENT);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_BOTTOM_RIGHT_TAP_CHANGED),
+ eq(true));
}
@Test
@@ -87,6 +104,10 @@
UserHandle.USER_CURRENT);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_BOTTOM_RIGHT_TAP_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceControllerTest.java
index 0e1705e..85d56ef 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoBackPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
@@ -25,25 +30,33 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link TrackpadGoBackPreferenceController} */
@RunWith(RobolectricTestRunner.class)
public class TrackpadGoBackPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "gesture_go_back";
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_BACK_ENABLED;
private Context mContext;
private TrackpadGoBackPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadGoBackPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -65,6 +78,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_GO_BACK_CHANGED),
+ eq(true));
}
@Test
@@ -74,6 +91,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_GO_BACK_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceControllerTest.java
index 3289bcc..6b3b3f5 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadGoHomePreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
@@ -25,25 +30,33 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link TrackpadGoHomePreferenceController} */
@RunWith(RobolectricTestRunner.class)
public class TrackpadGoHomePreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "gesture_go_home";
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_HOME_ENABLED;
private Context mContext;
private TrackpadGoHomePreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadGoHomePreferenceController(mContext, PREFERENCE_KEY);
}
@@ -65,6 +78,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_GO_HOME_CHANGED),
+ eq(true));
}
@Test
@@ -74,6 +91,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_GO_HOME_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceControllerTest.java
index 3df1627..005bc9f 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadNotificationsPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
@@ -25,25 +30,33 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link TrackpadNotificationsPreferenceController} */
@RunWith(RobolectricTestRunner.class)
public class TrackpadNotificationsPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "gesture_notifications";
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_NOTIFICATION_ENABLED;
private Context mContext;
private TrackpadNotificationsPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadNotificationsPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -65,6 +78,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_NOTIFICATION_CHANGED),
+ eq(true));
}
@Test
@@ -74,6 +91,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_NOTIFICATION_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceControllerTest.java
index 25fd962..8449dba 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadPointerSpeedPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputSettings;
import android.os.UserHandle;
@@ -26,10 +31,14 @@
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@@ -39,6 +48,8 @@
com.android.settings.testutils.shadow.ShadowSystemSettings.class,
})
public class TrackpadPointerSpeedPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "trackpad_pointer_speed";
private static final String SETTING_KEY = Settings.System.TOUCHPAD_POINTER_SPEED;
@@ -46,10 +57,12 @@
private Context mContext;
private TrackpadPointerSpeedPreferenceController mController;
private int mDefaultSpeed;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadPointerSpeedPreferenceController(mContext, PREFERENCE_KEY);
mDefaultSpeed = Settings.System.getIntForUser(
mContext.getContentResolver(),
@@ -89,6 +102,10 @@
assertThat(result).isTrue();
assertThat(mController.getSliderPosition()).isEqualTo(inputSpeed);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_POINTER_SPEED_CHANGED),
+ eq(1));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceControllerTest.java
index dbed542..2ef53a6 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadRecentAppsPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
@@ -25,25 +30,33 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link TrackpadRecentAppsPreferenceController} */
@RunWith(RobolectricTestRunner.class)
public class TrackpadRecentAppsPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "gesture_recent_apps";
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_OVERVIEW_ENABLED;
private Context mContext;
private TrackpadRecentAppsPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadRecentAppsPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -65,6 +78,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_RECENT_APPS_CHANGED),
+ eq(true));
}
@Test
@@ -74,6 +91,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_RECENT_APPS_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
index fbe7407..f545c38 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.UserHandle;
import android.provider.Settings;
@@ -26,10 +31,14 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@@ -39,16 +48,20 @@
com.android.settings.testutils.shadow.ShadowSystemSettings.class,
})
public class TrackpadReverseScrollingPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "trackpad_reverse_scrolling";
private static final String SETTING_KEY = Settings.System.TOUCHPAD_NATURAL_SCROLLING;
private Context mContext;
private TrackpadReverseScrollingPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadReverseScrollingPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -74,6 +87,10 @@
UserHandle.USER_CURRENT);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_REVERSE_SCROLLING_CHANGED),
+ eq(true));
}
@Test
@@ -87,6 +104,10 @@
UserHandle.USER_CURRENT);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_REVERSE_SCROLLING_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceControllerTest.java
index 3f16025..5e354d2 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadSwitchAppsPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
@@ -25,25 +30,33 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link TrackpadSwitchAppsPreferenceController} */
@RunWith(RobolectricTestRunner.class)
public class TrackpadSwitchAppsPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "gesture_switch_apps";
private static final String SETTING_KEY = Settings.Secure.TRACKPAD_GESTURE_QUICK_SWITCH_ENABLED;
private Context mContext;
private TrackpadSwitchAppsPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadSwitchAppsPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -65,6 +78,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_SWITCH_APPS_CHANGED),
+ eq(true));
}
@Test
@@ -74,6 +91,10 @@
int result = Settings.Secure.getInt(mContext.getContentResolver(), SETTING_KEY, 1);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_SWITCH_APPS_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceControllerTest.java
index 241e3df..8e9d026 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadTapToClickPreferenceControllerTest.java
@@ -18,6 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.UserHandle;
import android.provider.Settings;
@@ -26,10 +31,14 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@@ -39,16 +48,20 @@
com.android.settings.testutils.shadow.ShadowSystemSettings.class,
})
public class TrackpadTapToClickPreferenceControllerTest {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
private static final String PREFERENCE_KEY = "trackpad_tap_to_click";
private static final String SETTING_KEY = Settings.System.TOUCHPAD_TAP_TO_CLICK;
private Context mContext;
private TrackpadTapToClickPreferenceController mController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TrackpadTapToClickPreferenceController(mContext, PREFERENCE_KEY);
}
@@ -74,6 +87,10 @@
UserHandle.USER_CURRENT);
assertThat(result).isEqualTo(1);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_TAP_TO_CLICK_CHANGED),
+ eq(true));
}
@Test
@@ -87,6 +104,10 @@
UserHandle.USER_CURRENT);
assertThat(result).isEqualTo(0);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(),
+ eq(SettingsEnums.ACTION_GESTURE_TAP_TO_CLICK_CHANGED),
+ eq(false));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java
index 72b01f8..817df4c 100644
--- a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java
@@ -18,6 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -27,6 +29,7 @@
import android.app.Activity;
import android.app.ApplicationPackageManager;
import android.app.LocaleConfig;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -51,6 +54,7 @@
import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.AppLocaleUtil;
import com.android.settings.flags.Flags;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.After;
import org.junit.Before;
@@ -91,6 +95,7 @@
private static final String EN_US = "en-US";
private static int sUid;
+ private FakeFeatureFactory mFeatureFactory;
private LocaleNotificationDataManager mDataManager;
private AppLocalePickerActivity mActivity;
@@ -117,6 +122,7 @@
when(mLocaleConfig.getSupportedLocales()).thenReturn(LocaleList.forLanguageTags("en-US"));
ReflectionHelpers.setStaticField(AppLocaleUtil.class, "sLocaleConfig", mLocaleConfig);
sUid = Process.myUid();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
}
@After
@@ -229,6 +235,37 @@
}
@Test
+ public void onLocaleSelected_logLocaleSource() {
+ ActivityController<TestAppLocalePickerActivity> controller =
+ initActivityController(true);
+ LocaleList.setDefault(LocaleList.forLanguageTags("ja-JP,en-CA,en-US"));
+ Locale locale = new Locale("en", "US");
+ when(mLocaleInfo.getLocale()).thenReturn(locale);
+ when(mLocaleInfo.isSystemLocale()).thenReturn(false);
+ when(mLocaleInfo.isSuggested()).thenReturn(true);
+ when(mLocaleInfo.isSuggestionOfType(LocaleStore.LocaleInfo.SUGGESTION_TYPE_SIM)).thenReturn(
+ true);
+ when(mLocaleInfo.isSuggestionOfType(
+ LocaleStore.LocaleInfo.SUGGESTION_TYPE_SYSTEM_AVAILABLE_LANGUAGE)).thenReturn(
+ true);
+ when(mLocaleInfo.isSuggestionOfType(
+ LocaleStore.LocaleInfo.SUGGESTION_TYPE_OTHER_APP_LANGUAGE)).thenReturn(
+ true);
+ when(mLocaleInfo.isSuggestionOfType(
+ LocaleStore.LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE)).thenReturn(
+ true);
+
+ controller.create();
+ AppLocalePickerActivity mActivity = controller.get();
+ mActivity.onLocaleSelected(mLocaleInfo);
+
+ int localeSource = 15; // SIM_LOCALE | SYSTEM_LOCALE |IME_LOCALE|APP_LOCALE
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ any(), eq(SettingsEnums.ACTION_CHANGE_APP_LANGUAGE_FROM_SUGGESTED),
+ eq(localeSource));
+ }
+
+ @Test
@RequiresFlagsEnabled(Flags.FLAG_LOCALE_NOTIFICATION_ENABLED)
public void onLocaleSelected_evaluateNotification_simpleLocaleUpdate_localeCreatedWithUid()
throws Exception {
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
deleted file mode 100644
index 2e04ea7..0000000
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
+++ /dev/null
@@ -1,88 +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 com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.UserManager;
-
-import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
-
-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.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-public class MobileNetworkListFragmentTest {
- @Mock
- private Context mContext;
- @Mock
- private Resources mResources;
- @Mock
- private UserManager mUserManager;
-
- private MobileNetworkListFragment mFragment;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFragment = new MobileNetworkListFragment();
- }
-
- @Test
- public void isPageSearchEnabled_adminUser_shouldReturnTrue() {
- when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
- when(mUserManager.isAdminUser()).thenReturn(true);
- final BaseSearchIndexProvider provider =
- (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
-
- when(mContext.getResources()).thenReturn(mResources);
- when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
-
- final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
- ReflectionHelpers.ClassParameter.from(Context.class, mContext));
- final boolean isEnabled = (Boolean) obj;
-
- assertThat(isEnabled).isTrue();
- }
-
- @Test
- public void isPageSearchEnabled_nonAdminUser_shouldReturnFalse() {
- when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
- when(mUserManager.isAdminUser()).thenReturn(false);
- final BaseSearchIndexProvider provider =
- (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
-
- when(mContext.getResources()).thenReturn(mResources);
- when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
-
- final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
- ReflectionHelpers.ClassParameter.from(Context.class, mContext));
- final boolean isEnabled = (Boolean) obj;
-
- assertThat(isEnabled).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java
index 13528b4..053b352 100644
--- a/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java
@@ -26,16 +26,19 @@
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.ParceledListSlice;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.flags.Flags;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.PrimarySwitchPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -51,6 +54,9 @@
@LooperMode(LooperMode.Mode.LEGACY)
public class AppChannelsBypassingDndPreferenceControllerTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
@Mock
private NotificationBackend mBackend;
@@ -150,4 +156,44 @@
}
return new ParceledListSlice<>(Collections.singletonList(group));
}
+
+ @Test
+ public void displayPreference_duplicateChannelName_AddsGroupNameAsSummary() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEDUPE_DND_SETTINGS_CHANNELS);
+ NotificationChannelGroup group1 = new NotificationChannelGroup("group1_id", "Group1");
+ NotificationChannelGroup group2 = new NotificationChannelGroup("group2_id", "Group2");
+
+ group1.addChannel(new NotificationChannel("mail_group1_id", "Mail",
+ NotificationManager.IMPORTANCE_DEFAULT));
+ group1.addChannel(new NotificationChannel("other_group1_id", "Other",
+ NotificationManager.IMPORTANCE_DEFAULT));
+
+ group2.addChannel(new NotificationChannel("music_group2_id", "Music",
+ NotificationManager.IMPORTANCE_DEFAULT));
+ // This channel has the same name as a channel in group1.
+ group2.addChannel(new NotificationChannel("mail_group2_id", "Mail",
+ NotificationManager.IMPORTANCE_DEFAULT));
+
+ ParceledListSlice<NotificationChannelGroup> groups = new ParceledListSlice<>(
+ new ArrayList<NotificationChannelGroup>() {
+ {
+ add(group1);
+ add(group2);
+ }
+ }
+ );
+
+ when(mBackend.getGroups(eq(mAppRow.pkg), eq(mAppRow.uid))).thenReturn(groups);
+ mController.displayPreference(mPreferenceScreen);
+ ShadowApplication.runBackgroundTasks();
+ // Check that we've added the group name as a summary to channels that have identical names.
+ // Channels are also alphabetized.
+ assertThat(mCategory.getPreference(1).getTitle().toString()).isEqualTo("Mail");
+ assertThat(mCategory.getPreference(1).getSummary().toString()).isEqualTo("Group1");
+ assertThat(mCategory.getPreference(2).getTitle().toString()).isEqualTo("Mail");
+ assertThat(mCategory.getPreference(2).getSummary().toString()).isEqualTo("Group2");
+ assertThat(mCategory.getPreference(3).getTitle().toString()).isEqualTo("Music");
+ assertThat(mCategory.getPreference(4).getTitle().toString()).isEqualTo("Other");
+
+ }
}
diff --git a/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceControllerTest.java
index 5cc931e..a7990d4 100644
--- a/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceControllerTest.java
@@ -17,54 +17,109 @@
package com.android.settings.security;
import static android.view.contentprotection.flags.Flags.FLAG_SETTING_UI_ENABLED;
+
import static com.google.common.truth.Truth.assertThat;
-import android.content.ContentResolver;
+import android.content.ComponentName;
import android.content.Context;
import android.platform.test.flag.junit.SetFlagsRule;
-import android.provider.Settings;
-import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
-import com.android.settings.R;
-
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
public class ContentProtectionPreferenceControllerTest {
+ private static final String PACKAGE_NAME = "com.test.package";
+
+ private static final ComponentName COMPONENT_NAME =
+ new ComponentName(PACKAGE_NAME, "TestClass");
+
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
- private Context mContext;
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ private String mConfigDefaultContentProtectionService = COMPONENT_NAME.flattenToString();
+
private ContentProtectionPreferenceController mController;
- private Preference mPreference;
+
+ private boolean mSettingUiEnabled;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mController = new ContentProtectionPreferenceController(mContext, "key");
- mPreference = new Preference(mContext);
- mPreference.setKey(mController.getPreferenceKey());
+ mController = new TestContentProtectionPreferenceController();
}
@Test
public void isAvailable_flagSettingUiDisabled_isFalse() {
- mSetFlagsRule.disableFlags(FLAG_SETTING_UI_ENABLED);
+ mSettingUiEnabled = false;
+
assertThat(mController.isAvailable()).isFalse();
}
@Test
- public void isAvailable_flagSettingUiEnabled_isTrue() {
+ public void isAvailable_componentNameNull_isFalse() {
+ mConfigDefaultContentProtectionService = null;
mSetFlagsRule.enableFlags(FLAG_SETTING_UI_ENABLED);
+ mController = new TestContentProtectionPreferenceController();
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_componentNameEmpty_isFalse() {
+ mConfigDefaultContentProtectionService = "";
+ mSetFlagsRule.enableFlags(FLAG_SETTING_UI_ENABLED);
+ mController = new TestContentProtectionPreferenceController();
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_componentNameBlank_isFalse() {
+ mConfigDefaultContentProtectionService = " ";
+ mSetFlagsRule.enableFlags(FLAG_SETTING_UI_ENABLED);
+ mController = new TestContentProtectionPreferenceController();
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_componentNameInvalid_isFalse() {
+ mConfigDefaultContentProtectionService = "invalid";
+ mSetFlagsRule.enableFlags(FLAG_SETTING_UI_ENABLED);
+ mController = new TestContentProtectionPreferenceController();
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_flagSettingUiEnabled_componentNameValid_isTrue() {
+ mSettingUiEnabled = true;
+
assertThat(mController.isAvailable()).isTrue();
}
+
+ private class TestContentProtectionPreferenceController
+ extends ContentProtectionPreferenceController {
+
+ TestContentProtectionPreferenceController() {
+ super(ContentProtectionPreferenceControllerTest.this.mContext, "key");
+ }
+
+ @Override
+ protected String getContentProtectionServiceFlatComponentName() {
+ return mConfigDefaultContentProtectionService;
+ }
+
+ @Override
+ protected boolean settingUiEnabled() {
+ return mSettingUiEnabled;
+ }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceFragmentTest.java
index 431dd0c..c9b1c64 100644
--- a/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceFragmentTest.java
@@ -17,16 +17,29 @@
package com.android.settings.security;
import static android.app.settings.SettingsEnums.CONTENT_PROTECTION_PREFERENCE;
+
+import static com.android.settings.security.ContentProtectionPreferenceFragment.KEY_WORK_PROFILE_SWITCH;
+
import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.SearchIndexableResource;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowDashboardFragment;
+import com.android.settings.testutils.shadow.ShadowUtils;
import org.junit.Before;
import org.junit.Test;
@@ -37,44 +50,116 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import java.util.Arrays;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowDashboardFragment.class)
+@Config(
+ shadows = {
+ ShadowDashboardFragment.class,
+ ShadowUtils.class,
+ })
public class ContentProtectionPreferenceFragmentTest {
+ private static final int TEST_PRIMARY_USER_ID = 10;
+ private static final int TEST_MANAGED_PROFILE_ID = 11;
- @Mock
- private ContentProtectionPreferenceFragment mMockFragment;
+ private ContentProtectionPreferenceFragment mFragment;
+ @Mock private UserManager mMockUserManager;
private Context mContext;
+ private PreferenceScreen mScreen;
+ private SwitchPreference mWorkProfileSwitch;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mMockFragment = spy(new ContentProtectionPreferenceFragment());
- doReturn(mContext).when(mMockFragment).getContext();
+ mContext = spy(RuntimeEnvironment.application);
+ mFragment = spy(new ContentProtectionPreferenceFragment());
+ mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
+
+ doReturn(mContext).when(mFragment).getContext();
+ doReturn(mScreen).when(mFragment).getPreferenceScreen();
+
+ mWorkProfileSwitch = new SwitchPreference(mContext);
+ mWorkProfileSwitch.setVisible(false);
+ doReturn(mWorkProfileSwitch).when(mScreen).findPreference(KEY_WORK_PROFILE_SWITCH);
+
+ doReturn(mMockUserManager).when(mContext).getSystemService(UserManager.class);
+ doReturn(TEST_PRIMARY_USER_ID).when(mMockUserManager).getUserHandle();
+ UserInfo primaryUser =
+ new UserInfo(
+ TEST_PRIMARY_USER_ID,
+ null,
+ UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_PRIMARY);
+ doReturn(primaryUser).when(mMockUserManager).getUserInfo(TEST_PRIMARY_USER_ID);
+ UserInfo managedProfile =
+ new UserInfo(
+ TEST_MANAGED_PROFILE_ID,
+ null,
+ UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_MANAGED_PROFILE);
+ doReturn(managedProfile).when(mMockUserManager).getUserInfo(TEST_MANAGED_PROFILE_ID);
+ }
+
+ @Test
+ public void onActivityCreated_workProfileDisplayWorkSwitch() {
+ UserHandle[] userHandles =
+ new UserHandle[] {
+ new UserHandle(TEST_PRIMARY_USER_ID), new UserHandle(TEST_MANAGED_PROFILE_ID)
+ };
+ doReturn(Arrays.asList(userHandles)).when(mMockUserManager).getUserProfiles();
+
+ assertThat(Utils.getManagedProfile(mMockUserManager).getIdentifier())
+ .isEqualTo(TEST_MANAGED_PROFILE_ID);
+
+ mFragment.onActivityCreated(null);
+
+ assertThat(mWorkProfileSwitch.isVisible()).isTrue();
+ assertThat(mWorkProfileSwitch.isChecked()).isFalse();
+ assertThat(mWorkProfileSwitch.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void onActivityCreated_fullyManagedMode_bottomSwitchInvisible() {
+ final ComponentName componentName =
+ ComponentName.unflattenFromString("com.android.test/.DeviceAdminReceiver");
+ ShadowUtils.setDeviceOwnerComponent(componentName);
+
+ mFragment.onActivityCreated(null);
+
+ assertThat(mWorkProfileSwitch.isVisible()).isFalse();
+ }
+
+ @Test
+ public void onActivityCreated_personalProfileHideWorkSwitch() {
+ UserHandle[] userHandles = new UserHandle[] {new UserHandle(TEST_PRIMARY_USER_ID)};
+ doReturn(Arrays.asList(userHandles)).when(mMockUserManager).getUserProfiles();
+
+ assertThat(Utils.getManagedProfile(mMockUserManager)).isNull();
+
+ mFragment.onActivityCreated(null);
+
+ assertThat(mWorkProfileSwitch.isVisible()).isFalse();
}
@Test
public void getMetricsCategory() {
- assertThat(mMockFragment.getMetricsCategory()).isEqualTo(CONTENT_PROTECTION_PREFERENCE);
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(CONTENT_PROTECTION_PREFERENCE);
}
@Test
- public void getPreferenceScreenResId(){
- assertThat(mMockFragment.getPreferenceScreenResId())
- .isEqualTo(R.layout.content_protection_preference_fragment);
+ public void getPreferenceScreenResId() {
+ assertThat(mFragment.getPreferenceScreenResId())
+ .isEqualTo(R.layout.content_protection_preference_fragment);
}
@Test
public void getNonIndexableKeys_existInXmlLayout() {
final List<String> nonIndexableKeys =
- ContentProtectionPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER
- .getNonIndexableKeys(mContext);
+ ContentProtectionPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+ mContext);
final List<String> allKeys =
- XmlTestUtils.getKeysFromPreferenceXml(mContext,
- R.layout.content_protection_preference_fragment);
+ XmlTestUtils.getKeysFromPreferenceXml(
+ mContext, R.layout.content_protection_preference_fragment);
assertThat(allKeys).containsAtLeastElementsIn(nonIndexableKeys);
}
@@ -83,10 +168,11 @@
public void searchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
ContentProtectionPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER
- .getXmlResourcesToIndex(mContext, /* enabled = */ true);
+ .getXmlResourcesToIndex(mContext, /* enabled= */ true);
assertThat(indexRes).isNotNull();
assertThat(indexRes).isNotEmpty();
- assertThat(indexRes.get(0).xmlResId).isEqualTo(mMockFragment.getPreferenceScreenResId());
+ assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
}
}
+
diff --git a/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..b10ff22
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2023 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.security;
+
+import static com.android.settings.security.ContentProtectionTogglePreferenceController.KEY_CONTENT_PROTECTION_PREFERENCE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.provider.Settings;
+
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settings.widget.SettingsMainSwitchPreference;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(
+ shadows = {
+ ShadowUtils.class,
+ })
+public class ContentProtectionTogglePreferenceControllerTest {
+
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Mock private PreferenceScreen mScreen;
+
+ private SettingsMainSwitchPreference mSwitchPreference;
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private ContentProtectionTogglePreferenceController mController;
+ private int mSettingBackupValue;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mController = new ContentProtectionTogglePreferenceController(mContext, "key");
+ mSwitchPreference = new SettingsMainSwitchPreference(mContext);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mSwitchPreference);
+ mSettingBackupValue = getContentProtectionGlobalSetting();
+ Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 0);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ KEY_CONTENT_PROTECTION_PREFERENCE,
+ mSettingBackupValue);
+ }
+
+ @Test
+ public void isAvailable_alwaysAvailable() {
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isChecked_settingTurnOn() {
+ Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_fullyManagedMode_settingTurnOff() {
+ final ComponentName componentName =
+ ComponentName.unflattenFromString("com.android.test/.DeviceAdminReceiver");
+ ShadowUtils.setDeviceOwnerComponent(componentName);
+ Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
+
+ ContentProtectionTogglePreferenceController controller =
+ new ContentProtectionTogglePreferenceController(mContext, "key");
+
+ assertThat(controller.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_settingTurnOff() {
+ Settings.Global.putInt(
+ mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, -1);
+
+ assertThat(mController.isChecked()).isFalse();
+ assertThat(getContentProtectionGlobalSetting()).isEqualTo(-1);
+ }
+
+ @Test
+ public void isChecked_settingDefaultOn() {
+ assertThat(mController.isChecked()).isTrue();
+ assertThat(getContentProtectionGlobalSetting()).isEqualTo(0);
+ }
+
+ @Test
+ public void onSwitchChanged_switchChecked_manuallyEnabled() {
+ mController.displayPreference(mScreen);
+ mController.setChecked(false);
+
+ mController.onSwitchChanged(/* switchView= */ null, /* isChecked= */ true);
+
+ assertThat(getContentProtectionGlobalSetting()).isEqualTo(1);
+ }
+
+ @Test
+ public void onSwitchChanged_switchUnchecked_manuallyDisabled() {
+ mController.displayPreference(mScreen);
+
+ mController.onSwitchChanged(/* switchView= */ null, /* isChecked= */ false);
+
+ assertThat(getContentProtectionGlobalSetting()).isEqualTo(-1);
+ }
+
+ private int getContentProtectionGlobalSetting() {
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 0);
+ }
+}
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index 9156cae..5a5008c 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -46,6 +46,7 @@
import com.android.settings.overlay.SupportFeatureProvider;
import com.android.settings.overlay.SurveyFeatureProvider;
import com.android.settings.panel.PanelFeatureProvider;
+import com.android.settings.privatespace.PrivateSpaceLoginFeatureProvider;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.security.SecuritySettingsFeatureProvider;
@@ -99,6 +100,7 @@
public StylusFeatureProvider mStylusFeatureProvider;
public OnboardingFeatureProvider mOnboardingFeatureProvider;
public FastPairFeatureProvider mFastPairFeatureProvider;
+ public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
/**
* Call this in {@code @Before} method of the test class to use fake factory.
@@ -146,6 +148,7 @@
mStylusFeatureProvider = mock(StylusFeatureProvider.class);
mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
+ mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
}
@Override
@@ -323,5 +326,10 @@
public FastPairFeatureProvider getFastPairFeatureProvider() {
return mFastPairFeatureProvider;
}
+
+ @Override
+ public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
+ return mPrivateSpaceLoginFeatureProvider;
+ }
}
diff --git a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
index ad943f2..dd8658c 100644
--- a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
+++ b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
@@ -18,9 +18,9 @@
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
@@ -32,10 +32,11 @@
class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
var enrollableFingerprints: Int = 5
- var enrolledFingerprintsInternal: MutableList<FingerprintViewModel> = mutableListOf()
+ var enrolledFingerprintsInternal: MutableList<FingerprintData> = mutableListOf()
var challengeToGenerate: Pair<Long, ByteArray> = Pair(-1L, byteArrayOf())
- var authenticateAttempt = FingerprintAuthAttemptViewModel.Success(1)
- val enrollStateViewModel = FingerEnrollStateViewModel.EnrollProgress(1)
+ var authenticateAttempt = FingerprintAuthAttemptModel.Success(1)
+ var enrollStateViewModel: List<FingerEnrollState> =
+ listOf(FingerEnrollState.EnrollProgress(5, 5))
var pressToAuthEnabled = true
var sensorProp =
@@ -46,7 +47,7 @@
FingerprintSensorType.POWER_BUTTON
)
- override suspend fun authenticate(): FingerprintAuthAttemptViewModel {
+ override suspend fun authenticate(): FingerprintAuthAttemptModel {
return authenticateAttempt
}
@@ -54,7 +55,7 @@
return challengeToGenerate
}
- override val enrolledFingerprints: Flow<List<FingerprintViewModel>> = flow {
+ override val enrolledFingerprints: Flow<List<FingerprintData>> = flow {
emit(enrolledFingerprintsInternal)
}
@@ -62,24 +63,22 @@
emit(enrolledFingerprintsInternal.size < enrollableFingerprints)
}
- override val sensorPropertiesInternal: Flow<FingerprintSensor?> = flow {
- emit(sensorProp)
- }
+ override val sensorPropertiesInternal: Flow<FingerprintSensor?> = flow { emit(sensorProp) }
override val maxEnrollableFingerprints: Flow<Int> = flow { emit(enrollableFingerprints) }
override suspend fun enroll(
hardwareAuthToken: ByteArray?,
enrollReason: EnrollReason
- ): Flow<FingerEnrollStateViewModel> = flowOf(enrollStateViewModel)
+ ): Flow<FingerEnrollState> = flowOf(*enrollStateViewModel.toTypedArray())
- override suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean {
+ override suspend fun removeFingerprint(fp: FingerprintData): Boolean {
return enrolledFingerprintsInternal.remove(fp)
}
- override suspend fun renameFingerprint(fp: FingerprintViewModel, newName: String) {
+ override suspend fun renameFingerprint(fp: FingerprintData, newName: String) {
if (enrolledFingerprintsInternal.remove(fp)) {
- enrolledFingerprintsInternal.add(FingerprintViewModel(newName, fp.fingerId, fp.deviceId))
+ enrolledFingerprintsInternal.add(FingerprintData(newName, fp.fingerId, fp.deviceId))
}
}
diff --git a/tests/spa_unit/Android.bp b/tests/spa_unit/Android.bp
index 28a2667..c3e99f7 100644
--- a/tests/spa_unit/Android.bp
+++ b/tests/spa_unit/Android.bp
@@ -34,6 +34,7 @@
"androidx.compose.runtime_runtime",
"androidx.test.ext.junit",
"androidx.test.runner",
+ "flag-junit",
"mockito-target-extended-minus-junit4",
],
jni_libs: [
diff --git a/tests/spa_unit/src/com/android/settings/datausage/AppDataUsageCycleControllerTest.kt b/tests/spa_unit/src/com/android/settings/datausage/AppDataUsageCycleControllerTest.kt
index ea51f01..fe35259 100644
--- a/tests/spa_unit/src/com/android/settings/datausage/AppDataUsageCycleControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/datausage/AppDataUsageCycleControllerTest.kt
@@ -22,7 +22,6 @@
import androidx.preference.PreferenceManager
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.datausage.lib.AppDataUsageDetailsRepository
import com.android.settings.datausage.lib.IAppDataUsageDetailsRepository
import com.android.settings.datausage.lib.NetworkUsageDetailsData
import com.google.common.truth.Truth.assertThat
@@ -31,23 +30,18 @@
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.kotlin.doReturn
-import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
-import org.mockito.kotlin.stub
import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class)
class AppDataUsageCycleControllerTest {
private val context: Context = ApplicationProvider.getApplicationContext()
- private val controller = AppDataUsageCycleController(context, KEY)
-
private val preference = spy(SpinnerPreference(context, null).apply { key = KEY })
private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
- private val onUsageDataUpdated: (NetworkUsageDetailsData) -> Unit = {}
+ private val controller = AppDataUsageCycleController(context, KEY)
@Before
fun setUp() {
@@ -59,8 +53,8 @@
val repository = object : IAppDataUsageDetailsRepository {
override suspend fun queryDetailsForCycles() = emptyList<NetworkUsageDetailsData>()
}
- controller.init(repository, onUsageDataUpdated)
controller.displayPreference(preferenceScreen)
+ controller.init(repository) {}
controller.onViewCreated(TestLifecycleOwner())
delay(100)
@@ -79,8 +73,8 @@
val repository = object : IAppDataUsageDetailsRepository {
override suspend fun queryDetailsForCycles() = listOf(detailsData)
}
- controller.init(repository, onUsageDataUpdated)
controller.displayPreference(preferenceScreen)
+ controller.init(repository) {}
controller.onViewCreated(TestLifecycleOwner())
delay(100)
@@ -93,14 +87,14 @@
val repository = object : IAppDataUsageDetailsRepository {
override suspend fun queryDetailsForCycles() = emptyList<NetworkUsageDetailsData>()
}
- controller.init(repository, onUsageDataUpdated)
+ controller.displayPreference(preferenceScreen)
+ controller.init(repository) {}
+
controller.setInitialCycles(
initialCycles = listOf(CYCLE2_END_TIME, CYCLE1_END_TIME, CYCLE1_START_TIME),
initialSelectedEndTime = CYCLE1_END_TIME,
)
- controller.displayPreference(preferenceScreen)
-
verify(preference).setSelection(1)
}
diff --git a/tests/spa_unit/src/com/android/settings/network/MobileDataEnabledFlowTest.kt b/tests/spa_unit/src/com/android/settings/network/MobileDataEnabledFlowTest.kt
new file mode 100644
index 0000000..4862309
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/MobileDataEnabledFlowTest.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2023 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.provider.Settings
+import android.telephony.SubscriptionManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
+import com.android.settingslib.spa.testutils.toListWithTimeout
+import com.android.settingslib.spaprivileged.settingsprovider.settingsGlobalBoolean
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class MobileDataEnabledFlowTest {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ @Test
+ fun mobileDataEnabledFlow_notified(): Unit = runBlocking {
+ val flow = context.mobileDataEnabledFlow(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+
+ assertThat(flow.firstWithTimeoutOrNull()).isNotNull()
+ }
+
+ @Test
+ fun mobileDataEnabledFlow_changed_notified(): Unit = runBlocking {
+ var mobileDataEnabled by context.settingsGlobalBoolean(Settings.Global.MOBILE_DATA)
+ mobileDataEnabled = false
+
+ val flow = context.mobileDataEnabledFlow(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+ mobileDataEnabled = true
+
+ assertThat(flow.firstWithTimeoutOrNull()).isNotNull()
+ }
+
+ @Test
+ fun mobileDataEnabledFlow_forSubIdNotChanged(): Unit = runBlocking {
+ var mobileDataEnabled by context.settingsGlobalBoolean(Settings.Global.MOBILE_DATA)
+ mobileDataEnabled = false
+ var mobileDataEnabledForSubId
+ by context.settingsGlobalBoolean(Settings.Global.MOBILE_DATA + SUB_ID)
+ mobileDataEnabledForSubId = false
+
+ val listDeferred = async {
+ context.mobileDataEnabledFlow(SUB_ID).toListWithTimeout()
+ }
+
+ assertThat(listDeferred.await()).hasSize(1)
+ }
+
+ @Test
+ fun mobileDataEnabledFlow_forSubIdChanged(): Unit = runBlocking {
+ var mobileDataEnabled by context.settingsGlobalBoolean(Settings.Global.MOBILE_DATA)
+ mobileDataEnabled = false
+ var mobileDataEnabledForSubId
+ by context.settingsGlobalBoolean(Settings.Global.MOBILE_DATA + SUB_ID)
+ mobileDataEnabledForSubId = false
+
+ val listDeferred = async {
+ context.mobileDataEnabledFlow(SUB_ID).toListWithTimeout()
+ }
+ delay(100)
+ mobileDataEnabledForSubId = true
+
+ assertThat(listDeferred.await()).hasSize(2)
+ }
+
+ private companion object {
+ const val SUB_ID = 123
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/MobileNetworkListFragmentTest.kt b/tests/spa_unit/src/com/android/settings/network/MobileNetworkListFragmentTest.kt
new file mode 100644
index 0000000..3ba4bac
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/MobileNetworkListFragmentTest.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2023 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.content.res.Resources
+import android.os.UserManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.settingslib.spaprivileged.framework.common.userManager
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+
+@RunWith(AndroidJUnit4::class)
+class MobileNetworkListFragmentTest {
+ private val mockUserManager = mock<UserManager>()
+
+ private val mockResources = mock<Resources>()
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { userManager } doReturn mockUserManager
+ on { resources } doReturn mockResources
+ }
+
+ @Test
+ fun isPageSearchEnabled_adminUser_shouldReturnTrue() {
+ mockUserManager.stub {
+ on { isAdminUser } doReturn true
+ }
+ mockResources.stub {
+ on { getBoolean(R.bool.config_show_sim_info) } doReturn true
+ }
+
+ val isEnabled =
+ MobileNetworkListFragment.SEARCH_INDEX_DATA_PROVIDER.isPageSearchEnabled(context)
+
+ assertThat(isEnabled).isTrue()
+ }
+
+ @Test
+ fun isPageSearchEnabled_nonAdminUser_shouldReturnFalse() {
+ mockUserManager.stub {
+ on { isAdminUser } doReturn false
+ }
+ mockResources.stub {
+ on { getBoolean(R.bool.config_show_sim_info) } doReturn true
+ }
+
+ val isEnabled =
+ MobileNetworkListFragment.SEARCH_INDEX_DATA_PROVIDER.isPageSearchEnabled(context)
+
+ assertThat(isEnabled).isFalse()
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
index 53ed4f0..1a05479 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
@@ -21,7 +21,6 @@
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import androidx.compose.runtime.SideEffect
-import androidx.compose.runtime.State
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
@@ -146,12 +145,12 @@
fun allAppListModel_getSummary() {
val listModel = AllAppListModel(context) { stateOf(SUMMARY) }
- lateinit var summaryState: State<String>
+ lateinit var summary: () -> String
composeTestRule.setContent {
- summaryState = listModel.getSummary(option = 0, record = AppRecordWithSize(app = APP))
+ summary = listModel.getSummary(option = 0, record = AppRecordWithSize(app = APP))
}
- assertThat(summaryState.value).isEqualTo(SUMMARY)
+ assertThat(summary()).isEqualTo(SUMMARY)
}
@Test
@@ -163,13 +162,13 @@
enabled = false
}
- lateinit var summaryState: State<String>
+ lateinit var summary: () -> String
composeTestRule.setContent {
- summaryState =
+ summary =
listModel.getSummary(option = 0, record = AppRecordWithSize(app = disabledApp))
}
- assertThat(summaryState.value).isEqualTo("$SUMMARY${System.lineSeparator()}Disabled")
+ assertThat(summary()).isEqualTo("$SUMMARY${System.lineSeparator()}Disabled")
}
@Test
@@ -179,13 +178,13 @@
packageName = PACKAGE_NAME
}
- lateinit var summaryState: State<String>
+ lateinit var summary: () -> String
composeTestRule.setContent {
- summaryState =
+ summary =
listModel.getSummary(option = 0, record = AppRecordWithSize(app = notInstalledApp))
}
- assertThat(summaryState.value)
+ assertThat(summary())
.isEqualTo("$SUMMARY${System.lineSeparator()}Not installed for this user")
}
@@ -207,7 +206,7 @@
AppListItemModel(
record = AppRecordWithSize(app = app),
label = LABEL,
- summary = stateOf(SUMMARY),
+ summary = { SUMMARY },
).AppItem()
}
}
@@ -224,13 +223,13 @@
isArchived = true
}
- lateinit var summaryState: State<String>
+ lateinit var summary: () -> String
composeTestRule.setContent {
- summaryState =
+ summary =
listModel.getSummary(option = 0, record = AppRecordWithSize(app = archivedApp))
}
- assertThat(summaryState.value).isEqualTo(SUMMARY)
+ assertThat(summary()).isEqualTo(SUMMARY)
}
private fun getAppListInput(): AppListInput<AppRecordWithSize> {
@@ -252,7 +251,7 @@
AppListItemModel(
record = AppRecordWithSize(app = APP),
label = LABEL,
- summary = stateOf(SUMMARY),
+ summary = { SUMMARY },
).AppItem()
}
}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt
index c5c48f5..74aa861 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/WifiControlAppListModelTest.kt
@@ -18,11 +18,8 @@
import android.Manifest
import android.app.AppOpsManager
-import android.app.AppOpsManager.MODE_ALLOWED
-import android.app.AppOpsManager.MODE_DEFAULT
import android.content.Context
import android.content.pm.ApplicationInfo
-import androidx.compose.runtime.State
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.lifecycle.MutableLiveData
import androidx.test.core.app.ApplicationProvider
@@ -40,9 +37,9 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
-import org.mockito.Mockito.`when` as whenever
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
+import org.mockito.Mockito.`when` as whenever
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
@@ -248,9 +245,9 @@
}
private fun getIsAllowed(record: AppOpPermissionRecord): Boolean? {
- lateinit var isAllowedState: State<Boolean?>
+ lateinit var isAllowedState: () -> Boolean?
composeTestRule.setContent { isAllowedState = listModel.isAllowed(record) }
- return isAllowedState.value
+ return isAllowedState()
}
private companion object {
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt
index 4f372e2..dfacca8 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt
@@ -21,7 +21,6 @@
import android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN
import android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_UNSET
import android.os.Build
-import androidx.compose.runtime.State
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
@@ -29,7 +28,6 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.testutils.FakeNavControllerWrapper
import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
import com.android.settingslib.spaprivileged.template.app.AppListItemModel
@@ -132,7 +130,7 @@
AppListItemModel(
record = APP_RECORD_SUGGESTED,
label = LABEL,
- summary = stateOf(SUMMARY)
+ summary = { SUMMARY }
).AppItem()
}
}
@@ -141,23 +139,23 @@
@Test
fun aspectRatioAppListModel_getSummaryDefault() {
- val summaryState = setSummaryState(USER_MIN_ASPECT_RATIO_UNSET)
- assertThat(summaryState.value)
- .isEqualTo(context.getString(R.string.user_aspect_ratio_app_default))
+ val summary = getSummary(USER_MIN_ASPECT_RATIO_UNSET)
+
+ assertThat(summary).isEqualTo(context.getString(R.string.user_aspect_ratio_app_default))
}
@Test
fun aspectRatioAppListModel_getSummaryWhenSplitScreen() {
- val summaryState = setSummaryState(USER_MIN_ASPECT_RATIO_SPLIT_SCREEN)
- assertThat(summaryState.value)
- .isEqualTo(context.getString(R.string.user_aspect_ratio_half_screen))
+ val summary = getSummary(USER_MIN_ASPECT_RATIO_SPLIT_SCREEN)
+
+ assertThat(summary).isEqualTo(context.getString(R.string.user_aspect_ratio_half_screen))
}
- private fun setSummaryState(userOverride: Int): State<String> {
+ private fun getSummary(userOverride: Int): String {
val listModel = UserAspectRatioAppListModel(context)
- lateinit var summaryState: State<String>
+ lateinit var summary: () -> String
composeTestRule.setContent {
- summaryState = listModel.getSummary(option = 0,
+ summary = listModel.getSummary(option = 0,
record = UserAspectRatioAppListItemModel(
app = APP,
userOverride = userOverride,
@@ -165,7 +163,7 @@
canDisplay = true,
))
}
- return summaryState
+ return summary()
}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt
index 8faf5c9..e2f55ef 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppButtonsTest.kt
@@ -17,16 +17,21 @@
package com.android.settings.spa.app.appinfo
import android.content.Context
+import android.content.Intent
import android.content.pm.ApplicationInfo
+import android.content.pm.FakeFeatureFlagsImpl
+import android.content.pm.Flags
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.onRoot
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.dx.mockito.inline.extended.ExtendedMockito
+import com.android.settings.R
import com.android.settingslib.applications.AppUtils
import com.android.settingslib.spa.testutils.delay
import kotlinx.coroutines.flow.MutableStateFlow
@@ -57,6 +62,8 @@
@Mock
private lateinit var packageManager: PackageManager
+ private val featureFlags = FakeFeatureFlagsImpl()
+
@Before
fun setUp() {
mockSession = ExtendedMockito.mockitoSession()
@@ -69,6 +76,7 @@
whenever(packageInfoPresenter.userPackageManager).thenReturn(packageManager)
whenever(packageManager.getPackageInfo(PACKAGE_NAME, 0)).thenReturn(PACKAGE_INFO)
whenever(AppUtils.isMainlineModule(packageManager, PACKAGE_NAME)).thenReturn(false)
+ featureFlags.setFlag(Flags.FLAG_ARCHIVING, true)
}
@After
@@ -92,10 +100,28 @@
composeTestRule.onRoot().assertIsDisplayed()
}
+ @Test
+ fun launchButton_displayed_archivingDisabled() {
+ whenever(packageManager.getLaunchIntentForPackage(PACKAGE_NAME)).thenReturn(Intent())
+ featureFlags.setFlag(Flags.FLAG_ARCHIVING, false)
+ setContent()
+
+ composeTestRule.onNodeWithText(context.getString(R.string.launch_instant_app)).assertIsDisplayed()
+ }
+
+ @Test
+ fun launchButton_notDisplayed_archivingEnabled() {
+ whenever(packageManager.getLaunchIntentForPackage(PACKAGE_NAME)).thenReturn(Intent())
+ featureFlags.setFlag(Flags.FLAG_ARCHIVING, true)
+ setContent()
+
+ composeTestRule.onNodeWithText(context.getString(R.string.launch_instant_app)).assertIsNotDisplayed()
+ }
+
private fun setContent() {
whenever(packageInfoPresenter.flow).thenReturn(MutableStateFlow(PACKAGE_INFO))
composeTestRule.setContent {
- AppButtons(packageInfoPresenter)
+ AppButtons(packageInfoPresenter, featureFlags)
}
composeTestRule.delay()
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/TopBarAppLaunchButtonTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/TopBarAppLaunchButtonTest.kt
new file mode 100644
index 0000000..7b54247
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/TopBarAppLaunchButtonTest.kt
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2023 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.spa.app.appinfo
+
+import android.content.Context
+import android.content.Intent
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.test.hasContentDescription
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithContentDescription
+import androidx.compose.ui.test.performClick
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.dx.mockito.inline.extended.ExtendedMockito
+import com.android.settings.R
+import com.android.settingslib.spa.testutils.waitUntilExists
+import com.android.settingslib.spaprivileged.model.app.userHandle
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.MockitoSession
+import org.mockito.Spy
+import org.mockito.quality.Strictness
+import org.mockito.Mockito.`when` as whenever
+
+@RunWith(AndroidJUnit4::class)
+class TopBarAppLaunchButtonTest {
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ private lateinit var mockSession: MockitoSession
+
+ @Spy
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ @Mock
+ private lateinit var packageInfoPresenter: PackageInfoPresenter
+
+ @Mock
+ private lateinit var userPackageManager: PackageManager
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+ whenever(packageInfoPresenter.context).thenReturn(context)
+ whenever(packageInfoPresenter.userPackageManager).thenReturn(userPackageManager)
+ val intent = Intent()
+ whenever(userPackageManager.getLaunchIntentForPackage(PACKAGE_NAME)).thenReturn(intent)
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun topBarAppLaunchButton_isDisplayed() {
+ val app = ApplicationInfo().apply {
+ packageName = PACKAGE_NAME
+ }
+
+ setContent(app)
+
+ composeTestRule.waitUntilExists(
+ hasContentDescription(context.getString(R.string.launch_instant_app))
+ )
+ }
+
+ @Test
+ fun topBarAppLaunchButton_opensApp() {
+ val app = ApplicationInfo().apply {
+ packageName = PACKAGE_NAME
+ }
+
+ setContent(app)
+ composeTestRule.onNodeWithContentDescription(context.getString(R.string.launch_instant_app))
+ .performClick()
+
+ verify(context).startActivityAsUser(any(), eq(app.userHandle))
+ }
+
+ private fun setContent(app: ApplicationInfo) {
+ composeTestRule.setContent {
+ CompositionLocalProvider(LocalContext provides context) {
+ TopBarAppLaunchButton(packageInfoPresenter, app)
+ }
+ }
+ }
+
+ private companion object {
+ const val PACKAGE_NAME = "package.name"
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt
index ccd385f..5c65da1 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt
@@ -29,7 +29,6 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
-import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.testutils.FakeNavControllerWrapper
import com.android.settingslib.spaprivileged.template.app.AppListItemModel
import com.google.common.truth.Truth.assertThat
@@ -244,7 +243,7 @@
app = APP,
dateOfInstall = TEST_FIRST_INSTALL_TIME),
label = TEST_LABEL,
- summary = stateOf(TEST_SUMMARY),
+ summary = { TEST_SUMMARY },
).AppItem()
}
}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/AllFilesAccessTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/AllFilesAccessTest.kt
index f5d422d..4c65d90 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/AllFilesAccessTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/AllFilesAccessTest.kt
@@ -33,33 +33,12 @@
private val listModel = AllFilesAccessListModel(context)
@Test
- fun pageTitleResId() {
+ fun modelResourceIdAndProperties() {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.manage_external_storage_title)
- }
-
- @Test
- fun switchTitleResId() {
assertThat(listModel.switchTitleResId).isEqualTo(R.string.permit_manage_external_storage)
- }
-
- @Test
- fun footerResId() {
- assertThat(listModel.footerResId)
- .isEqualTo(R.string.allow_manage_external_storage_description)
- }
-
- @Test
- fun appOp() {
+ assertThat(listModel.footerResId).isEqualTo(R.string.allow_manage_external_storage_description)
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE)
- }
-
- @Test
- fun permission() {
assertThat(listModel.permission).isEqualTo(Manifest.permission.MANAGE_EXTERNAL_STORAGE)
- }
-
- @Test
- fun setModeByUid() {
assertThat(listModel.setModeByUid).isTrue()
}
}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/LongBackgroundTasksAppsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/LongBackgroundTasksAppsTest.kt
new file mode 100644
index 0000000..579c6c9
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/LongBackgroundTasksAppsTest.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2023 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.spa.app.specialaccess
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import com.android.settings.R
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class LongBackgroundTasksAppsTest {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val listModel = LongBackgroundTasksAppsListModel(context)
+
+ @Test
+ fun modelResourceIdAndProperties() {
+ assertThat(listModel.pageTitleResId).isEqualTo(R.string.long_background_tasks_title)
+ assertThat(listModel.switchTitleResId).isEqualTo(R.string.long_background_tasks_switch_title)
+ assertThat(listModel.footerResId).isEqualTo(R.string.long_background_tasks_footer_title)
+ assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_RUN_USER_INITIATED_JOBS)
+ assertThat(listModel.permission).isEqualTo(Manifest.permission.RUN_USER_INITIATED_JOBS)
+ assertThat(listModel.setModeByUid).isTrue()
+ }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaManagementAppsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaManagementAppsTest.kt
index b56d997..b901043 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaManagementAppsTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/MediaManagementAppsTest.kt
@@ -33,33 +33,12 @@
private val listModel = MediaManagementAppsListModel(context)
@Test
- fun pageTitleResId() {
+ fun modelResourceIdAndProperties() {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.media_management_apps_title)
- }
-
- @Test
- fun switchTitleResId() {
- assertThat(listModel.switchTitleResId)
- .isEqualTo(R.string.media_management_apps_toggle_label)
- }
-
- @Test
- fun footerResId() {
+ assertThat(listModel.switchTitleResId).isEqualTo(R.string.media_management_apps_toggle_label)
assertThat(listModel.footerResId).isEqualTo(R.string.media_management_apps_description)
- }
-
- @Test
- fun appOp() {
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_MANAGE_MEDIA)
- }
-
- @Test
- fun permission() {
assertThat(listModel.permission).isEqualTo(Manifest.permission.MANAGE_MEDIA)
- }
-
- @Test
- fun setModeByUid() {
assertThat(listModel.setModeByUid).isTrue()
}
}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt
index 6054bb5..4229247 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt
@@ -67,18 +67,9 @@
}
@Test
- fun pageTitleResId() {
+ fun modelResourceId() {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.picture_in_picture_title)
- }
-
- @Test
- fun switchTitleResId() {
- assertThat(listModel.switchTitleResId)
- .isEqualTo(R.string.picture_in_picture_app_detail_switch)
- }
-
- @Test
- fun footerResId() {
+ assertThat(listModel.switchTitleResId).isEqualTo(R.string.picture_in_picture_app_detail_switch)
assertThat(listModel.footerResId).isEqualTo(R.string.picture_in_picture_app_detail_summary)
}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/TurnScreenOnAppsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/TurnScreenOnAppsTest.kt
new file mode 100644
index 0000000..9c6079d
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/TurnScreenOnAppsTest.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2023 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.spa.app.specialaccess
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class TurnScreenOnAppsTest {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val listModel = TurnScreenOnAppsListModel(context)
+
+ @Test
+ fun modelResourceIdAndProperties() {
+ assertThat(listModel.pageTitleResId).isEqualTo(com.android.settingslib.R.string.turn_screen_on_title)
+ assertThat(listModel.switchTitleResId).isEqualTo(com.android.settingslib.R.string.allow_turn_screen_on)
+ assertThat(listModel.footerResId).isEqualTo(com.android.settingslib.R.string.allow_turn_screen_on_description)
+ assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_TURN_SCREEN_ON)
+ assertThat(listModel.permission).isEqualTo(Manifest.permission.TURN_SCREEN_ON)
+ assertThat(listModel.setModeByUid).isTrue()
+ }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsPreferenceControllerTest.kt
new file mode 100644
index 0000000..2127497
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsPreferenceControllerTest.kt
@@ -0,0 +1,65 @@
+package com.android.settings.spa.app.specialaccess
+
+import android.content.Context
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.preference.Preference
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import com.android.settings.flags.Flags
+import com.google.common.truth.Truth.assertThat
+
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doNothing
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class VoiceActivationAppsPreferenceControllerTest {
+
+ @get:Rule
+ val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ doNothing().whenever(mock).startActivity(any())
+ }
+
+ private val matchedPreference = Preference(context).apply { key = preferenceKey }
+
+ private val misMatchedPreference = Preference(context).apply { key = testPreferenceKey }
+
+ private val controller = VoiceActivationAppsPreferenceController(context, preferenceKey)
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_VOICE_ACTIVATION_APPS_IN_SETTINGS)
+ fun getAvailabilityStatus_enableVoiceActivationApps_returnAvailable() {
+ assertThat(controller.isAvailable).isTrue()
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_VOICE_ACTIVATION_APPS_IN_SETTINGS)
+ fun getAvailableStatus_disableVoiceActivationApps_returnConditionallyUnavailable() {
+ assertThat(controller.isAvailable).isFalse()
+ }
+
+ @Test
+ fun handlePreferenceTreeClick_keyMatched_returnTrue() {
+ assertThat(controller.handlePreferenceTreeClick(matchedPreference)).isTrue()
+ }
+
+ @Test
+ fun handlePreferenceTreeClick_keyMisMatched_returnFalse() {
+ assertThat(controller.handlePreferenceTreeClick(misMatchedPreference)).isFalse()
+ }
+
+ companion object {
+ private const val preferenceKey: String = "voice_activation_apps"
+ private const val testPreferenceKey: String = "test_key"
+ }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsTest.kt
new file mode 100644
index 0000000..a2aa293
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/VoiceActivationAppsTest.kt
@@ -0,0 +1,30 @@
+package com.android.settings.spa.app.specialaccess
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class VoiceActivationAppsTest {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val listModel = VoiceActivationAppsListModel(context)
+
+ @Test
+ fun modelResourceIdAndProperties() {
+ assertThat(listModel.pageTitleResId).isEqualTo(R.string.voice_activation_apps_title)
+ assertThat(listModel.switchTitleResId).isEqualTo(R.string.permit_voice_activation_apps)
+ assertThat(listModel.footerResId).isEqualTo(R.string.allow_voice_activation_apps_description)
+ assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_RECEIVE_SANDBOX_TRIGGER_AUDIO)
+ assertThat(listModel.permission).isEqualTo(
+ Manifest.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO
+ )
+ assertThat(listModel.setModeByUid).isTrue()
+ }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt b/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt
index 0cfdc7d..6aee4ce 100644
--- a/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt
@@ -20,7 +20,6 @@
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.content.pm.PackageManager.PackageInfoFlags
-import androidx.compose.runtime.State
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -79,20 +78,20 @@
@Test
fun getSummary() = runTest {
- val summaryState = getSummaryState(APP)
+ val summary = getSummary(APP)
- assertThat(summaryState.value).isEqualTo(PACKAGE_NAME)
+ assertThat(summary).isEqualTo(PACKAGE_NAME)
}
- private fun getSummaryState(app: ApplicationInfo): State<String> {
- lateinit var summary: State<String>
+ private fun getSummary(app: ApplicationInfo): String {
+ lateinit var summary: () -> String
composeTestRule.setContent {
summary = listModel.getSummary(
option = 0,
record = PlatformCompatAppRecord(app),
)
}
- return summary
+ return summary()
}
private companion object {
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 54299eb..9b098a7 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -41,6 +41,7 @@
import com.android.settings.overlay.FeatureFactory
import com.android.settings.overlay.SurveyFeatureProvider
import com.android.settings.panel.PanelFeatureProvider
+import com.android.settings.privatespace.PrivateSpaceLoginFeatureProvider
import com.android.settings.search.SearchFeatureProvider
import com.android.settings.security.SecurityFeatureProvider
import com.android.settings.security.SecuritySettingsFeatureProvider
@@ -143,4 +144,6 @@
get() = TODO("Not yet implemented")
override val fastPairFeatureProvider: FastPairFeatureProvider
get() = TODO("Not yet implemented")
+ override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
+ get() = TODO("Not yet implemented")
}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index f0d0a0a..3440d2a 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -26,12 +26,14 @@
import android.os.Handler
import androidx.test.core.app.ApplicationProvider
import com.android.settings.biometrics.GatekeeperPasswordProvider
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
+import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
+import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.shared.model.Default
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.password.ChooseLockSettingsHelper
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.cancelAndJoin
@@ -69,7 +71,11 @@
@Mock private lateinit var gateKeeperPasswordProvider: GatekeeperPasswordProvider
private var testScope = TestScope(backgroundDispatcher)
- private var pressToAuthProvider = { true }
+ private var pressToAuthProvider =
+ object : PressToAuthProvider {
+ override val isEnabled: Boolean
+ get() = false
+ }
@Before
fun setup() {
@@ -80,6 +86,7 @@
fingerprintManager,
gateKeeperPasswordProvider,
pressToAuthProvider,
+ Default,
)
}
@@ -164,7 +171,7 @@
@Test
fun testRemoveFingerprint_succeeds() =
testScope.runTest {
- val fingerprintViewModelToRemove = FingerprintViewModel("Finger 2", 1, 2L)
+ val fingerprintViewModelToRemove = FingerprintData("Finger 2", 1, 2L)
val fingerprintToRemove = Fingerprint("Finger 2", 1, 2L)
val removalCallback: ArgumentCaptor<FingerprintManager.RemovalCallback> = argumentCaptor()
@@ -187,7 +194,7 @@
@Test
fun testRemoveFingerprint_fails() =
testScope.runTest {
- val fingerprintViewModelToRemove = FingerprintViewModel("Finger 2", 1, 2L)
+ val fingerprintViewModelToRemove = FingerprintData("Finger 2", 1, 2L)
val fingerprintToRemove = Fingerprint("Finger 2", 1, 2L)
val removalCallback: ArgumentCaptor<FingerprintManager.RemovalCallback> = argumentCaptor()
@@ -214,7 +221,7 @@
@Test
fun testRenameFingerprint_succeeds() =
testScope.runTest {
- val fingerprintToRename = FingerprintViewModel("Finger 2", 1, 2L)
+ val fingerprintToRename = FingerprintData("Finger 2", 1, 2L)
underTest.renameFingerprint(fingerprintToRename, "Woo")
@@ -226,7 +233,7 @@
testScope.runTest {
val fingerprint = Fingerprint("Woooo", 100, 101L)
- var result: FingerprintAuthAttemptViewModel? = null
+ var result: FingerprintAuthAttemptModel? = null
val job = launch { result = underTest.authenticate() }
val authCallback: ArgumentCaptor<FingerprintManager.AuthenticationCallback> = argumentCaptor()
@@ -247,13 +254,13 @@
runCurrent()
job.cancelAndJoin()
- assertThat(result).isEqualTo(FingerprintAuthAttemptViewModel.Success(fingerprint.biometricId))
+ assertThat(result).isEqualTo(FingerprintAuthAttemptModel.Success(fingerprint.biometricId))
}
@Test
fun testAuth_lockout() =
testScope.runTest {
- var result: FingerprintAuthAttemptViewModel? = null
+ var result: FingerprintAuthAttemptModel? = null
val job = launch { result = underTest.authenticate() }
val authCallback: ArgumentCaptor<FingerprintManager.AuthenticationCallback> = argumentCaptor()
@@ -274,7 +281,7 @@
job.cancelAndJoin()
assertThat(result)
.isEqualTo(
- FingerprintAuthAttemptViewModel.Error(FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "Lockout!!")
+ FingerprintAuthAttemptModel.Error(FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "Lockout!!")
)
}
@@ -282,7 +289,7 @@
fun testEnroll_progress() =
testScope.runTest {
val token = byteArrayOf(5, 3, 2)
- var result: FingerEnrollStateViewModel? = null
+ var result: FingerEnrollState? = null
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
runCurrent()
@@ -299,14 +306,14 @@
runCurrent()
job.cancelAndJoin()
- assertThat(result).isEqualTo(FingerEnrollStateViewModel.EnrollProgress(1))
+ assertThat(result).isEqualTo(FingerEnrollState.EnrollProgress(1, 2))
}
@Test
fun testEnroll_help() =
testScope.runTest {
val token = byteArrayOf(5, 3, 2)
- var result: FingerEnrollStateViewModel? = null
+ var result: FingerEnrollState? = null
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
runCurrent()
@@ -323,14 +330,14 @@
runCurrent()
job.cancelAndJoin()
- assertThat(result).isEqualTo(FingerEnrollStateViewModel.EnrollHelp(-1, "help"))
+ assertThat(result).isEqualTo(FingerEnrollState.EnrollHelp(-1, "help"))
}
@Test
fun testEnroll_error() =
testScope.runTest {
val token = byteArrayOf(5, 3, 2)
- var result: FingerEnrollStateViewModel? = null
+ var result: FingerEnrollState? = null
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
runCurrent()
@@ -343,17 +350,20 @@
capture(enrollCallback),
eq(FingerprintManager.ENROLL_FIND_SENSOR)
)
- enrollCallback.value.onEnrollmentError(-2, "error")
+ enrollCallback.value.onEnrollmentError(-1, "error")
runCurrent()
job.cancelAndJoin()
-
- assertThat(result).isEqualTo(FingerEnrollStateViewModel.EnrollError(-2, "error"))
+ assertThat(result).isInstanceOf(FingerEnrollState.EnrollError::class.java)
}
private fun <T : Any> safeEq(value: T): T = eq(value) ?: value
+
private fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
+
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
+
private fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall)
+
inline fun <reified T : Any> argumentCaptor(): ArgumentCaptor<T> =
ArgumentCaptor.forClass(T::class.java)
}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
index 509b0ed..bd94cba 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
@@ -21,7 +21,9 @@
import android.view.accessibility.AccessibilityManager
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.test.core.app.ApplicationProvider
+import com.android.settings.biometrics.fingerprint2.shared.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
@@ -70,6 +72,7 @@
private lateinit var foldStateViewModel: FoldStateViewModel
private lateinit var orientationStateViewModel: OrientationStateViewModel
private lateinit var underTest: FingerprintEnrollFindSensorViewModel
+ private lateinit var backgroundViewModel: BackgroundViewModel
private val context: Context = ApplicationProvider.getApplicationContext()
private val accessibilityManager: AccessibilityManager =
context.getSystemService(AccessibilityManager::class.java)!!
@@ -93,12 +96,18 @@
fakeFingerprintManagerInteractor,
gatekeeperViewModel,
canSkipConfirm = true,
+ Default,
)
.create(FingerprintEnrollNavigationViewModel::class.java)
+
+ backgroundViewModel =
+ BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
+ backgroundViewModel.inForeground()
enrollViewModel =
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
fakeFingerprintManagerInteractor,
- backgroundDispatcher
+ gatekeeperViewModel,
+ navigationViewModel,
)
.create(FingerprintEnrollViewModel::class.java)
accessibilityViewModel =
@@ -114,6 +123,7 @@
navigationViewModel,
enrollViewModel,
gatekeeperViewModel,
+ backgroundViewModel,
accessibilityViewModel,
foldStateViewModel,
orientationStateViewModel
@@ -123,6 +133,7 @@
// Navigate to Education page
navigationViewModel.nextStep()
}
+
@After
fun tearDown() {
Dispatchers.resetMain()
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/modules/enrolling/rfps/viewmodel/RFPSIconTouchViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/modules/enrolling/rfps/viewmodel/RFPSIconTouchViewModelTest.kt
new file mode 100644
index 0000000..46e883a
--- /dev/null
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/modules/enrolling/rfps/viewmodel/RFPSIconTouchViewModelTest.kt
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2023 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.fingerprint2.ui.enrollment.modules.enrolling.rfps.viewmodel
+
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.resetMain
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoJUnitRunner
+
+@RunWith(MockitoJUnitRunner::class)
+class RFPSIconTouchViewModelTest {
+ @JvmField @Rule var rule = MockitoJUnit.rule()
+
+ @get:Rule val instantTaskRule = InstantTaskExecutorRule()
+
+ private var backgroundDispatcher = StandardTestDispatcher()
+ private var testScope = TestScope(backgroundDispatcher)
+ private lateinit var rfpsIconTouchViewModel: RFPSIconTouchViewModel
+
+ @Before
+ fun setup() {
+ Dispatchers.setMain(backgroundDispatcher)
+ testScope = TestScope(backgroundDispatcher)
+ rfpsIconTouchViewModel =
+ RFPSIconTouchViewModel()
+ }
+
+ @After
+ fun tearDown() {
+ Dispatchers.resetMain()
+ }
+
+ @Test
+ fun initShouldNotShowDialog() =
+ testScope.runTest {
+ var shouldShowDialog = false
+
+ val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
+
+ runCurrent()
+
+ assertThat(shouldShowDialog).isFalse()
+ job.cancel()
+ }
+
+ @Test
+ fun shouldShowDialogTest() =
+ testScope.runTest {
+ var shouldShowDialog = false
+
+ val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
+
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+
+ runCurrent()
+
+ assertThat(shouldShowDialog).isTrue()
+ job.cancel()
+ }
+
+ @Test
+ fun stateShouldBeFalseAfterReset() =
+ testScope.runTest {
+ var shouldShowDialog = false
+
+ val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
+
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+
+ runCurrent()
+
+ assertThat(shouldShowDialog).isTrue()
+
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ runCurrent()
+
+ assertThat(shouldShowDialog).isFalse()
+
+ job.cancel()
+ }
+
+ @Test
+ fun toggleMultipleTimes() =
+ testScope.runTest {
+ var shouldShowDialog = false
+
+ val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
+
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+
+ runCurrent()
+
+ assertThat(shouldShowDialog).isTrue()
+
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ runCurrent()
+
+ assertThat(shouldShowDialog).isFalse()
+
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+ rfpsIconTouchViewModel.userTouchedFingerprintIcon()
+
+ runCurrent()
+ assertThat(shouldShowDialog).isTrue()
+
+ job.cancel()
+ }
+}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
new file mode 100644
index 0000000..efb4a07
--- /dev/null
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2023 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.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
+import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.resetMain
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoJUnitRunner
+
+@RunWith(MockitoJUnitRunner::class)
+class FingerprintEnrollEnrollingViewModelTest {
+ @JvmField @Rule var rule = MockitoJUnit.rule()
+
+ @get:Rule val instantTaskRule = InstantTaskExecutorRule()
+
+ private var backgroundDispatcher = StandardTestDispatcher()
+ private lateinit var enrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
+ private lateinit var backgroundViewModel: BackgroundViewModel
+ private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
+ private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+ private val defaultGatekeeperInfo = GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 3), 3)
+ private var testScope = TestScope(backgroundDispatcher)
+
+ private lateinit var fakeFingerprintManagerInteractor: FakeFingerprintManagerInteractor
+
+ private fun initialize(gatekeeperInfo: GatekeeperInfo = defaultGatekeeperInfo) {
+ fakeFingerprintManagerInteractor = FakeFingerprintManagerInteractor()
+ gateKeeperViewModel =
+ FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
+ gatekeeperInfo,
+ fakeFingerprintManagerInteractor
+ )
+ .create(FingerprintGatekeeperViewModel::class.java)
+
+ navigationViewModel =
+ FingerprintEnrollNavigationViewModel(
+ backgroundDispatcher,
+ fakeFingerprintManagerInteractor,
+ gateKeeperViewModel,
+ Enrollment,
+ NavState(true),
+ Default,
+ )
+
+ backgroundViewModel =
+ BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
+ backgroundViewModel.inForeground()
+ val fingerprintEnrollViewModel =
+ FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
+ fakeFingerprintManagerInteractor,
+ gateKeeperViewModel,
+ navigationViewModel,
+ )
+ .create(FingerprintEnrollViewModel::class.java)
+ enrollEnrollingViewModel =
+ FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingViewModelFactory(
+ fingerprintEnrollViewModel,
+ backgroundViewModel,
+ )
+ .create(FingerprintEnrollEnrollingViewModel::class.java)
+ }
+
+ @Before
+ fun setup() {
+ Dispatchers.setMain(backgroundDispatcher)
+ initialize()
+ }
+
+ @After
+ fun tearDown() {
+ Dispatchers.resetMain()
+ }
+
+ @Test
+ fun testEnrollShouldBeFalse() =
+ testScope.runTest {
+ var shouldEnroll = false
+
+ val job = launch {
+ enrollEnrollingViewModel.enrollFlowShouldBeRunning.collect { shouldEnroll = it }
+ }
+
+ assertThat(shouldEnroll).isFalse()
+ runCurrent()
+
+ enrollEnrollingViewModel.canEnroll()
+ runCurrent()
+
+ assertThat(shouldEnroll).isTrue()
+ job.cancel()
+ }
+
+ @Test
+ fun testEnrollShouldBeFalseWhenBackground() =
+ testScope.runTest {
+ var shouldEnroll = false
+
+ val job = launch {
+ enrollEnrollingViewModel.enrollFlowShouldBeRunning.collect { shouldEnroll = it }
+ }
+
+ assertThat(shouldEnroll).isFalse()
+ runCurrent()
+
+ enrollEnrollingViewModel.canEnroll()
+ runCurrent()
+
+ assertThat(shouldEnroll).isTrue()
+
+ backgroundViewModel.wentToBackground()
+ runCurrent()
+ assertThat(shouldEnroll).isFalse()
+
+ job.cancel()
+ }
+}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
index d4dbec5..064e087 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
@@ -18,7 +18,7 @@
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FinishSettings
@@ -208,7 +208,7 @@
fun enrollAdditionalFingerprints_fails() =
testScope.runTest {
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
+ mutableListOf(FingerprintData("a", 1, 3L))
fakeFingerprintManagerInteractor.challengeToGenerate = Pair(4L, byteArrayOf(3, 3, 1))
var nextStep: NextStepViewModel? = null
@@ -227,7 +227,7 @@
fun enrollAdditional_success() =
testScope.runTest {
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
+ mutableListOf(FingerprintData("a", 1, 3L))
var nextStep: NextStepViewModel? = null
val job = launch { underTest.nextStep.collect { nextStep = it } }
@@ -245,7 +245,7 @@
fun confirmDeviceCredential_withEnrolledFingerprint_showsSettings() =
testScope.runTest {
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
+ mutableListOf(FingerprintData("a", 1, 3L))
fakeFingerprintManagerInteractor.challengeToGenerate = Pair(10L, byteArrayOf(1, 2, 3))
var nextStep: NextStepViewModel? = null
@@ -320,7 +320,7 @@
fun showSettings_shouldFinish() =
testScope.runTest {
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
+ mutableListOf(FingerprintData("a", 1, 3L))
var nextStep: NextStepViewModel? = null
val job = launch { underTest.nextStep.collect { nextStep = it } }
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
index d25ced0..4bd9121 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
@@ -17,8 +17,8 @@
package com.android.settings.fingerprint2.ui.settings
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel
@@ -103,7 +103,7 @@
FingerprintSensorType.UDFPS_OPTICAL,
)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
+ mutableListOf(FingerprintData("a", 1, 3L))
underTest =
FingerprintSettingsViewModel.FingerprintSettingsViewModelFactory(
@@ -114,7 +114,7 @@
)
.create(FingerprintSettingsViewModel::class.java)
- var authAttempt: FingerprintAuthAttemptViewModel? = null
+ var authAttempt: FingerprintAuthAttemptModel? = null
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
underTest.shouldAuthenticate(true)
@@ -139,7 +139,7 @@
FingerprintSensorType.UDFPS_ULTRASONIC,
)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
+ mutableListOf(FingerprintData("a", 1, 3L))
underTest =
FingerprintSettingsViewModel.FingerprintSettingsViewModelFactory(
@@ -150,7 +150,7 @@
)
.create(FingerprintSettingsViewModel::class.java)
- var authAttempt: FingerprintAuthAttemptViewModel? = null
+ var authAttempt: FingerprintAuthAttemptModel? = null
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
underTest.shouldAuthenticate(true)
@@ -173,8 +173,8 @@
FingerprintSensorType.POWER_BUTTON
)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
- mutableListOf(FingerprintViewModel("a", 1, 3L))
- val success = FingerprintAuthAttemptViewModel.Success(1)
+ mutableListOf(FingerprintData("a", 1, 3L))
+ val success = FingerprintAuthAttemptModel.Success(1)
fakeFingerprintManagerInteractor.authenticateAttempt = success
underTest =
@@ -186,7 +186,7 @@
)
.create(FingerprintSettingsViewModel::class.java)
- var authAttempt: FingerprintAuthAttemptViewModel? = null
+ var authAttempt: FingerprintAuthAttemptModel? = null
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
underTest.shouldAuthenticate(true)
@@ -200,7 +200,7 @@
@Test
fun deleteDialog_showAndDismiss() = runTest {
- val fingerprintToDelete = FingerprintViewModel("A", 1, 10L)
+ val fingerprintToDelete = FingerprintData("A", 1, 10L)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(fingerprintToDelete)
@@ -236,7 +236,7 @@
@Test
fun renameDialog_showAndDismiss() = runTest {
- val fingerprintToRename = FingerprintViewModel("World", 1, 10L)
+ val fingerprintToRename = FingerprintData("World", 1, 10L)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(fingerprintToRename)
@@ -274,7 +274,7 @@
@Test
fun testTwoDialogsCannotShow_atSameTime() = runTest {
- val fingerprintToDelete = FingerprintViewModel("A", 1, 10L)
+ val fingerprintToDelete = FingerprintData("A", 1, 10L)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(fingerprintToDelete)
@@ -311,9 +311,9 @@
fun authenticatePauses_whenPaused() =
testScope.runTest {
val fingerprints = setupAuth()
- val success = FingerprintAuthAttemptViewModel.Success(fingerprints.first().fingerId)
+ val success = FingerprintAuthAttemptModel.Success(fingerprints.first().fingerId)
- var authAttempt: FingerprintAuthAttemptViewModel? = null
+ var authAttempt: FingerprintAuthAttemptModel? = null
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
@@ -325,7 +325,7 @@
assertThat(authAttempt).isEqualTo(success)
fakeFingerprintManagerInteractor.authenticateAttempt =
- FingerprintAuthAttemptViewModel.Success(10)
+ FingerprintAuthAttemptModel.Success(10)
underTest.shouldAuthenticate(false)
advanceTimeBy(400)
runCurrent()
@@ -340,7 +340,7 @@
testScope.runTest {
val fingerprints = setupAuth()
- var authAttempt: FingerprintAuthAttemptViewModel? = null
+ var authAttempt: FingerprintAuthAttemptModel? = null
val job = launch { underTest.authFlow.take(1).collectLatest { authAttempt = it } }
underTest.shouldAuthenticate(true)
navigationViewModel.onConfirmDevice(true, 10L)
@@ -357,7 +357,7 @@
testScope.runTest {
val fingerprints = setupAuth()
- var authAttempt: FingerprintAuthAttemptViewModel? = null
+ var authAttempt: FingerprintAuthAttemptModel? = null
val job = launch { underTest.authFlow.take(1).collectLatest { authAttempt = it } }
underTest.shouldAuthenticate(true)
navigationViewModel.onConfirmDevice(true, 10L)
@@ -370,7 +370,7 @@
assertThat(authAttempt).isEqualTo(null)
}
- private fun setupAuth(): MutableList<FingerprintViewModel> {
+ private fun setupAuth(): MutableList<FingerprintData> {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor(
0 /* sensorId */,
@@ -379,9 +379,9 @@
FingerprintSensorType.POWER_BUTTON
)
val fingerprints =
- mutableListOf(FingerprintViewModel("a", 1, 3L), FingerprintViewModel("b", 2, 5L))
+ mutableListOf(FingerprintData("a", 1, 3L), FingerprintData("b", 2, 5L))
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fingerprints
- val success = FingerprintAuthAttemptViewModel.Success(1)
+ val success = FingerprintAuthAttemptModel.Success(1)
fakeFingerprintManagerInteractor.authenticateAttempt = success
underTest =
diff --git a/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java b/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java
index 31b8e79..5ac367e 100644
--- a/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/localepicker/LocaleHelperPreferenceControllerTest.java
@@ -19,12 +19,14 @@
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.verify;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Looper;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.widget.FooterPreference;
import org.junit.Before;
@@ -37,6 +39,7 @@
public class LocaleHelperPreferenceControllerTest {
private Context mContext;
private LocaleHelperPreferenceController mLocaleHelperPreferenceController;
+ private FakeFeatureFactory mFeatureFactory;
@Mock
private FooterPreference mMockFooterPreference;
@@ -49,11 +52,16 @@
}
mContext = ApplicationProvider.getApplicationContext();
mLocaleHelperPreferenceController = new LocaleHelperPreferenceController(mContext);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
}
@Test
public void updateFooterPreference_setFooterPreference_hasClickAction() {
mLocaleHelperPreferenceController.updateFooterPreference(mMockFooterPreference);
verify(mMockFooterPreference).setLearnMoreText(anyString());
+ mMockFooterPreference.setLearnMoreAction(v -> {
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mContext, SettingsEnums.ACTION_LANGUAGES_LEARN_MORE);
+ });
}
}
diff --git a/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java b/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java
index 0a67824..5c42ad9 100644
--- a/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java
+++ b/tests/unit/src/com/android/settings/regionalpreferences/NumberingSystemItemControllerTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
import android.os.LocaleList;
@@ -51,6 +52,7 @@
private NumberingPreferencesFragment mFragment;
private PreferenceScreen mPreferenceScreen;
private LocaleList mCacheLocale;
+ private FakeFeatureFactory mFeatureFactory;
@Before
@UiThreadTest
@@ -59,6 +61,7 @@
Looper.prepare();
}
mApplicationContext = ApplicationProvider.getApplicationContext();
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mFragment = spy(new NumberingPreferencesFragment());
PreferenceManager preferenceManager = new PreferenceManager(mApplicationContext);
mPreferenceScreen = preferenceManager.createPreferenceScreen(mApplicationContext);
@@ -94,6 +97,10 @@
}
assertTrue(isCallingStartActivity);
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mApplicationContext,
+ SettingsEnums.ACTION_CHOOSE_LANGUAGE_FOR_NUMBERS_PREFERENCES,
+ "I_am_the_key");
}
@Test
@@ -114,6 +121,9 @@
mController.handlePreferenceTreeClick(preference);
verify(mFragment).setArguments(any());
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mApplicationContext, SettingsEnums.ACTION_SET_NUMBERS_PREFERENCES,
+ "test_key");
}
@Test
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index b5062a0..bf2c84a 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -46,6 +46,7 @@
import com.android.settings.overlay.SupportFeatureProvider;
import com.android.settings.overlay.SurveyFeatureProvider;
import com.android.settings.panel.PanelFeatureProvider;
+import com.android.settings.privatespace.PrivateSpaceLoginFeatureProvider;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.security.SecuritySettingsFeatureProvider;
@@ -98,6 +99,7 @@
public StylusFeatureProvider mStylusFeatureProvider;
public OnboardingFeatureProvider mOnboardingFeatureProvider;
public FastPairFeatureProvider mFastPairFeatureProvider;
+ public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
/**
* Call this in {@code @Before} method of the test class to use fake factory.
@@ -145,6 +147,7 @@
mStylusFeatureProvider = mock(StylusFeatureProvider.class);
mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
+ mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
}
@Override
@@ -322,4 +325,9 @@
public FastPairFeatureProvider getFastPairFeatureProvider() {
return mFastPairFeatureProvider;
}
+
+ @Override
+ public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
+ return mPrivateSpaceLoginFeatureProvider;
+ }
}