Snap for 12065372 from 4b027e6ebf to 24Q4-release
Change-Id: I534328ba570d46025f8b970e0ecfddfef7db6d50
This commit is contained in:
@@ -86,6 +86,7 @@ android_library {
|
||||
"securebox",
|
||||
"android.os.flags-aconfig-java",
|
||||
"//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
|
||||
"WindowManager-Shell-shared-desktopMode",
|
||||
|
||||
// Settings dependencies
|
||||
"FingerprintManagerInteractor",
|
||||
|
||||
@@ -24,3 +24,10 @@ flag {
|
||||
purpose: PURPOSE_BUGFIX
|
||||
}
|
||||
}
|
||||
|
||||
flag {
|
||||
name: "enable_bluetooth_device_details_polish"
|
||||
namespace: "cross_device_experiences"
|
||||
description: "Gates whether to enable bluetooth device details polish"
|
||||
bug: "343317785"
|
||||
}
|
||||
|
||||
@@ -25,20 +25,20 @@
|
||||
<string name="bluetooth_footer_mac_message" product="device" msgid="8944917742814573320">"Adresse Bluetooth de l\'appareil : <xliff:g id="BLUETOOTH_MAC_ADDRESS">%1$s</xliff:g>"</string>
|
||||
<string name="bluetooth_ask_discovery" product="tablet" msgid="7430581669309228387">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite rendre votre tablette visible à d\'autres appareils Bluetooth pendant <xliff:g id="TIMEOUT">%2$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_discovery" product="default" msgid="3947027393224406367">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite rendre votre téléphone visible à d\'autres appareils Bluetooth pendant <xliff:g id="TIMEOUT">%2$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_discovery_no_name" product="tablet" msgid="440976482246291783">"Une application souhaite rendre votre tablette visible à d\'autres appareils Bluetooth pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_discovery_no_name" product="default" msgid="5164413774312648842">"Une application souhaite rendre votre téléphone visible à d\'autres appareils Bluetooth pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_discovery_no_name" product="tablet" msgid="440976482246291783">"Une appli souhaite rendre votre tablette visible à d\'autres appareils Bluetooth pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_discovery_no_name" product="default" msgid="5164413774312648842">"Une appli souhaite rendre votre téléphone visible à d\'autres appareils Bluetooth pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_lasting_discovery" product="tablet" msgid="750347558570909906">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite rendre votre tablette visible à d\'autres appareils Bluetooth. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_lasting_discovery" product="default" msgid="5844129004156080891">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite rendre votre téléphone visible à d\'autres appareils Bluetooth. Vous pouvez modifier ce paramètres plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_lasting_discovery_no_name" product="tablet" msgid="1062185767225450964">"Une application souhaite rendre votre tablette visible à d\'autres appareils Bluetooth. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_lasting_discovery_no_name" product="default" msgid="7909547303183236140">"Une application souhaite rendre votre téléphone visible à d\'autres appareils Bluetooth. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_lasting_discovery_no_name" product="tablet" msgid="1062185767225450964">"Une appli souhaite rendre votre tablette visible à d\'autres appareils Bluetooth. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_lasting_discovery_no_name" product="default" msgid="7909547303183236140">"Une appli souhaite rendre votre téléphone visible à d\'autres appareils Bluetooth. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_enablement_and_discovery" product="tablet" msgid="6187874232925632790">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite activer le Bluetooth et rendre votre tablette visible à d\'autres appareils pendant <xliff:g id="TIMEOUT">%2$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_enablement_and_discovery" product="default" msgid="1018495685727482700">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite activer le Bluetooth et rendre votre téléphone visible à d\'autres appareils pendant <xliff:g id="TIMEOUT">%2$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_enablement_and_discovery_no_name" product="tablet" msgid="3469927640700478737">"Une application souhaite activer le Bluetooth et rendre votre tablette visible à d\'autres appareils pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_enablement_and_discovery_no_name" product="default" msgid="4847493437698663706">"Une application souhaite activer le Bluetooth et rendre votre téléphone visible à d\'autres appareils pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_enablement_and_discovery_no_name" product="tablet" msgid="3469927640700478737">"Une appli souhaite activer le Bluetooth et rendre votre tablette visible à d\'autres appareils pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_enablement_and_discovery_no_name" product="default" msgid="4847493437698663706">"Une appli souhaite activer le Bluetooth et rendre votre téléphone visible à d\'autres appareils pendant <xliff:g id="TIMEOUT">%1$d</xliff:g> secondes."</string>
|
||||
<string name="bluetooth_ask_enablement_and_lasting_discovery" product="tablet" msgid="487436507630570730">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite activer le Bluetooth et rendre votre tablette visible à d\'autres appareils. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_enablement_and_lasting_discovery" product="default" msgid="5169934906530139494">"<xliff:g id="APP_NAME">%1$s</xliff:g> souhaite activer le Bluetooth et rendre votre téléphone visible à d\'autres appareils. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_enablement_and_lasting_discovery_no_name" product="tablet" msgid="505214056751470551">"Une application souhaite activer le Bluetooth et rendre votre tablette visible à d\'autres appareils. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_enablement_and_lasting_discovery_no_name" product="default" msgid="6187216564831513193">"Une application souhaite activer le Bluetooth et rendre votre téléphone visible à d\'autres appareils. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_enablement_and_lasting_discovery_no_name" product="tablet" msgid="505214056751470551">"Une appli souhaite activer le Bluetooth et rendre votre tablette visible à d\'autres appareils. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="bluetooth_ask_enablement_and_lasting_discovery_no_name" product="default" msgid="6187216564831513193">"Une appli souhaite activer le Bluetooth et rendre votre téléphone visible à d\'autres appareils. Vous pouvez modifier ce réglage plus tard dans les paramètres Bluetooth."</string>
|
||||
<string name="encryption_and_credential_settings_summary" product="default" msgid="3741475436042800617">"Téléphone chiffré"</string>
|
||||
<string name="not_encrypted_summary" product="default" msgid="330652312169527734">"Téléphone non chiffré"</string>
|
||||
<string name="encryption_and_credential_settings_summary" product="tablet" msgid="2220021007677215054">"Appareil chiffré"</string>
|
||||
@@ -49,18 +49,18 @@
|
||||
<string name="security_settings_face_enroll_introduction_accessibility_expanded" product="default" msgid="2221590003018953090"></string>
|
||||
<string name="security_settings_face_enroll_introduction_accessibility_expanded" product="tablet" msgid="2221590003018953090"></string>
|
||||
<string name="security_settings_face_enroll_introduction_accessibility_expanded" product="device" msgid="2221590003018953090"></string>
|
||||
<string name="security_settings_face_enroll_introduction_message" product="default" msgid="847716059867943459">"Utilisez votre visage pour déverrouiller votre téléphone, autoriser vos achats et vous connecter à des applications."</string>
|
||||
<string name="security_settings_face_enroll_introduction_message" product="tablet" msgid="3976493376026067375">"Utilisez votre visage pour déverrouiller votre tablette, autoriser vos achats et vous connecter à des applications."</string>
|
||||
<string name="security_settings_face_enroll_introduction_message" product="device" msgid="6432265830098806034">"Utilisez votre visage pour déverrouiller votre appareil, autoriser vos achats et vous connecter à des applications."</string>
|
||||
<string name="security_settings_face_enroll_introduction_message" product="default" msgid="847716059867943459">"Utilisez votre visage pour déverrouiller votre téléphone, autoriser vos achats et vous connecter à des applis."</string>
|
||||
<string name="security_settings_face_enroll_introduction_message" product="tablet" msgid="3976493376026067375">"Utilisez votre visage pour déverrouiller votre tablette, autoriser vos achats et vous connecter à des applis."</string>
|
||||
<string name="security_settings_face_enroll_introduction_message" product="device" msgid="6432265830098806034">"Utilisez votre visage pour déverrouiller votre appareil, autoriser vos achats et vous connecter à des applis."</string>
|
||||
<string name="security_settings_face_enroll_introduction_message_class3" product="default" msgid="8492576130109033451">"Utilisez votre visage pour déverrouiller votre téléphone ou pour confirmer votre identité dans les applis, par exemple lorsque vous vous connectez ou que vous approuvez un achat"</string>
|
||||
<string name="security_settings_face_enroll_introduction_message_class3" product="tablet" msgid="8736497842795690098">"Utilisez votre visage pour déverrouiller votre tablette ou pour confirmer votre identité dans les applis, par exemple lorsque vous vous connectez ou que vous approuvez un achat"</string>
|
||||
<string name="security_settings_face_enroll_introduction_message_class3" product="device" msgid="2558057312718921078">"Utilisez votre visage pour déverrouiller votre appareil ou pour confirmer votre identité dans les applis, par exemple lorsque vous vous connectez ou que vous approuvez un achat"</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Autoriser votre enfant à utiliser son visage pour déverrouiller son téléphone"</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Autoriser votre enfant à utiliser son visage pour déverrouiller sa tablette"</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Autoriser votre enfant à utiliser son visage pour déverrouiller son appareil"</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Autorisez votre enfant à utiliser son visage pour déverrouiller son téléphone ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Autorisez votre enfant à utiliser son visage pour déverrouiller sa tablette ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Autorisez votre enfant à utiliser son visage pour déverrouiller son appareil ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Autorisez votre enfant à utiliser son visage pour déverrouiller son téléphone ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Autorisez votre enfant à utiliser son visage pour déverrouiller sa tablette ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Autorisez votre enfant à utiliser son visage pour déverrouiller son appareil ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"L\'utilisation du visage de votre enfant pour déverrouiller son téléphone peut être moins sûre qu\'un schéma ou un NIP robustes."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"L\'utilisation du visage de votre enfant pour déverrouiller sa tablette peut être moins sûre qu\'un schéma ou un NIP robustes."</string>
|
||||
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"L\'utilisation du visage de votre enfant pour déverrouiller son appareil peut être moins sûre qu\'un schéma ou un NIP robustes."</string>
|
||||
@@ -94,22 +94,22 @@
|
||||
<string name="security_settings_face_enroll_introduction_control_consent_message" product="default" msgid="6983939010814873996"></string>
|
||||
<string name="security_settings_face_enroll_introduction_control_consent_message" product="tablet" msgid="6983939010814873996"></string>
|
||||
<string name="security_settings_face_enroll_introduction_control_consent_message" product="device" msgid="6983939010814873996"></string>
|
||||
<string name="security_settings_face_settings_footer" product="default" msgid="3036403896485044957">"Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer" product="tablet" msgid="3467711032275909082">"Utilisez votre visage pour déverrouiller votre tablette ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer" product="device" msgid="6237815625247917310">"Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_attention_not_supported" product="default" msgid="8266896471278294942">"Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_attention_not_supported" product="tablet" msgid="6932278790700490818">"Utilisez votre visage pour déverrouiller votre tablette ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_attention_not_supported" product="device" msgid="2559602951942339212">"Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applications, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3" product="default" msgid="7050076350282827484">"Utilisez votre visage pour déverrouiller votre téléphone ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3" product="tablet" msgid="8013245173915280810">"Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3" product="device" msgid="4411845832787210264">"Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3_attention_not_supported" product="default" msgid="5512898803063743303">"Utilisez votre visage pour déverrouiller votre téléphone ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3_attention_not_supported" product="tablet" msgid="6790505667764631343">"Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3_attention_not_supported" product="device" msgid="7858917821957779752">"Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_v3_message" msgid="2145273491174234191">"Utilisez votre empreinte digitale pour déverrouiller votre <xliff:g id="DEVICENAME">%s</xliff:g> ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="default" msgid="5101253231118659496">"Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller son téléphone ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus."</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="tablet" msgid="3063978167545799342">"Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller sa tablette ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus."</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="device" msgid="4399560001732497632">"Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller son appareil ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applications, approuve un achat et plus."</string>
|
||||
<string name="security_settings_face_settings_footer" product="default" msgid="3036403896485044957">"Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applis, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer" product="tablet" msgid="3467711032275909082">"Utilisez votre visage pour déverrouiller votre tablette ou pour vous authentifier dans les applis, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer" product="device" msgid="6237815625247917310">"Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applis, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_attention_not_supported" product="default" msgid="8266896471278294942">"Utilisez votre visage pour déverrouiller votre téléphone ou pour vous authentifier dans les applis, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_attention_not_supported" product="tablet" msgid="6932278790700490818">"Utilisez votre visage pour déverrouiller votre tablette ou pour vous authentifier dans les applis, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_attention_not_supported" product="device" msgid="2559602951942339212">"Utilisez votre visage pour déverrouiller votre appareil ou pour vous authentifier dans les applis, par exemple lorsque vous vous connectez ou approuvez un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3" product="default" msgid="7050076350282827484">"Utilisez votre visage pour déverrouiller votre téléphone ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3" product="tablet" msgid="8013245173915280810">"Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3" product="device" msgid="4411845832787210264">"Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3_attention_not_supported" product="default" msgid="5512898803063743303">"Utilisez votre visage pour déverrouiller votre téléphone ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller le téléphone en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre téléphone en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre téléphone pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3_attention_not_supported" product="tablet" msgid="6790505667764631343">"Utilisez votre visage pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller la tablette en la regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre tablette en la tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre tablette pourrait être déverrouillée par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_face_settings_footer_class3_attention_not_supported" product="device" msgid="7858917821957779752">"Utilisez votre visage pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat.\n\nGardez à l\'esprit :\nUn seul visage peut être configuré à la fois. Pour ajouter un autre visage, supprimez le visage actuel.\n\nVous pourriez déverrouiller l\'appareil en le regardant, même si vous ne cherchiez pas à le faire.\n\nUne autre personne pourrait déverrouiller votre appareil en le tenant devant votre visage, même si vos yeux sont fermés.\n\nVotre appareil pourrait être déverrouillé par une personne qui vous ressemble beaucoup, comme un jumeau identique."</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_v3_message" msgid="2145273491174234191">"Utilisez votre empreinte digitale pour déverrouiller votre <xliff:g id="DEVICENAME">%s</xliff:g> ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="default" msgid="5101253231118659496">"Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller son téléphone ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus."</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="tablet" msgid="3063978167545799342">"Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller sa tablette ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus."</string>
|
||||
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="device" msgid="4399560001732497632">"Autorisez votre enfant à utiliser son empreinte digitale pour déverrouiller son appareil ou vérifier qu\'il s\'agit bien de lui. Cette situation se produit lorsqu\'il se connecte à des applis, approuve un achat et plus."</string>
|
||||
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_1" product="default" msgid="8488497844109768268">"Déverrouiller votre téléphone avec votre empreinte digitale peut être plus risqué qu\'avec un schéma ou un NIP robuste"</string>
|
||||
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_1" product="tablet" msgid="5688664190282817312">"Le déverrouillage de votre tablette avec votre empreinte digitale peut être plus risqué qu\'avec un schéma ou un NIP robuste"</string>
|
||||
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_1" product="device" msgid="2814616139536479018">"Le déverrouillage de votre appareil avec votre empreinte digitale peut être plus risqué qu\'avec un schéma ou un NIP robuste"</string>
|
||||
@@ -146,12 +146,12 @@
|
||||
<string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="2006739081527422127">"Le capteur d\'empreintes digitales est situé sur l\'interrupteur. Il s\'agit du bouton plat situé à côté du bouton de volume surélevé, sur le bord de la tablette."</string>
|
||||
<string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="1209233633252372907">"Le capteur d\'empreintes digitales est situé sur l\'interrupteur. Il s\'agit du bouton plat situé à côté du bouton de volume surélevé, sur le bord de l\'appareil."</string>
|
||||
<string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="6862493139500275821">"Le capteur d\'empreintes digitales est situé sur l\'interrupteur. Il s\'agit du bouton plat situé à côté du bouton de volume surélevé, sur le bord du téléphone."</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="2012126789397819713">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="device" msgid="7119860465479161782">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="default" msgid="8255422287180693200">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre téléphone ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="tablet" msgid="7814892482046294464">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre tablette ou pour vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou pour approuver un achat. \n\nAjoutez une autre empreinte digitale pour faciliter le déverrouillage lorsque vous tenez votre tablette de différentes façons."</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="device" msgid="8418220207105495988">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre appareil ou pour vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou pour approuver un achat.\n\nAjoutez une autre empreinte digitale pour faciliter le déverrouillage lorsque vous tenez votre appareil de différentes façons."</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="default" msgid="3545300825124248359">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre téléphone ou pour vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applications ou pour approuver un achat.\n\nAjoutez une autre empreinte digitale pour faciliter le déverrouillage lorsque vous tenez votre téléphone de différentes façons."</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="2012126789397819713">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre tablette ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="device" msgid="7119860465479161782">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre appareil ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="default" msgid="8255422287180693200">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre téléphone ou vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou approuver un achat"</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="tablet" msgid="7814892482046294464">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre tablette ou pour vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou pour approuver un achat. \n\nAjoutez une autre empreinte digitale pour faciliter le déverrouillage lorsque vous tenez votre tablette de différentes façons."</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="device" msgid="8418220207105495988">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre appareil ou pour vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou pour approuver un achat.\n\nAjoutez une autre empreinte digitale pour faciliter le déverrouillage lorsque vous tenez votre appareil de différentes façons."</string>
|
||||
<string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="default" msgid="3545300825124248359">"Vous pouvez maintenant utiliser votre empreinte digitale pour déverrouiller votre téléphone ou pour vérifier qu\'il s\'agit bien de vous, par exemple pour vous connecter à des applis ou pour approuver un achat.\n\nAjoutez une autre empreinte digitale pour faciliter le déverrouillage lorsque vous tenez votre téléphone de différentes façons."</string>
|
||||
<string name="lock_screen_pin_skip_message" product="tablet" msgid="2125894016330764666">"Un NIP protège la tablette en cas de perte ou de vol de celle-ci"</string>
|
||||
<string name="lock_screen_pattern_skip_message" product="tablet" msgid="7022124791463099454">"Un schéma protège la tablette en cas de perte ou de vol de celle-ci"</string>
|
||||
<string name="lock_screen_password_skip_message" product="tablet" msgid="7117050321575989041">"Un mot de passe protège la tablette en cas de perte ou de vol de celle-ci"</string>
|
||||
@@ -191,9 +191,9 @@
|
||||
<string name="fingerprint_v2_delete_message" product="default" msgid="8723083814238510088">"Les images et le modèle d\'empreinte digitale associés à « <xliff:g id="FINGERPRINT_ID">%1$s</xliff:g> » et stockés sur votre téléphone seront supprimés"</string>
|
||||
<string name="fingerprint_v2_delete_message" product="tablet" msgid="527375244730792698">"Les images et le modèle d\'empreinte digitale associés à « <xliff:g id="FINGERPRINT_ID">%1$s</xliff:g> » et stockés sur votre tablette seront supprimés"</string>
|
||||
<string name="fingerprint_v2_delete_message" product="device" msgid="4549780655045100171">"Les images et le modèle d\'empreinte digitale associés à « <xliff:g id="FINGERPRINT_ID">%1$s</xliff:g> » et stockés sur votre appareil seront supprimés"</string>
|
||||
<string name="fingerprint_last_delete_message" product="default" msgid="3187410175262625294">"Vous ne pourrez pas utiliser votre empreinte digitale pour déverrouiller votre téléphone ni pour vérifier qu\'il s\'agit bien de vous dans les applications."</string>
|
||||
<string name="fingerprint_last_delete_message" product="tablet" msgid="8618307419148004587">"Vous ne pourrez pas utiliser votre empreinte digitale pour déverrouiller votre tablette ni pour vérifier qu\'il s\'agit bien de vous dans les applications."</string>
|
||||
<string name="fingerprint_last_delete_message" product="device" msgid="3910012280858587242">"Vous ne pourrez pas utiliser votre empreinte digitale pour déverrouiller votre appareil ni pour vérifier qu\'il s\'agit bien de vous dans les applications."</string>
|
||||
<string name="fingerprint_last_delete_message" product="default" msgid="3187410175262625294">"Vous ne pourrez pas utiliser votre empreinte digitale pour déverrouiller votre téléphone ni pour vérifier qu\'il s\'agit bien de vous dans les applis."</string>
|
||||
<string name="fingerprint_last_delete_message" product="tablet" msgid="8618307419148004587">"Vous ne pourrez pas utiliser votre empreinte digitale pour déverrouiller votre tablette ni pour vérifier qu\'il s\'agit bien de vous dans les applis."</string>
|
||||
<string name="fingerprint_last_delete_message" product="device" msgid="3910012280858587242">"Vous ne pourrez pas utiliser votre empreinte digitale pour déverrouiller votre appareil ni pour vérifier qu\'il s\'agit bien de vous dans les applis."</string>
|
||||
<string name="fingerprint_unlock_title" product="default" msgid="3224008661274975980">"Vous pouvez déverrouiller votre téléphone avec votre empreinte digitale. Pour plus de sécurité, cette option exige un verrouillage d\'écran secondaire."</string>
|
||||
<string name="fingerprint_unlock_title" product="tablet" msgid="6920040586231644124">"Vous pouvez déverrouiller votre tablette avec votre empreinte digitale. Pour plus de sécurité, cette option exige un verrouillage d\'écran secondaire."</string>
|
||||
<string name="fingerprint_unlock_title" product="device" msgid="1469790269368691678">"Vous pouvez déverrouiller votre appareil avec votre empreinte digitale. Pour plus de sécurité, cette option exige un verrouillage d\'écran secondaire."</string>
|
||||
@@ -238,17 +238,17 @@
|
||||
<string name="status_number_sim_status" product="tablet" msgid="9003886361856568694">"NRM sur la carte SIM"</string>
|
||||
<string name="status_number_sim_status" product="default" msgid="7536755538266735352">"N° de téléphone sur la carte SIM"</string>
|
||||
<string name="storage_wizard_init_v2_internal_title" product="tablet" msgid="2049551739429034707">"Formater la carte SD en tant que mémoire interne"</string>
|
||||
<string name="storage_wizard_init_v2_internal_summary" product="tablet" msgid="6130017080675241337">"Stockez vos applications et vos contenus multimédias pour les utiliser uniquement sur cette tablette. <a href=https://support.google.com/android/answer/12153449>En savoir plus sur la configuration d\'une carte SD</a>."</string>
|
||||
<string name="storage_wizard_init_v2_internal_summary" product="tablet" msgid="6130017080675241337">"Stockez vos applis et vos contenus multimédias pour les utiliser uniquement sur cette tablette. <a href=https://support.google.com/android/answer/12153449>En savoir plus sur la configuration d\'une carte SD</a>."</string>
|
||||
<string name="storage_wizard_init_v2_internal_action" product="tablet" msgid="560506072518373839">"Formater"</string>
|
||||
<string name="storage_wizard_init_v2_internal_title" product="default" msgid="2049551739429034707">"Formater la carte SD en tant que mémoire interne"</string>
|
||||
<string name="storage_wizard_init_v2_internal_summary" product="default" msgid="4395040788668914783">"Stockez vos applications et vos contenus multimédias pour les utiliser uniquement sur ce téléphone. <a href=https://support.google.com/android/answer/12153449>En savoir plus sur la configuration d\'une carte SD</a>."</string>
|
||||
<string name="storage_wizard_init_v2_internal_summary" product="default" msgid="4395040788668914783">"Stockez vos applis et vos contenus multimédias pour les utiliser uniquement sur ce téléphone. <a href=https://support.google.com/android/answer/12153449>En savoir plus sur la configuration d\'une carte SD</a>."</string>
|
||||
<string name="storage_wizard_init_v2_internal_action" product="default" msgid="560506072518373839">"Formater"</string>
|
||||
<string name="storage_wizard_migrate_v2_body" product="tablet" msgid="7539293889421540797">"Vous pouvez déplacer vos fichiers et certaines applications sur le périphérique <xliff:g id="NAME">^1</xliff:g>. \n\nCe déplacement libérerait <xliff:g id="SIZE">^2</xliff:g> du stockage de votre tablette et prendrait environ <xliff:g id="DURATION">^3</xliff:g>."</string>
|
||||
<string name="storage_wizard_migrate_v2_body" product="default" msgid="3807501187945770401">"Vous pouvez déplacer vos fichiers et certaines applications sur le périphérique <xliff:g id="NAME">^1</xliff:g>. \n\nCe déplacement libérerait <xliff:g id="SIZE">^2</xliff:g> du stockage de votre téléphone et prendrait environ <xliff:g id="DURATION">^3</xliff:g>."</string>
|
||||
<string name="storage_wizard_migrate_v2_body" product="tablet" msgid="7539293889421540797">"Vous pouvez déplacer vos fichiers et certaines applis sur le périphérique <xliff:g id="NAME">^1</xliff:g>. \n\nCe déplacement libérerait <xliff:g id="SIZE">^2</xliff:g> du stockage de votre tablette et prendrait environ <xliff:g id="DURATION">^3</xliff:g>."</string>
|
||||
<string name="storage_wizard_migrate_v2_body" product="default" msgid="3807501187945770401">"Vous pouvez déplacer vos fichiers et certaines applis sur le périphérique <xliff:g id="NAME">^1</xliff:g>. \n\nCe déplacement libérerait <xliff:g id="SIZE">^2</xliff:g> du stockage de votre téléphone et prendrait environ <xliff:g id="DURATION">^3</xliff:g>."</string>
|
||||
<string name="storage_wizard_migrate_v2_checklist_battery" product="tablet" msgid="5326017162943304749">"Gardez cette tablette chargée"</string>
|
||||
<string name="storage_wizard_migrate_v2_checklist_battery" product="default" msgid="8041162611685970218">"Gardez ce téléphone chargé"</string>
|
||||
<string name="main_clear_desc" product="tablet" msgid="5778614597513856716">"Cette action effacera toutes les données de la "<b>"mémoire de stockage interne"</b>" de votre tablette, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et paramètres du système et de l\'application"</li>\n<li>"Les applications téléchargées"</li></string>
|
||||
<string name="main_clear_desc" product="default" msgid="1888412491866186706">"Cette action effacera toutes les données de la "<b>"mémoire de stockage interne"</b>" de votre téléphone, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et paramètres du système et de l\'application"</li>\n<li>"Les applications téléchargées"</li></string>
|
||||
<string name="main_clear_desc" product="tablet" msgid="5778614597513856716">"Cette action effacera toutes les données de la "<b>"mémoire de stockage interne"</b>" de votre tablette, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et paramètres du système et de l\'appli"</li>\n<li>"Les applis téléchargées"</li></string>
|
||||
<string name="main_clear_desc" product="default" msgid="1888412491866186706">"Cette action effacera toutes les données de la "<b>"mémoire de stockage interne"</b>" de votre téléphone, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et paramètres du système et de l\'appli"</li>\n<li>"Les applis téléchargées"</li></string>
|
||||
<string name="main_clear_accounts" product="default" msgid="3604029744509330786">\n\n"Vous êtes actuellement connecté aux comptes suivants :\n"</string>
|
||||
<string name="main_clear_other_users_present" product="default" msgid="7750368595882863399">\n\n"D\'autres personnes utilisent cet appareil.\n"</string>
|
||||
<string name="main_clear_desc_erase_external_storage" product="nosdcard" msgid="5834269984459195918">\n\n"Pour supprimer la musique, les photos et les autres données de l\'utilisateur, vous devez effacer la "<b>"mémoire de stockage USB"</b>"."</string>
|
||||
@@ -269,9 +269,9 @@
|
||||
<string name="about_settings" product="default" msgid="2621311564780208250">"À propos du téléphone"</string>
|
||||
<string name="about_settings" product="device" msgid="7595574154492383452">"À propos de l\'appareil"</string>
|
||||
<string name="about_settings" product="emulator" msgid="1099246296173401003">"À propos de l\'appareil émulé"</string>
|
||||
<string name="install_all_warning" product="tablet" msgid="1732116924846572063">"Votre tablette et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
|
||||
<string name="install_all_warning" product="default" msgid="4597256179485325694">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
|
||||
<string name="install_all_warning" product="device" msgid="6293002353591632851">"Votre appareil et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être responsable de tout dommage causé à votre appareil ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
|
||||
<string name="install_all_warning" product="tablet" msgid="1732116924846572063">"Votre tablette et vos données personnelles sont plus vulnérables aux attaques provenant d\'applis inconnues. En installant des applis provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applis."</string>
|
||||
<string name="install_all_warning" product="default" msgid="4597256179485325694">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques provenant d\'applis inconnues. En installant des applis provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de l\'utilisation de telles applis."</string>
|
||||
<string name="install_all_warning" product="device" msgid="6293002353591632851">"Votre appareil et vos données personnelles sont plus vulnérables aux attaques provenant d\'applis inconnues. En installant des applis provenant de cette source, vous acceptez d\'être responsable de tout dommage causé à votre appareil ou de toute perte de données pouvant découler de l\'utilisation de telles applis."</string>
|
||||
<string name="runningservicedetails_stop_dlg_text" product="tablet" msgid="6321057186549848774">"Si vous arrêtez ce service, certaines fonctionnalités de votre tablette peuvent cesser de fonctionner correctement jusqu\'à ce que vous ayez éteint, puis rallumé votre appareil."</string>
|
||||
<string name="runningservicedetails_stop_dlg_text" product="default" msgid="6869998550403667737">"Si vous arrêtez ce service, certaines fonctionnalités de votre téléphone peuvent cesser de fonctionner correctement jusqu\'à ce que vous ayez éteint, puis rallumé votre appareil."</string>
|
||||
<string name="testing_phone_info" product="tablet" msgid="8267746802132630741">"Informations sur la tablette"</string>
|
||||
@@ -289,13 +289,13 @@
|
||||
<string name="battery_tip_summary_summary" product="device" msgid="45436555475195632">"L\'appareil utilise une quantité normale d\'énergie en arrière-plan"</string>
|
||||
<string name="battery_tip_limited_temporarily_dialog_msg" product="default" msgid="4134817691837413711">"Dans certaines conditions, comme des températures élevées ou de longues périodes de charge, la charge pourrait être limitée à <xliff:g id="PERCENT">%1$s</xliff:g> pour aider à préserver la santé de la pile.\n\nLorsque ces conditions prendront fin, votre téléphone se rechargera normalement de façon automatique."</string>
|
||||
<string name="battery_tip_limited_temporarily_dialog_msg" product="tablet" msgid="9123428127699951337">"Dans certaines conditions, comme des températures élevées ou de longues périodes de charge, la charge pourrait être limitée à <xliff:g id="PERCENT">%1$s</xliff:g> pour aider à préserver la santé de la pile.\n\nLorsque ces conditions prendront fin, votre tablette se rechargera normalement de façon automatique."</string>
|
||||
<string name="battery_tip_dialog_message" product="default" msgid="7183790460600610222">"Comme vous avez utilisé votre téléphone plus que d\'habitude, votre pile risque de s\'épuiser plus tôt que prévu. \n\nLes applications qui utilisent le plus d\'énergie de la pile :"</string>
|
||||
<string name="battery_tip_dialog_message" product="tablet" msgid="2702706858728966181">"Comme vous avez utilisé votre tablette plus que d\'habitude, votre pile risque de s\'épuiser plus tôt que prévu. \n\nLes applications qui utilisent le plus d\'énergie de la pile :"</string>
|
||||
<string name="battery_tip_dialog_message" product="device" msgid="6488208467377974021">"Comme vous avez utilisé votre appareil plus que d\'habitude, votre pile risque de s\'épuiser plus tôt que prévu. \n\nLes applications qui utilisent le plus d\'énergie de la pile :"</string>
|
||||
<string name="battery_tip_dialog_summary_message" product="default" msgid="5760208650901831793">"Vos applications utilisent une quantité normale d\'énergie. Si les applications utilisent trop d\'énergie, votre téléphone vous suggérera des actions à essayer.\n\nVous pouvez toujours activer la fonction Économiseur de pile si la pile est trop faible."</string>
|
||||
<string name="battery_tip_dialog_summary_message" product="tablet" msgid="236339248261391160">"Vos applications utilisent une quantité normale d\'énergie. Si les applications utilisent trop d\'énergie, votre tablette vous suggérera des actions à essayer.\n\nVous pouvez toujours activer la fonction Économiseur de pile si la pile est trop faible."</string>
|
||||
<string name="battery_tip_dialog_summary_message" product="device" msgid="7885502661524685786">"Vos applications utilisent une quantité normale d\'énergie. Si les applications utilisent trop d\'énergie, votre appareil vous suggérera des actions à essayer.\n\nVous pouvez toujours activer la fonction Économiseur de pile si la pile est trop faible."</string>
|
||||
<string name="smart_battery_summary" product="default" msgid="1210637215867635435">"Restreindre l\'usage de la pile pour les applications que vous n\'utilisez pas souvent"</string>
|
||||
<string name="battery_tip_dialog_message" product="default" msgid="7183790460600610222">"Comme vous avez utilisé votre téléphone plus que d\'habitude, votre pile risque de s\'épuiser plus tôt que prévu. \n\nLes applis qui utilisent le plus d\'énergie de la pile :"</string>
|
||||
<string name="battery_tip_dialog_message" product="tablet" msgid="2702706858728966181">"Comme vous avez utilisé votre tablette plus que d\'habitude, votre pile risque de s\'épuiser plus tôt que prévu. \n\nLes applis qui utilisent le plus d\'énergie de la pile :"</string>
|
||||
<string name="battery_tip_dialog_message" product="device" msgid="6488208467377974021">"Comme vous avez utilisé votre appareil plus que d\'habitude, votre pile risque de s\'épuiser plus tôt que prévu. \n\nLes applis qui utilisent le plus d\'énergie de la pile :"</string>
|
||||
<string name="battery_tip_dialog_summary_message" product="default" msgid="5760208650901831793">"Vos applis utilisent une quantité normale d\'énergie. Si les applis utilisent trop d\'énergie, votre téléphone vous suggérera des actions à essayer.\n\nVous pouvez toujours activer la fonction Économiseur de pile si la pile est trop faible."</string>
|
||||
<string name="battery_tip_dialog_summary_message" product="tablet" msgid="236339248261391160">"Vos applis utilisent une quantité normale d\'énergie. Si les applis utilisent trop d\'énergie, votre tablette vous suggérera des actions à essayer.\n\nVous pouvez toujours activer la fonction Économiseur de pile si la pile est trop faible."</string>
|
||||
<string name="battery_tip_dialog_summary_message" product="device" msgid="7885502661524685786">"Vos applis utilisent une quantité normale d\'énergie. Si les applis utilisent trop d\'énergie, votre appareil vous suggérera des actions à essayer.\n\nVous pouvez toujours activer la fonction Économiseur de pile si la pile est trop faible."</string>
|
||||
<string name="smart_battery_summary" product="default" msgid="1210637215867635435">"Restreindre l\'usage de la pile pour les applis que vous n\'utilisez pas souvent"</string>
|
||||
<string name="battery_usage_screen_footer" product="default" msgid="8872101342490341865">"L\'utilisation de la pile et le temps d\'utilisation des écrans ne sont pas mesurés pendant la recharge du téléphone"</string>
|
||||
<string name="battery_usage_screen_footer" product="tablet" msgid="1876984641036532124">"L\'utilisation de la pile et le temps d\'utilisation des écrans ne sont pas mesurés pendant la recharge de la tablette"</string>
|
||||
<string name="battery_usage_screen_footer" product="device" msgid="6488857833906266507">"L\'utilisation de la pile et le temps d\'utilisation des écrans ne sont pas mesurés pendant la recharge de l\'appareil"</string>
|
||||
@@ -308,9 +308,9 @@
|
||||
<string name="data_usage_auto_sync_on_dialog" product="default" msgid="7207326473052484970">"Toutes les modifications que vous apportez à vos comptes sur le Web sont automatiquement copiées sur votre téléphone.\n\nCertains comptes peuvent également copier automatiquement sur le Web toutes les modifications que vous apportez sur le téléphone. Les comptes Google fonctionnent de cette façon."</string>
|
||||
<string name="data_usage_limit_dialog_mobile" product="tablet" msgid="5609616352941038118">"Votre tablette désactivera les données cellulaires lorsqu\'elle atteindra la limite que vous définissez.\n\nComme c\'est votre tablette qui mesure la consommation des données, et que votre fournisseur de services peut utiliser un système de mesure différent, nous vous conseillons d\'utiliser une limite plus basse."</string>
|
||||
<string name="data_usage_limit_dialog_mobile" product="default" msgid="4552449053646826676">"Votre téléphone désactivera les données cellulaires lorsqu\'il atteindra la limite que vous définissez.\n\nComme c\'est votre téléphone qui mesure la consommation des données, et que votre fournisseur de services peut utiliser un système de mesure différent, nous vous conseillons de définir une limite plus basse."</string>
|
||||
<string name="user_settings_footer_text" product="device" msgid="8543171604218174424">"Partagez votre appareil en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre appareil pour ses écrans d\'accueil personnalisés, ses comptes, ses applications, ses paramètres et plus encore."</string>
|
||||
<string name="user_settings_footer_text" product="tablet" msgid="4749331578207116797">"Partagez votre tablette en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre tablette pour ses écrans d\'accueil personnalisés, ses comptes, ses applications, ses paramètres et plus encore."</string>
|
||||
<string name="user_settings_footer_text" product="default" msgid="5440172971747221370">"Partagez votre téléphone en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre téléphone pour ses écrans d\'accueil personnalisés, ses comptes, ses applications, ses paramètres et plus encore."</string>
|
||||
<string name="user_settings_footer_text" product="device" msgid="8543171604218174424">"Partagez votre appareil en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre appareil pour ses écrans d\'accueil personnalisés, ses comptes, ses applis, ses paramètres et plus encore."</string>
|
||||
<string name="user_settings_footer_text" product="tablet" msgid="4749331578207116797">"Partagez votre tablette en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre tablette pour ses écrans d\'accueil personnalisés, ses comptes, ses applis, ses paramètres et plus encore."</string>
|
||||
<string name="user_settings_footer_text" product="default" msgid="5440172971747221370">"Partagez votre téléphone en ajoutant des utilisateurs. Chaque utilisateur dispose d\'un espace personnel sur votre téléphone pour ses écrans d\'accueil personnalisés, ses comptes, ses applis, ses paramètres et plus encore."</string>
|
||||
<string name="user_cannot_manage_message" product="tablet" msgid="5566619500245432179">"Seul le propriétaire de la tablette peut gérer les utilisateurs."</string>
|
||||
<string name="user_cannot_manage_message" product="default" msgid="8596259161937605316">"Seul le propriétaire de la tablette peut gérer les utilisateurs."</string>
|
||||
<string name="user_confirm_remove_self_message" product="tablet" msgid="6880861846664267876">"Votre espace et vos données vont disparaître de cette tablette. Cette action est irréversible."</string>
|
||||
@@ -365,9 +365,9 @@
|
||||
<string name="audio_sharing_dialog_share_more_content" product="default" msgid="4517503016262565607">"La musique et les vidéos de ce téléphone peuvent être lues sur les écouteurs que vous connectez"</string>
|
||||
<string name="audio_sharing_dialog_share_more_content" product="tablet" msgid="7742344946644657414">"La musique et les vidéos de cette tablette peuvent être lues sur les écouteurs que vous connectez"</string>
|
||||
<string name="audio_sharing_dialog_share_more_content" product="device" msgid="3409470560712324580">"La musique et les vidéos de cet appareil peuvent être lues sur les écouteurs que vous connectez"</string>
|
||||
<string name="audio_streams_dialog_no_le_device_subtitle" product="default" msgid="1388450179345665604">"Pour écouter un flux audio, connectez d\'abord des écouteurs prenant en charge l\'application LE Audio à ce téléphone."</string>
|
||||
<string name="audio_streams_dialog_no_le_device_subtitle" product="tablet" msgid="6577207951269720001">"Pour écouter un flux audio, connectez d\'abord des écouteurs prenant en charge l\'application LE Audio à cette tablette."</string>
|
||||
<string name="audio_streams_dialog_no_le_device_subtitle" product="device" msgid="6192141045820029654">"Pour écouter un flux audio, connectez d\'abord des écouteurs prenant en charge l\'application LE Audio à cet appareil."</string>
|
||||
<string name="audio_streams_dialog_no_le_device_subtitle" product="default" msgid="1388450179345665604">"Pour écouter un flux audio, connectez d\'abord des écouteurs prenant en charge l\'appli LE Audio à ce téléphone."</string>
|
||||
<string name="audio_streams_dialog_no_le_device_subtitle" product="tablet" msgid="6577207951269720001">"Pour écouter un flux audio, connectez d\'abord des écouteurs prenant en charge l\'appli LE Audio à cette tablette."</string>
|
||||
<string name="audio_streams_dialog_no_le_device_subtitle" product="device" msgid="6192141045820029654">"Pour écouter un flux audio, connectez d\'abord des écouteurs prenant en charge l\'appli LE Audio à cet appareil."</string>
|
||||
<string name="audio_streams_dialog_unsupported_device_subtitle" product="default" msgid="4634360514260385687">"Ce téléphone ne prend pas en charge l\'appli LE Audio, et celle-ci est nécessaire pour effectuer la lecture des flux audio."</string>
|
||||
<string name="audio_streams_dialog_unsupported_device_subtitle" product="tablet" msgid="234603191628345605">"Cette tablette ne prend pas en charge l\'appli LE Audio, et celle-ci est nécessaire pour effectuer la lecture des flux audio."</string>
|
||||
<string name="audio_streams_dialog_unsupported_device_subtitle" product="device" msgid="6350485541420926260">"Cet appareil ne prend pas en charge l\'appli LE Audio, et celle-ci est nécessaire pour effectuer la lecture des flux audio."</string>
|
||||
|
||||
@@ -179,15 +179,15 @@
|
||||
<string name="lock_screen_pin_skip_face_message" product="default" msgid="358903382559327157">"სახით განბლოკვის დასაყენებლად საჭიროა PIN-კოდი.\n\nPIN-კოდი დაიცავს ტელეფონს, თუ ის დაიკარგება ან მას მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_face_message" product="default" msgid="6400426500859622964">"სახით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს ტელეფონს, თუ ის დაიკარგება ან მას მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_face_message" product="default" msgid="1555954661782997039">"სახით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს ტელეფონს, თუ ის დაიკარგება ან მას მოგპარავენ."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="tablet" msgid="6016574209955764097">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა PIN-კოდი.\n\nPIN-კოდი დაიცავს ტაბლეტს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="tablet" msgid="5193008948766756870">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს ტაბლეტს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="tablet" msgid="2157871617774498976">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს ტაბლეტს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="device" msgid="3023595865822720071">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა PIN-კოდი.\n\nPIN-კოდი დაიცავს მოწყობილობას, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="device" msgid="3039110875534893916">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს მოწყობილობას, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="device" msgid="6506194961404887073">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს მოწყობილობას, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="tablet" msgid="6016574209955764097">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა PIN-კოდი.\n\nPIN-კოდი დაიცავს ტაბლეტს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="tablet" msgid="5193008948766756870">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს ტაბლეტს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="tablet" msgid="2157871617774498976">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს ტაბლეტს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="device" msgid="3023595865822720071">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა PIN-კოდი.\n\nPIN-კოდი დაიცავს მოწყობილობას, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="device" msgid="3039110875534893916">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს მოწყობილობას, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="device" msgid="6506194961404887073">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს მოწყობილობას, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="default" msgid="6614355211073480369">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა PIN-კოდი.\n\nPIN-კოდი დაიცავს ტელეფონს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="default" msgid="969489650005656159">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს ტელეფონს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="default" msgid="2934343185175325368">"სახით და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს ტელეფონს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="default" msgid="969489650005656159">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა ნიმუში.\n\nნიმუში დაიცავს ტელეფონს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="default" msgid="2934343185175325368">"სახითა და ანაბეჭდით განბლოკვის დასაყენებლად საჭიროა პაროლი.\n\nპაროლი დაიცავს ტელეფონს, თუ მას დაკარგავთ ან მოგპარავენ."</string>
|
||||
<string name="fingerprint_v2_delete_message" product="default" msgid="8723083814238510088">"ამ მოქმედებით წაიშლება თითის ანაბეჭდის სურათები და თქვენს ტელეფონზე შენახული მოდელები, რომლებიც ასოცირებულია „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“-თან"</string>
|
||||
<string name="fingerprint_v2_delete_message" product="tablet" msgid="527375244730792698">"ამ მოქმედებით წაიშლება თითის ანაბეჭდის სურათები და თქვენს ტაბლეტზე შენახული მოდელები, რომლებიც ასოცირებულია „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“-თან"</string>
|
||||
<string name="fingerprint_v2_delete_message" product="device" msgid="4549780655045100171">"ამ მოქმედებით წაიშლება თითის ანაბეჭდის სურათები და თქვენს მოწყობილობაზე შენახული მოდელები, რომლებიც ასოცირებულია „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“-თან"</string>
|
||||
|
||||
@@ -179,24 +179,15 @@
|
||||
<string name="lock_screen_pin_skip_face_message" product="default" msgid="358903382559327157">"Kërkohet një kod PIN për të konfiguruar \"Shkyçjen me fytyrë\".\n\nKodi PIN e mbron telefonin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_pattern_skip_face_message" product="default" msgid="6400426500859622964">"Kërkohet një motiv për të konfiguruar \"Shkyçjen me fytyrë\".\n\nMotivi e mbron telefonin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_password_skip_face_message" product="default" msgid="1555954661782997039">"Kërkohet një fjalëkalim për të konfiguruar \"Shkyçjen me fytyrë\".\n\nFjalëkalimi e mbron telefonin nëse të humbet apo ta vjedhin."</string>
|
||||
<!-- no translation found for lock_screen_pin_skip_biometrics_message (6016574209955764097) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_pattern_skip_biometrics_message (5193008948766756870) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_password_skip_biometrics_message (2157871617774498976) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_pin_skip_biometrics_message (3023595865822720071) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_pattern_skip_biometrics_message (3039110875534893916) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_password_skip_biometrics_message (6506194961404887073) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_pin_skip_biometrics_message (6614355211073480369) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_pattern_skip_biometrics_message (969489650005656159) -->
|
||||
<skip />
|
||||
<!-- no translation found for lock_screen_password_skip_biometrics_message (2934343185175325368) -->
|
||||
<skip />
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="tablet" msgid="6016574209955764097">"Kërkohet një kod PIN për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nKodi PIN e mbron tabletin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="tablet" msgid="5193008948766756870">"Kërkohet një motiv për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nMotivi e mbron tabletin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="tablet" msgid="2157871617774498976">"Kërkohet një fjalëkalim për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nFjalëkalimi e mbron tabletin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="device" msgid="3023595865822720071">"Kërkohet një kod PIN për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nKodi PIN e mbron pajisjen nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="device" msgid="3039110875534893916">"Kërkohet një motiv për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nMotivi e mbron pajisjen nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="device" msgid="6506194961404887073">"Kërkohet një fjalëkalim për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nFjalëkalimi e mbron pajisjen nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_pin_skip_biometrics_message" product="default" msgid="6614355211073480369">"Kërkohet një kod PIN për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nKodi PIN e mbron telefonin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_pattern_skip_biometrics_message" product="default" msgid="969489650005656159">"Kërkohet një motiv për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nMotivi e mbron telefonin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="lock_screen_password_skip_biometrics_message" product="default" msgid="2934343185175325368">"Kërkohet një fjalëkalim për të konfiguruar \"Shkyçjen me gjurmën e gishtit\" dhe \"Shkyçjen me fytyrë\".\n\nFjalëkalimi e mbron telefonin nëse të humbet apo ta vjedhin."</string>
|
||||
<string name="fingerprint_v2_delete_message" product="default" msgid="8723083814238510088">"Kjo fshin imazhet e gjurmës së gishtit dhe modelin e lidhur me \"<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>\" që ruhen në telefonin tënd"</string>
|
||||
<string name="fingerprint_v2_delete_message" product="tablet" msgid="527375244730792698">"Kjo fshin imazhet e gjurmës së gishtit dhe modelin e lidhur me \"<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>\" që ruhen në tabletin tënd"</string>
|
||||
<string name="fingerprint_v2_delete_message" product="device" msgid="4549780655045100171">"Kjo fshin imazhet e gjurmës së gishtit dhe modelin e lidhur me \"<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>\" që ruhen në pajisjen tënde"</string>
|
||||
|
||||
@@ -17,22 +17,44 @@
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:focusable="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/header_icon"
|
||||
android:layout_width="72dp"
|
||||
android:layout_height="72dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_gravity="center"
|
||||
android:antialias="true"
|
||||
android:background="@drawable/circle_outline"
|
||||
android:padding="8dp"
|
||||
android:scaleType="fitCenter" />
|
||||
|
||||
<com.google.android.material.progressindicator.CircularProgressIndicator
|
||||
android:id="@+id/battery_ring"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:indeterminate="false"
|
||||
app:trackColor="@android:color/transparent"
|
||||
app:indicatorColor="@color/bluetooth_battery_ring_indicator_color"
|
||||
app:trackThickness="4dp"
|
||||
app:indicatorSize="76dp"
|
||||
app:indicatorInset="0dp"
|
||||
app:trackCornerRadius="2dp"
|
||||
android:max="100"
|
||||
android:visibility="gone" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/header_title"
|
||||
style="@style/TextAppearance.EntityHeaderTitle"
|
||||
|
||||
32
res/layout/modes_edit_done_button.xml
Normal file
32
res/layout/modes_edit_done_button.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2024 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<Button
|
||||
android:id="@+id/done"
|
||||
android:text="@string/done"
|
||||
style="@style/ActionPrimaryButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:layout_marginEnd="20dp"
|
||||
/>
|
||||
</FrameLayout>
|
||||
35
res/layout/modes_edit_name.xml
Normal file
35
res/layout/modes_edit_name.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2024 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
|
||||
|
||||
<EditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@android:id/edit"
|
||||
android:maxLines="1"
|
||||
android:inputType="text|textCapSentences"
|
||||
android:imeOptions="actionDone"
|
||||
android:selectAllOnFocus="true"
|
||||
android:hint="@string/zen_mode_edit_name_hint" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -98,7 +98,7 @@
|
||||
<item msgid="6702740528496186521">"5"</item>
|
||||
</string-array>
|
||||
<string-array name="bluetooth_audio_routing_titles">
|
||||
<item msgid="3488687531285795335">"Utiliser la valeur par défaut de l\'application"</item>
|
||||
<item msgid="3488687531285795335">"Utiliser la valeur par défaut de l\'appli"</item>
|
||||
<item msgid="5112879855377353813">"Faire jouer sur l\'appareil auditif"</item>
|
||||
<item msgid="4853360663119482646">"Faire jouer sur le haut-parleur du téléphone"</item>
|
||||
</string-array>
|
||||
@@ -348,7 +348,7 @@
|
||||
<item msgid="3237802033158517495">"100 %"</item>
|
||||
</string-array>
|
||||
<string-array name="captioning_preset_selector_titles">
|
||||
<item msgid="3880932435325583041">"Défini par l\'application"</item>
|
||||
<item msgid="3880932435325583041">"Défini par l\'appli"</item>
|
||||
<item msgid="8719204526359229387">"Texte blanc sur fond noir"</item>
|
||||
<item msgid="5410164687403735103">"Texte noir sur fond blanc"</item>
|
||||
<item msgid="1119043472912497241">"Texte jaune sur fond noir"</item>
|
||||
@@ -484,7 +484,7 @@
|
||||
<!-- no translation found for rtt_setting_mode:3 (7725394146877517088) -->
|
||||
<string-array name="nfc_payment_favor">
|
||||
<item msgid="9104058551372383947">"Toujours"</item>
|
||||
<item msgid="5283665583617307336">"Sauf si une autre application de paiement est ouverte"</item>
|
||||
<item msgid="5283665583617307336">"Sauf si une autre appli de paiement est ouverte"</item>
|
||||
</string-array>
|
||||
<string-array name="nfc_payment_favor_values">
|
||||
<item msgid="2373999996715432397">"0"</item>
|
||||
|
||||
@@ -364,8 +364,8 @@
|
||||
<item msgid="6922258575853746220">"Pokret"</item>
|
||||
</string-array>
|
||||
<string-array name="accessibility_button_size_selector_titles">
|
||||
<item msgid="7482952318152486459">"Malen"</item>
|
||||
<item msgid="1666628329913333563">"Velik"</item>
|
||||
<item msgid="7482952318152486459">"Maleno"</item>
|
||||
<item msgid="1666628329913333563">"Veliko"</item>
|
||||
</string-array>
|
||||
<string-array name="vpn_proxy_settings">
|
||||
<item msgid="7165538292837266997">"Nijedan"</item>
|
||||
|
||||
@@ -360,7 +360,7 @@
|
||||
<item msgid="3605616699204153590">"ନାଭିଗେସନ୍ ବାର୍"</item>
|
||||
</string-array>
|
||||
<string-array name="accessibility_button_gesture_selector_titles">
|
||||
<item msgid="2370918472773154939">"ବଟନ୍"</item>
|
||||
<item msgid="2370918472773154939">"ବଟନ"</item>
|
||||
<item msgid="6922258575853746220">"ଜେଶ୍ଚର୍"</item>
|
||||
</string-array>
|
||||
<string-array name="accessibility_button_size_selector_titles">
|
||||
|
||||
@@ -218,4 +218,7 @@
|
||||
|
||||
<!-- Switch bar disabled state color-->
|
||||
<color name="switch_bar_state_disabled_color">#1F1F1F1F</color>
|
||||
|
||||
<!-- Battery ring indicator color in bluetooth device details -->
|
||||
<color name="bluetooth_battery_ring_indicator_color">#9ED582</color>
|
||||
</resources>
|
||||
|
||||
@@ -8114,6 +8114,14 @@
|
||||
<!-- Do not disturb: mode page section title [CHAR LIMIT=80] -->
|
||||
<string name="mode_device_effects_title">Additional actions</string>
|
||||
|
||||
<!-- Summary for the Sound Do not Disturb option when DND isn't currently on. [CHAR LIMIT=NONE]-->
|
||||
<string name="modes_sound_summary_off">
|
||||
{count, plural,
|
||||
=0 {Off}
|
||||
=1 {Off / 1 mode can turn on automatically}
|
||||
other {Off / # modes can turn on automatically}
|
||||
}
|
||||
</string>
|
||||
|
||||
<!-- Do not disturb: display settings title [CHAR LIMIT=80] -->
|
||||
<string name="mode_display_settings_title">Display settings</string>
|
||||
@@ -9452,6 +9460,18 @@
|
||||
<!-- [CHAR LIMIT=40] Zen mode settings: Title for the "choose mode icon" screen -->
|
||||
<string name="zen_mode_icon_picker_title">Change icon</string>
|
||||
|
||||
<!-- Priority Modes: Title for the "rename mode" screen [CHAR LIMIT=20] -->
|
||||
<string name="zen_mode_rename_title">Rename</string>
|
||||
|
||||
<!-- Priority Modes: Title for the "add mode" screen [CHAR LIMIT=20] -->
|
||||
<string name="zen_mode_new_custom_title">Add mode</string>
|
||||
|
||||
<!-- Priority Modes: Default name for new custom modes [CHAR LIMIT=30] -->
|
||||
<string name="zen_mode_new_custom_default_name">Custom mode</string>
|
||||
|
||||
<!-- Priority Modes: Hint for the EditText for editing a mode's name [CHAR LIMIT=30] -->
|
||||
<string name="zen_mode_edit_name_hint">Mode name</string>
|
||||
|
||||
<!-- Content description for help icon button [CHAR LIMIT=20] -->
|
||||
<string name="warning_button_text">Warning</string>
|
||||
|
||||
|
||||
@@ -135,6 +135,15 @@
|
||||
settings:controller="com.android.settings.notification.zen.ZenModePreferenceController"
|
||||
/>
|
||||
|
||||
<com.android.settingslib.RestrictedPreference
|
||||
android:key="modes_notifications"
|
||||
android:order="18"
|
||||
android:title="@string/zen_modes_list_title"
|
||||
settings:useAdminDisabledSummary="true"
|
||||
android:fragment="com.android.settings.notification.modes.ZenModesListFragment"
|
||||
settings:controller="com.android.settings.notification.modes.ZenModesLinkPreferenceController"
|
||||
/>
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:key="lock_screen_show_only_unseen_notifs"
|
||||
android:order="19"
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/languages_settings">
|
||||
android:title="@string/languages_settings"
|
||||
android:key="languages_settings">
|
||||
<PreferenceCategory
|
||||
android:key="languages_category"
|
||||
android:title="@string/locale_picker_category_title">
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/language_picker_title">
|
||||
android:title="@string/language_picker_title"
|
||||
android:key="system_languages">
|
||||
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:title="@string/desc_introduction_of_language_picker"
|
||||
|
||||
@@ -18,20 +18,30 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:key="zen_mode_icon_picker_page"
|
||||
android:key="zen_mode_edit_name_icon"
|
||||
settings:searchable="false"
|
||||
android:title="@string/zen_mode_icon_picker_title">
|
||||
android:title="@string/zen_mode_rename_title">
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="current_icon"
|
||||
android:key="chosen_icon"
|
||||
android:layout="@layout/settings_entity_header" />
|
||||
|
||||
<com.android.settings.applications.SpacePreference
|
||||
android:layout_height="16dp" />
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="name"
|
||||
android:layout="@layout/modes_edit_name" />
|
||||
|
||||
<com.android.settings.applications.SpacePreference
|
||||
android:layout_height="32dp" />
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="icon_list"
|
||||
android:selectable="false"
|
||||
android:layout="@layout/modes_icon_list"/>
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="done"
|
||||
android:layout="@layout/modes_edit_done_button" />
|
||||
</PreferenceScreen>
|
||||
@@ -16,7 +16,8 @@
|
||||
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/regional_preferences_title">
|
||||
android:title="@string/regional_preferences_title"
|
||||
android:key="regional_preferences">
|
||||
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:title="@string/regional_preferences_main_page_sub_title"
|
||||
|
||||
@@ -13,4 +13,6 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" />
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:key="regional_preference_numbering_system"/>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/first_day_of_week_preferences_title">
|
||||
android:title="@string/first_day_of_week_preferences_title"
|
||||
android:key="regional_preference_first_day_of_week">
|
||||
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:title="@string/regional_preferences_option_page_sub_title"
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/temperature_preferences_title">
|
||||
android:title="@string/temperature_preferences_title"
|
||||
android:key="regional_preference_temperature">
|
||||
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:title="@string/regional_preferences_option_page_sub_title"
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/terms_of_address_title">
|
||||
android:title="@string/terms_of_address_title"
|
||||
android:key="terms_of_address">
|
||||
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:title="@string/terms_of_address_intro_title"
|
||||
|
||||
@@ -1423,13 +1423,15 @@ public final class Utils extends com.android.settingslib.Utils {
|
||||
public static void setupEdgeToEdge(@NonNull FragmentActivity activity) {
|
||||
ViewCompat.setOnApplyWindowInsetsListener(activity.findViewById(android.R.id.content),
|
||||
(v, windowInsets) -> {
|
||||
Insets insets = windowInsets.getInsets(
|
||||
final Insets insets = windowInsets.getInsets(
|
||||
WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime()
|
||||
| WindowInsetsCompat.Type.displayCutout());
|
||||
int statusBarHeight = activity.getWindow().getDecorView().getRootWindowInsets()
|
||||
.getInsets(WindowInsetsCompat.Type.statusBars()).top;
|
||||
int newInsetsTop = activity.getWindow().getDecorView().getRootWindowInsets()
|
||||
.getInsets(WindowInsetsCompat.Type.statusBars()
|
||||
| WindowInsetsCompat.Type.captionBar()).top;
|
||||
|
||||
// Apply the insets paddings to the view.
|
||||
v.setPadding(insets.left, statusBarHeight, insets.right, insets.bottom);
|
||||
v.setPadding(insets.left, newInsetsTop, insets.right, insets.bottom);
|
||||
|
||||
// Return CONSUMED if you don't want the window insets to keep being
|
||||
// passed down to descendant views.
|
||||
|
||||
@@ -39,6 +39,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -46,6 +47,7 @@ import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.flags.Flags;
|
||||
import com.android.settings.fuelgauge.BatteryMeterView;
|
||||
import com.android.settingslib.bluetooth.BluetoothUtils;
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
@@ -456,18 +458,24 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
|
||||
com.android.settings.Utils.formatPercentage(batteryLevel));
|
||||
batterySummaryView.setVisibility(View.VISIBLE);
|
||||
showBatteryIcon(linearLayout, batteryLevel, lowBatteryLevel, charging);
|
||||
showBatteryRing(linearLayout, batteryLevel);
|
||||
} else {
|
||||
if (deviceId == MAIN_DEVICE_ID) {
|
||||
linearLayout.setVisibility(View.VISIBLE);
|
||||
linearLayout.findViewById(R.id.bt_battery_icon).setVisibility(View.GONE);
|
||||
|
||||
int level = preloadedNativeBatteryLevel.get();
|
||||
if (level != BluetoothDevice.BATTERY_LEVEL_UNKNOWN
|
||||
&& level != BluetoothDevice.BATTERY_LEVEL_BLUETOOTH_OFF) {
|
||||
batterySummaryView.setText(
|
||||
com.android.settings.Utils.formatPercentage(level));
|
||||
batterySummaryView.setVisibility(View.VISIBLE);
|
||||
showBatteryRing(linearLayout, level);
|
||||
} else {
|
||||
batterySummaryView.setVisibility(View.GONE);
|
||||
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
||||
linearLayout.findViewById(R.id.battery_ring).setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Hide it if it doesn't have battery information
|
||||
@@ -481,6 +489,7 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
|
||||
com.android.settings.Utils.formatPercentage(batteryLevel));
|
||||
batterySummaryView.setVisibility(View.VISIBLE);
|
||||
showBatteryIcon(linearLayout, batteryLevel, lowBatteryLevel, charging);
|
||||
showBatteryRing(linearLayout, batteryLevel);
|
||||
} else {
|
||||
batterySummaryView.setVisibility(View.GONE);
|
||||
}
|
||||
@@ -610,6 +619,14 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
|
||||
imageView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private void showBatteryRing(LinearLayout linearLayout, int level) {
|
||||
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
||||
ProgressBar batteryProgress = linearLayout.findViewById(R.id.battery_ring);
|
||||
batteryProgress.setProgress(level);
|
||||
batteryProgress.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateDisconnectLayout() {
|
||||
mLayoutPreference.findViewById(R.id.layout_left).setVisibility(View.GONE);
|
||||
mLayoutPreference.findViewById(R.id.layout_right).setVisibility(View.GONE);
|
||||
@@ -620,6 +637,9 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
|
||||
linearLayout.findViewById(R.id.header_title).setVisibility(View.GONE);
|
||||
linearLayout.findViewById(R.id.bt_battery_summary).setVisibility(View.GONE);
|
||||
linearLayout.findViewById(R.id.bt_battery_icon).setVisibility(View.GONE);
|
||||
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
||||
linearLayout.findViewById(R.id.battery_ring).setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
// Only show bluetooth icon
|
||||
final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice();
|
||||
|
||||
@@ -18,20 +18,24 @@ package com.android.settings.development;
|
||||
|
||||
import static android.provider.Settings.Global.DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.convertToToggleOverrideWithFallback;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride.OVERRIDE_ON;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET;
|
||||
|
||||
import android.content.Context;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.TwoStatePreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
|
||||
import com.android.window.flags.Flags;
|
||||
import com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride;
|
||||
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
|
||||
|
||||
/**
|
||||
* Preference controller to control Desktop mode features
|
||||
@@ -43,15 +47,6 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
|
||||
private static final String OVERRIDE_DESKTOP_MODE_FEATURES_KEY =
|
||||
"override_desktop_mode_features";
|
||||
|
||||
private static final String TAG = "DesktopModePreferenceController";
|
||||
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_OFF = 0;
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_ON = 1;
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_UNSET = -1;
|
||||
|
||||
@Nullable
|
||||
private final DevelopmentSettingsDashboardFragment mFragment;
|
||||
|
||||
@@ -63,7 +58,7 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return isDeviceEligibleForDesktopMode() && Flags.showDesktopWindowingDevOption();
|
||||
return DesktopModeStatus.canShowDesktopModeDevOption(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -72,11 +67,11 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
|
||||
final boolean isEnabled = (Boolean) newValue;
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES,
|
||||
isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
|
||||
isEnabled ? OVERRIDE_ON.getSetting() : OVERRIDE_OFF.getSetting());
|
||||
if (mFragment != null) {
|
||||
RebootConfirmationDialogFragment.show(
|
||||
mFragment, R.string.reboot_dialog_override_desktop_mode, this);
|
||||
@@ -87,18 +82,14 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
// Use overridden state, if not present, then use default state
|
||||
final boolean shouldDevOptionBeEnabledByDefault = Flags.enableDesktopWindowingMode();
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES,
|
||||
shouldDevOptionBeEnabledByDefault ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
|
||||
final boolean shouldDevOptionBeEnabled = switch (mode) {
|
||||
case SETTING_VALUE_OFF -> false;
|
||||
case SETTING_VALUE_ON -> true;
|
||||
case SETTING_VALUE_UNSET -> shouldDevOptionBeEnabledByDefault;
|
||||
default -> {
|
||||
Log.w(TAG, "Invalid override for desktop mode: " + mode);
|
||||
yield shouldDevOptionBeEnabledByDefault;
|
||||
}
|
||||
final int overrideInt = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_UNSET.getSetting());
|
||||
final ToggleOverride toggleOverride = convertToToggleOverrideWithFallback(overrideInt,
|
||||
OVERRIDE_UNSET);
|
||||
final boolean shouldDevOptionBeEnabled = switch (toggleOverride) {
|
||||
case OVERRIDE_OFF -> false;
|
||||
case OVERRIDE_ON -> true;
|
||||
case OVERRIDE_UNSET -> DesktopModeStatus.shouldDevOptionBeEnabledByDefault();
|
||||
};
|
||||
((TwoStatePreference) mPreference).setChecked(shouldDevOptionBeEnabled);
|
||||
}
|
||||
@@ -107,14 +98,6 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
|
||||
protected void onDeveloperOptionsSwitchDisabled() {
|
||||
super.onDeveloperOptionsSwitchDisabled();
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, SETTING_VALUE_UNSET);
|
||||
}
|
||||
|
||||
private boolean isDeviceEligibleForDesktopMode() {
|
||||
boolean enforceDeviceRestrictions = SystemProperties.getBoolean(
|
||||
"persist.wm.debug.desktop_mode_enforce_device_restrictions", true);
|
||||
boolean isDesktopModeSupported = mContext.getResources().getBoolean(
|
||||
com.android.internal.R.bool.config_isDesktopModeSupported);
|
||||
return !enforceDeviceRestrictions || isDesktopModeSupported;
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_UNSET.getSetting());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,17 +28,17 @@ public class Enable16KBootReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(@NonNull Context context, @NonNull Intent intent) {
|
||||
String action = intent.getAction();
|
||||
if (!Intent.ACTION_BOOT_COMPLETED.equals(action)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Intent.ACTION_BOOT_COMPLETED.equals(action)
|
||||
|| PageAgnosticNotificationService.INTENT_ACTION_DISMISSED.equals(action)) {
|
||||
// Do nothing if device is not in page-agnostic mode
|
||||
if (!Enable16kUtils.isPageAgnosticModeOn(context)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// start a service to post persistent notification
|
||||
Intent startNotificationIntent = new Intent(context, PageAgnosticNotificationService.class);
|
||||
context.startServiceAsUser(startNotificationIntent, UserHandle.SYSTEM);
|
||||
Intent startServiceIntent = new Intent(context, PageAgnosticNotificationService.class);
|
||||
startServiceIntent.setAction(action);
|
||||
context.startServiceAsUser(startServiceIntent, UserHandle.SYSTEM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,8 @@ public class PageAgnosticNotificationService extends Service {
|
||||
|
||||
private static final String NOTIFICATION_CHANNEL_ID =
|
||||
"com.android.settings.development.PageAgnosticNotificationService";
|
||||
public static final String INTENT_ACTION_DISMISSED =
|
||||
"com.android.settings.development.NOTIFICATION_DISMISSED";
|
||||
private static final int NOTIFICATION_ID = 1;
|
||||
|
||||
static final int DISABLE_UPDATES_SETTING = 1;
|
||||
@@ -63,6 +65,9 @@ public class PageAgnosticNotificationService extends Service {
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
createNotificationChannel();
|
||||
|
||||
// No updates should be allowed in page-agnostic mode
|
||||
disableAutomaticUpdates();
|
||||
}
|
||||
|
||||
private Notification buildNotification() {
|
||||
@@ -89,6 +94,15 @@ public class PageAgnosticNotificationService extends Service {
|
||||
notifyIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
Intent dismissIntent = new Intent(this, Enable16KBootReceiver.class);
|
||||
dismissIntent.setAction(INTENT_ACTION_DISMISSED);
|
||||
PendingIntent dismissPendingIntent =
|
||||
PendingIntent.getBroadcast(
|
||||
this.getApplicationContext(),
|
||||
0,
|
||||
dismissIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
Notification.Action action =
|
||||
new Notification.Action.Builder(
|
||||
R.drawable.empty_icon,
|
||||
@@ -104,6 +118,7 @@ public class PageAgnosticNotificationService extends Service {
|
||||
.setOngoing(true)
|
||||
.setSmallIcon(R.drawable.ic_settings_24dp)
|
||||
.setContentIntent(notifyPendingIntent)
|
||||
.setDeleteIntent(dismissPendingIntent)
|
||||
.addAction(action);
|
||||
|
||||
return builder.build();
|
||||
@@ -131,9 +146,6 @@ public class PageAgnosticNotificationService extends Service {
|
||||
if (mNotificationManager != null) {
|
||||
mNotificationManager.notify(NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
// No updates should be allowed in page-agnostic mode
|
||||
disableAutomaticUpdates();
|
||||
return Service.START_REDELIVER_INTENT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,6 +268,11 @@ public class AdvancedPowerUsageDetail extends DashboardFragment
|
||||
mLogStringBuilder = new StringBuilder("onResume mode = ").append(mOptimizationMode);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldSkipForInitialSUW() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
|
||||
@@ -51,7 +51,7 @@ class ZenModeActionsPreferenceController extends AbstractZenModePreferenceContro
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(EXTRA_AUTOMATIC_ZEN_RULE_ID, zenMode.getId());
|
||||
new SubSettingLauncher(mContext)
|
||||
.setDestination(ZenModeIconPickerFragment.class.getName())
|
||||
.setDestination(ZenModeEditNameIconFragment.class.getName())
|
||||
// TODO: b/332937635 - Update metrics category
|
||||
.setSourceMetricsCategory(0)
|
||||
.setArguments(bundle)
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import android.content.Context;
|
||||
import android.widget.Button;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
class ZenModeEditDonePreferenceController extends AbstractZenModePreferenceController {
|
||||
|
||||
private final Runnable mConfirmSave;
|
||||
@Nullable private Button mButton;
|
||||
|
||||
ZenModeEditDonePreferenceController(@NonNull Context context, @NonNull String key,
|
||||
Runnable confirmSave) {
|
||||
super(context, key);
|
||||
mConfirmSave = confirmSave;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
LayoutPreference pref = screen.findPreference(getPreferenceKey());
|
||||
if (pref != null) {
|
||||
mButton = pref.findViewById(R.id.done);
|
||||
if (mButton != null) {
|
||||
mButton.setOnClickListener(v -> mConfirmSave.run());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
void updateState(Preference preference, @NonNull ZenMode zenMode) {
|
||||
if (mButton != null) {
|
||||
mButton.setEnabled(!zenMode.getName().isBlank());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
|
||||
public class ZenModeEditNameIconFragment extends ZenModeEditNameIconFragmentBase {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected ZenMode onCreateInstantiateZenMode() {
|
||||
String modeId = getModeIdFromArguments();
|
||||
return modeId != null ? requireBackend().getMode(modeId) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
requireActivity().setTitle(R.string.zen_mode_icon_picker_title);
|
||||
}
|
||||
|
||||
@Override
|
||||
void saveMode(ZenMode mode) {
|
||||
String modeId = getModeIdFromArguments();
|
||||
ZenMode modeToUpdate = modeId != null ? requireBackend().getMode(modeId) : null;
|
||||
if (modeToUpdate == null) {
|
||||
// Huh, maybe it was deleted while we were choosing the icon? Unusual...
|
||||
Log.w(getLogTag(), "Couldn't fetch mode with id " + modeId
|
||||
+ " from the backend for saving. Discarding changes!");
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
modeToUpdate.getRule().setName(mode.getRule().getName());
|
||||
modeToUpdate.getRule().setIconResId(mode.getRule().getIconResId());
|
||||
requireBackend().updateMode(modeToUpdate);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String getModeIdFromArguments() {
|
||||
Bundle bundle = getArguments();
|
||||
if (bundle != null && bundle.containsKey(EXTRA_AUTOMATIC_ZEN_RULE_ID)) {
|
||||
return bundle.getString(EXTRA_AUTOMATIC_ZEN_RULE_ID);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
// TODO: b/332937635 - make this the correct metrics category
|
||||
return SettingsEnums.NOTIFICATION_ZEN_MODE_AUTOMATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return "ZenModeEditNameIconFragment";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.notification.modes.ZenModesBackend;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Base class for the "add a mode" and "edit mode name and icon" fragments. In both cases we are
|
||||
* editing a {@link ZenMode}, but the mode shouldn't be saved immediately after each atomic change
|
||||
* -- instead, it will be saved to the backend upon user confirmation.
|
||||
*
|
||||
* <p>As a result, instead of using {@link ZenModesBackend} to apply each change, we instead modify
|
||||
* an in-memory {@link ZenMode}, that is preserved/restored in extras. This also means we don't
|
||||
* listen to changes -- whatever the user sees should be applied.
|
||||
*/
|
||||
public abstract class ZenModeEditNameIconFragmentBase extends DashboardFragment {
|
||||
|
||||
private static final String MODE_KEY = "ZenMode";
|
||||
|
||||
@Nullable private ZenMode mZenMode;
|
||||
|
||||
private ZenModesBackend mBackend;
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
||||
void setBackend(ZenModesBackend backend) {
|
||||
mBackend = backend;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
if (mBackend == null) {
|
||||
mBackend = ZenModesBackend.getInstance(context);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
mZenMode = icicle != null
|
||||
? icicle.getParcelable(MODE_KEY, ZenMode.class)
|
||||
: onCreateInstantiateZenMode();
|
||||
|
||||
if (mZenMode == null) {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the mode that will be edited. Called in {@link #onCreate}, the first time (the
|
||||
* value returned here is persisted on Fragment recreation).
|
||||
*
|
||||
* <p>If {@code null} is returned, the fragment will {@link #finish()}.
|
||||
*/
|
||||
@Nullable
|
||||
protected abstract ZenMode onCreateInstantiateZenMode();
|
||||
|
||||
@Override
|
||||
protected final int getPreferenceScreenResId() {
|
||||
return R.xml.modes_edit_name_icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final List<AbstractPreferenceController> createPreferenceControllers(
|
||||
Context context) {
|
||||
return ImmutableList.of(
|
||||
new ZenModeIconPickerIconPreferenceController(context, "chosen_icon", this),
|
||||
new ZenModeEditNamePreferenceController(context, "name", this::setModeName),
|
||||
new ZenModeIconPickerListPreferenceController(context, "icon_list",
|
||||
this::setModeIcon),
|
||||
new ZenModeEditDonePreferenceController(context, "done", this::saveMode)
|
||||
);
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
||||
@Nullable
|
||||
ZenMode getZenMode() {
|
||||
return mZenMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
updateControllers();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
final void setModeName(String name) {
|
||||
checkNotNull(mZenMode).getRule().setName(Strings.nullToEmpty(name));
|
||||
updateControllers(); // Updates confirmation button.
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
final void setModeIcon(@DrawableRes int iconResId) {
|
||||
checkNotNull(mZenMode).getRule().setIconResId(iconResId);
|
||||
updateControllers(); // Updates icon at the top.
|
||||
}
|
||||
|
||||
protected void updateControllers() {
|
||||
PreferenceScreen screen = getPreferenceScreen();
|
||||
Collection<List<AbstractPreferenceController>> controllers = getPreferenceControllers();
|
||||
if (mZenMode == null || screen == null || controllers == null) {
|
||||
return;
|
||||
}
|
||||
for (List<AbstractPreferenceController> list : controllers) {
|
||||
for (AbstractPreferenceController controller : list) {
|
||||
try {
|
||||
final String key = controller.getPreferenceKey();
|
||||
final Preference preference = screen.findPreference(key);
|
||||
if (preference != null) {
|
||||
AbstractZenModePreferenceController zenController =
|
||||
(AbstractZenModePreferenceController) controller;
|
||||
zenController.updateZenMode(preference, mZenMode);
|
||||
} else {
|
||||
Log.d(getLogTag(),
|
||||
String.format("Cannot find preference with key %s in Controller %s",
|
||||
key, controller.getClass().getSimpleName()));
|
||||
}
|
||||
controller.displayPreference(screen);
|
||||
} catch (ClassCastException e) {
|
||||
// Skip any controllers that aren't AbstractZenModePreferenceController.
|
||||
Log.d(getLogTag(), "Could not cast: " + controller.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
final void saveMode() {
|
||||
saveMode(checkNotNull(mZenMode));
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to actually save the mode, after the user confirms. This method is also responsible
|
||||
* for calling {@link #finish()}, if appropriate.
|
||||
*
|
||||
* <p>Note that {@code mode} is the <em>in-memory</em> mode and, as such, may have obsolete
|
||||
* data. If the concrete fragment is editing an existing mode, it should first fetch it from
|
||||
* the backend, and copy the new name and icon before saving. */
|
||||
abstract void saveMode(ZenMode mode);
|
||||
|
||||
@NonNull
|
||||
protected ZenModesBackend requireBackend() {
|
||||
checkState(mBackend != null);
|
||||
return mBackend;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putParcelable(MODE_KEY, mZenMode);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
class ZenModeEditNamePreferenceController extends AbstractZenModePreferenceController {
|
||||
|
||||
private final Consumer<String> mModeNameSetter;
|
||||
@Nullable private EditText mEditText;
|
||||
private boolean mIsSettingText;
|
||||
|
||||
ZenModeEditNamePreferenceController(@NonNull Context context, @NonNull String key,
|
||||
@NonNull Consumer<String> modeNameSetter) {
|
||||
super(context, key);
|
||||
mModeNameSetter = modeNameSetter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
if (mEditText == null) {
|
||||
LayoutPreference pref = checkNotNull(screen.findPreference(getPreferenceKey()));
|
||||
mEditText = pref.findViewById(android.R.id.edit);
|
||||
|
||||
mEditText.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) { }
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
if (!mIsSettingText) {
|
||||
mModeNameSetter.accept(s.toString());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
void updateState(Preference preference, @NonNull ZenMode zenMode) {
|
||||
if (mEditText != null) {
|
||||
mIsSettingText = true;
|
||||
try {
|
||||
String currentText = mEditText.getText().toString();
|
||||
String modeName = zenMode.getName();
|
||||
if (!modeName.equals(currentText)) {
|
||||
mEditText.setText(modeName);
|
||||
}
|
||||
} finally {
|
||||
mIsSettingText = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ZenModeIconPickerFragment extends ZenModeFragmentBase {
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.modes_icon_picker;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
// TODO: b/332937635 - make this the correct metrics category
|
||||
return SettingsEnums.NOTIFICATION_ZEN_MODE_AUTOMATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||
return ImmutableList.of(
|
||||
new ZenModeIconPickerIconPreferenceController(context, "current_icon", this),
|
||||
new ZenModeIconPickerListPreferenceController(context, "icon_list",
|
||||
mIconPickerListener));
|
||||
}
|
||||
|
||||
private final ZenModeIconPickerListPreferenceController.IconPickerListener mIconPickerListener =
|
||||
new ZenModeIconPickerListPreferenceController.IconPickerListener() {
|
||||
@Override
|
||||
public void onIconSelected(int iconResId) {
|
||||
saveMode(mode -> mode.getRule().setIconResId(iconResId));
|
||||
finish();
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
|
||||
public class ZenModeNewCustomFragment extends ZenModeEditNameIconFragmentBase {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected ZenMode onCreateInstantiateZenMode() {
|
||||
return ZenMode.newCustomManual(
|
||||
requireContext().getString(R.string.zen_mode_new_custom_default_name),
|
||||
/* iconResId= */ 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
requireActivity().setTitle(R.string.zen_mode_new_custom_title);
|
||||
}
|
||||
|
||||
@Override
|
||||
void saveMode(ZenMode mode) {
|
||||
String modeName = Strings.isNullOrEmpty(mode.getName())
|
||||
? requireContext().getString(R.string.zen_mode_new_custom_default_name)
|
||||
: mode.getName();
|
||||
|
||||
ZenMode created = requireBackend().addCustomManualMode(modeName,
|
||||
mode.getRule().getIconResId());
|
||||
if (created != null) {
|
||||
// Open the mode view fragment and close the "add mode" fragment, so exiting the mode
|
||||
// view goes back to previous screen (which should be the modes list).
|
||||
ZenSubSettingLauncher.forMode(requireContext(), created.getId()).launch();
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
// TODO: b/332937635 - make this the correct metrics category
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return "ZenModeNewCustomFragment";
|
||||
}
|
||||
}
|
||||
@@ -41,8 +41,11 @@ import static android.service.notification.ZenPolicy.VISUAL_EFFECT_STATUS_BAR;
|
||||
|
||||
import android.content.Context;
|
||||
import android.icu.text.MessageFormat;
|
||||
import android.provider.Settings;
|
||||
import android.service.notification.ZenDeviceEffects;
|
||||
import android.service.notification.ZenModeConfig;
|
||||
import android.service.notification.ZenPolicy;
|
||||
import android.util.ArrayMap;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -448,4 +451,33 @@ class ZenModeSummaryHelper {
|
||||
}
|
||||
return msgFormat.format(args);
|
||||
}
|
||||
|
||||
String getSoundSummary(int zenMode, ZenModeConfig config) {
|
||||
if (zenMode != Settings.Global.ZEN_MODE_OFF) {
|
||||
String description = ZenModeConfig.getDescription(mContext, true, config, false);
|
||||
|
||||
if (description == null) {
|
||||
return mContext.getString(R.string.zen_mode_sound_summary_on);
|
||||
} else {
|
||||
return mContext.getString(R.string.zen_mode_sound_summary_on_with_info,
|
||||
description);
|
||||
}
|
||||
} else {
|
||||
int count = 0;
|
||||
final ArrayMap<String, ZenModeConfig.ZenRule> ruleMap = config.automaticRules;
|
||||
if (ruleMap != null) {
|
||||
for (ZenModeConfig.ZenRule rule : ruleMap.values()) {
|
||||
if (rule != null && rule.enabled) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
MessageFormat msgFormat = new MessageFormat(
|
||||
mContext.getString(R.string.modes_sound_summary_off),
|
||||
Locale.getDefault());
|
||||
Map<String, Object> msgArgs = new HashMap<>();
|
||||
msgArgs.put("count", count);
|
||||
return msgFormat.format(msgArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import android.app.Flags;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
||||
|
||||
public class ZenModesLinkPreferenceController extends BasePreferenceController
|
||||
implements LifecycleObserver, OnResume, OnPause {
|
||||
|
||||
private SettingObserver mSettingObserver;
|
||||
private ZenModeSummaryHelper mSummaryBuilder;
|
||||
private NotificationManager mNm;
|
||||
|
||||
public ZenModesLinkPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
mSummaryBuilder = new ZenModeSummaryHelper(context, ZenHelperBackend.getInstance(context));
|
||||
mNm = mContext.getSystemService(NotificationManager.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@AvailabilityStatus
|
||||
public int getAvailabilityStatus() {
|
||||
return Flags.modesUi() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
Preference preference = screen.findPreference(getPreferenceKey());
|
||||
mSettingObserver = new SettingObserver(preference);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
if (mSettingObserver != null) {
|
||||
mSettingObserver.register(mContext.getContentResolver());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
if (mSettingObserver != null) {
|
||||
mSettingObserver.unregister(mContext.getContentResolver());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
preference.setSummary(mSummaryBuilder.getSoundSummary(
|
||||
Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.ZEN_MODE,
|
||||
Settings.Global.ZEN_MODE_OFF),
|
||||
mNm.getZenModeConfig()));
|
||||
}
|
||||
|
||||
class SettingObserver extends ContentObserver {
|
||||
private final Uri ZEN_MODE_URI = Settings.Global.getUriFor(Settings.Global.ZEN_MODE);
|
||||
private final Uri ZEN_MODE_CONFIG_ETAG_URI = Settings.Global.getUriFor(
|
||||
Settings.Global.ZEN_MODE_CONFIG_ETAG);
|
||||
|
||||
private final Preference mPreference;
|
||||
|
||||
public SettingObserver(Preference preference) {
|
||||
super(new Handler());
|
||||
mPreference = preference;
|
||||
}
|
||||
|
||||
public void register(ContentResolver cr) {
|
||||
cr.registerContentObserver(ZEN_MODE_URI, false, this, UserHandle.USER_ALL);
|
||||
cr.registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this, UserHandle.USER_ALL);
|
||||
}
|
||||
|
||||
public void unregister(ContentResolver cr) {
|
||||
cr.unregisterContentObserver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
super.onChange(selfChange, uri);
|
||||
if (ZEN_MODE_URI.equals(uri)) {
|
||||
updateState(mPreference);
|
||||
}
|
||||
|
||||
if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) {
|
||||
updateState(mPreference);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
import com.android.settings.notification.modes.ZenModesListAddModePreferenceController.ModeType;
|
||||
import com.android.settings.notification.modes.ZenModesListAddModePreferenceController.OnAddModeListener;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
@@ -37,7 +38,6 @@ import com.google.common.collect.ImmutableList;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
|
||||
@SearchIndexable
|
||||
public class ZenModesListFragment extends ZenModesFragmentBase {
|
||||
@@ -100,13 +100,12 @@ public class ZenModesListFragment extends ZenModesFragmentBase {
|
||||
mBackend.getModes().stream().map(ZenMode::getId).toList());
|
||||
startActivityForResult(type.creationActivityIntent(), REQUEST_NEW_MODE);
|
||||
} else {
|
||||
// Custom-manual mode.
|
||||
// TODO: b/326442408 - Transition to the choose-name-and-icon fragment.
|
||||
ZenMode mode = mBackend.addCustomManualMode(
|
||||
"Mode #" + new Random().nextInt(100), 0);
|
||||
if (mode != null) {
|
||||
ZenSubSettingLauncher.forMode(mContext, mode.getId()).launch();
|
||||
}
|
||||
// Custom-manual mode -> "add a mode" screen.
|
||||
// TODO: b/332937635 - set metrics categories correctly
|
||||
new SubSettingLauncher(requireContext())
|
||||
.setDestination(ZenModeNewCustomFragment.class.getName())
|
||||
.setSourceMetricsCategory(0)
|
||||
.launch();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,9 +28,7 @@ import android.provider.Settings;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.notification.modes.ZenModesListFragment;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
||||
@@ -51,7 +49,6 @@ public class ZenModePreferenceController extends BasePreferenceController
|
||||
super.displayPreference(screen);
|
||||
Preference preference = screen.findPreference(getPreferenceKey());
|
||||
mSettingObserver = new SettingObserver(preference);
|
||||
maybeSetTitleAndDestination(preference);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -70,28 +67,17 @@ public class ZenModePreferenceController extends BasePreferenceController
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return AVAILABLE_UNSEARCHABLE;
|
||||
return Flags.modesUi() ? UNSUPPORTED_ON_DEVICE : AVAILABLE_UNSEARCHABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
maybeSetTitleAndDestination(preference);
|
||||
if (preference.isEnabled()) {
|
||||
preference.setSummary(mSummaryBuilder.getSoundSummary());
|
||||
}
|
||||
}
|
||||
|
||||
// Only when modes_ui is active: change title & target fragment.
|
||||
private void maybeSetTitleAndDestination(Preference preference) {
|
||||
if (!Flags.modesUi()) {
|
||||
return;
|
||||
}
|
||||
|
||||
preference.setTitle(R.string.zen_modes_list_title);
|
||||
preference.setFragment(ZenModesListFragment.class.getCanonicalName());
|
||||
}
|
||||
|
||||
class SettingObserver extends ContentObserver {
|
||||
private final Uri ZEN_MODE_URI = Settings.Global.getUriFor(Settings.Global.ZEN_MODE);
|
||||
private final Uri ZEN_MODE_CONFIG_ETAG_URI = Settings.Global.getUriFor(
|
||||
|
||||
@@ -28,16 +28,20 @@ import android.bluetooth.BluetoothDevice;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.provider.DeviceConfig;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.core.SettingsUIDeviceConfig;
|
||||
import com.android.settings.flags.Flags;
|
||||
import com.android.settings.fuelgauge.BatteryMeterView;
|
||||
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
|
||||
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
|
||||
@@ -48,12 +52,13 @@ import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.HashSet;
|
||||
@@ -62,6 +67,8 @@ import java.util.Set;
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = {ShadowEntityHeaderController.class, ShadowDeviceConfig.class})
|
||||
public class AdvancedBluetoothDetailsHeaderControllerTest {
|
||||
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
|
||||
|
||||
private static final int BATTERY_LEVEL_MAIN = 30;
|
||||
private static final int BATTERY_LEVEL_LEFT = 25;
|
||||
private static final int BATTERY_LEVEL_RIGHT = 45;
|
||||
@@ -93,7 +100,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest {
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mContext = Robolectric.buildActivity(SettingsActivity.class).get();
|
||||
mController = new AdvancedBluetoothDetailsHeaderController(mContext, "pref_Key");
|
||||
when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice);
|
||||
mController.init(mCachedDevice);
|
||||
@@ -272,6 +279,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest {
|
||||
View.GONE);
|
||||
assertThat(layout.findViewById(R.id.bt_battery_icon).getVisibility()).isEqualTo(View.GONE);
|
||||
assertThat(layout.findViewById(R.id.header_icon).getVisibility()).isEqualTo(View.VISIBLE);
|
||||
assertThat(layout.findViewById(R.id.battery_ring).getVisibility()).isEqualTo(View.GONE);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@@ -546,6 +554,10 @@ public class AdvancedBluetoothDetailsHeaderControllerTest {
|
||||
final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary);
|
||||
assertThat(textView.getText().toString()).isEqualTo(
|
||||
com.android.settings.Utils.formatPercentage(batteryLevel));
|
||||
if (Flags.enableBluetoothDeviceDetailsPolish()) {
|
||||
final ProgressBar bar = linearLayout.findViewById(R.id.battery_ring);
|
||||
assertThat(bar.getProgress()).isEqualTo(batteryLevel);
|
||||
}
|
||||
}
|
||||
|
||||
private void assertBatteryIcon(LinearLayout linearLayout, int resId) {
|
||||
|
||||
@@ -33,9 +33,9 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -43,6 +43,7 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -72,7 +73,7 @@ public class StylusUsiHeaderControllerTest {
|
||||
when(mBatteryState.getCapacity()).thenReturn(1f);
|
||||
when(mBatteryState.isPresent()).thenReturn(true);
|
||||
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
mContext = spy(Robolectric.buildActivity(SettingsActivity.class).get());
|
||||
when(mContext.getSystemService(InputManager.class)).thenReturn(mInputManager);
|
||||
mController = new StylusUsiHeaderController(mContext, mInputDevice);
|
||||
|
||||
|
||||
@@ -18,9 +18,9 @@ package com.android.settings.development;
|
||||
|
||||
import static android.provider.Settings.Global.DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES;
|
||||
|
||||
import static com.android.settings.development.DesktopModePreferenceController.SETTING_VALUE_OFF;
|
||||
import static com.android.settings.development.DesktopModePreferenceController.SETTING_VALUE_ON;
|
||||
import static com.android.settings.development.DesktopModePreferenceController.SETTING_VALUE_UNSET;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride.OVERRIDE_ON;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF;
|
||||
import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@@ -132,7 +132,7 @@ public class DesktopModePreferenceControllerTest {
|
||||
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, -1 /* default */);
|
||||
assertThat(mode).isEqualTo(SETTING_VALUE_ON);
|
||||
assertThat(mode).isEqualTo(OVERRIDE_ON.getSetting());
|
||||
verify(mTransaction).add(any(RebootConfirmationDialogFragment.class), any());
|
||||
}
|
||||
|
||||
@@ -142,14 +142,14 @@ public class DesktopModePreferenceControllerTest {
|
||||
|
||||
int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, -1 /* default */);
|
||||
assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
|
||||
assertThat(mode).isEqualTo(OVERRIDE_OFF.getSetting());
|
||||
verify(mTransaction).add(any(RebootConfirmationDialogFragment.class), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_overrideOn_checksPreference() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, SETTING_VALUE_ON);
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_ON.getSetting());
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
@@ -159,7 +159,7 @@ public class DesktopModePreferenceControllerTest {
|
||||
@Test
|
||||
public void updateState_overrideOff_unchecksPreference() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, SETTING_VALUE_OFF);
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_OFF.getSetting());
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
@@ -170,7 +170,7 @@ public class DesktopModePreferenceControllerTest {
|
||||
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
|
||||
public void updateState_overrideUnset_defaultDevOptionStatusOn_checksPreference() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, SETTING_VALUE_UNSET);
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_UNSET.getSetting());
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
@@ -181,7 +181,7 @@ public class DesktopModePreferenceControllerTest {
|
||||
@DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
|
||||
public void updateState_overrideUnset_defaultDevOptionStatusOff_unchecksPreference() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, SETTING_VALUE_UNSET);
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_UNSET.getSetting());
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
@@ -253,6 +253,6 @@ public class DesktopModePreferenceControllerTest {
|
||||
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, -2 /* default */);
|
||||
assertThat(mode).isEqualTo(DesktopModePreferenceController.SETTING_VALUE_UNSET);
|
||||
assertThat(mode).isEqualTo(OVERRIDE_UNSET.getSetting());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -441,4 +441,9 @@ public class AdvancedPowerUsageDetailTest {
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
verifyNoInteractions(mMetricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldSkipForInitialSUW_returnTrue() {
|
||||
assertThat(mFragment.shouldSkipForInitialSUW()).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,16 @@ class TestModeBuilder {
|
||||
mConfigZenRule.pkg = "some_package";
|
||||
}
|
||||
|
||||
TestModeBuilder(ZenMode previous) {
|
||||
mId = previous.getId();
|
||||
mRule = previous.getRule();
|
||||
|
||||
mConfigZenRule = new ZenModeConfig.ZenRule();
|
||||
mConfigZenRule.enabled = previous.getRule().isEnabled();
|
||||
mConfigZenRule.pkg = previous.getRule().getPackageName();
|
||||
setActive(previous.isActive());
|
||||
}
|
||||
|
||||
TestModeBuilder setId(String id) {
|
||||
mId = id;
|
||||
return this;
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
|
||||
import android.content.Context;
|
||||
import android.widget.Button;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
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 ZenModeEditDonePreferenceControllerTest {
|
||||
|
||||
private ZenModeEditDonePreferenceController mController;
|
||||
private LayoutPreference mPreference;
|
||||
private Button mButton;
|
||||
@Mock private Runnable mConfirmSave;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
Context context = RuntimeEnvironment.application;
|
||||
PreferenceManager preferenceManager = new PreferenceManager(context);
|
||||
PreferenceScreen preferenceScreen = preferenceManager.inflateFromResource(context,
|
||||
R.xml.modes_edit_name_icon, null);
|
||||
mPreference = preferenceScreen.findPreference("done");
|
||||
|
||||
mController = new ZenModeEditDonePreferenceController(context, "done", mConfirmSave);
|
||||
mController.displayPreference(preferenceScreen);
|
||||
|
||||
mButton = mPreference.findViewById(R.id.done);
|
||||
assertThat(mButton).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_nameNonEmpty_buttonEnabled() {
|
||||
ZenMode mode = new TestModeBuilder().setName("Such a nice name").build();
|
||||
|
||||
mController.updateState(mPreference, mode);
|
||||
|
||||
assertThat(mButton.isEnabled()).isTrue();
|
||||
verifyNoMoreInteractions(mConfirmSave);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_nameEmpty_buttonDisabled() {
|
||||
ZenMode aModeHasNoName = new TestModeBuilder().setName("").build();
|
||||
|
||||
mController.updateState(mPreference, aModeHasNoName);
|
||||
|
||||
assertThat(mButton.isEnabled()).isFalse();
|
||||
verifyNoMoreInteractions(mConfirmSave);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onButtonClick_callsConfirmSave() {
|
||||
mButton.performClick();
|
||||
|
||||
verify(mConfirmSave).run();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.testing.FragmentScenario;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.notification.modes.ZenModesBackend;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ZenModeEditNameIconFragmentTest {
|
||||
|
||||
private static final ZenMode MODE = new TestModeBuilder().setId("id").setName("Mode").build();
|
||||
|
||||
private Activity mActivity;
|
||||
private ZenModeEditNameIconFragment mFragment;
|
||||
private FragmentScenario<ZenModeEditNameIconFragment> mScenario;
|
||||
|
||||
@Mock
|
||||
private ZenModesBackend mBackend;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
// Note: Each test should call startFragment() to set mScenario, mFragment and mActivity.
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
if (mScenario != null) {
|
||||
mScenario.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreate_loadsMode() {
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(MODE);
|
||||
|
||||
startFragment(MODE.getId());
|
||||
|
||||
assertThat(mFragment.getZenMode()).isEqualTo(MODE);
|
||||
assertThat(mActivity.isFinishing()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreate_noModeId_exits() {
|
||||
when(mBackend.getMode(any())).thenReturn(MODE);
|
||||
|
||||
startFragment(null);
|
||||
|
||||
assertThat(mActivity.isFinishing()).isTrue();
|
||||
verifyNoMoreInteractions(mBackend);
|
||||
}
|
||||
@Test
|
||||
public void onCreate_missingMode_exits() {
|
||||
when(mBackend.getMode(any())).thenReturn(null);
|
||||
|
||||
startFragment(MODE.getId());
|
||||
|
||||
assertThat(mActivity.isFinishing()).isTrue();
|
||||
verify(mBackend).getMode(MODE.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveMode_appliesChangesAndFinishes() {
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(MODE);
|
||||
startFragment(MODE.getId());
|
||||
|
||||
mFragment.setModeName("A new name");
|
||||
mFragment.setModeIcon(R.drawable.ic_zen_mode_type_theater);
|
||||
mFragment.setModeName("A newer name");
|
||||
|
||||
mFragment.saveMode();
|
||||
|
||||
ArgumentCaptor<ZenMode> captor = ArgumentCaptor.forClass(ZenMode.class);
|
||||
verify(mBackend).updateMode(captor.capture());
|
||||
ZenMode savedMode = captor.getValue();
|
||||
assertThat(savedMode.getName()).isEqualTo("A newer name");
|
||||
assertThat(savedMode.getRule().getIconResId()).isEqualTo(
|
||||
R.drawable.ic_zen_mode_type_theater);
|
||||
|
||||
assertThat(mActivity.isFinishing()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveMode_appliesOnyNameAndIconChanges() {
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(MODE);
|
||||
startFragment(MODE.getId());
|
||||
mFragment.setModeName("A new name");
|
||||
mFragment.setModeIcon(R.drawable.ic_zen_mode_type_theater);
|
||||
// Before the user saves, something else about the mode was modified by someone else.
|
||||
ZenMode newerMode = new TestModeBuilder(MODE).setTriggerDescription("Whenever").build();
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(newerMode);
|
||||
|
||||
mFragment.saveMode();
|
||||
|
||||
// Verify that saving only wrote the mode name, and didn't accidentally stomp over
|
||||
// unrelated fields of the mode.
|
||||
ArgumentCaptor<ZenMode> captor = ArgumentCaptor.forClass(ZenMode.class);
|
||||
verify(mBackend).updateMode(captor.capture());
|
||||
ZenMode savedMode = captor.getValue();
|
||||
assertThat(savedMode.getName()).isEqualTo("A new name");
|
||||
assertThat(savedMode.getTriggerDescription()).isEqualTo("Whenever");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveMode_forModeThatDisappeared_ignoresSave() {
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(MODE);
|
||||
startFragment(MODE.getId());
|
||||
mFragment.setModeName("A new name");
|
||||
mFragment.setModeIcon(R.drawable.ic_zen_mode_type_theater);
|
||||
// Before the user saves, the mode was removed by someone else.
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(null);
|
||||
|
||||
mFragment.saveMode();
|
||||
|
||||
verify(mBackend, never()).updateMode(any());
|
||||
assertThat(mActivity.isFinishing()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setModeFields_withoutSaveMode_doesNotSaveChanges() {
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(MODE);
|
||||
startFragment(MODE.getId());
|
||||
|
||||
mFragment.setModeName("Not a good idea");
|
||||
mFragment.setModeIcon(R.drawable.emergency_icon);
|
||||
mActivity.finish();
|
||||
|
||||
verify(mBackend, never()).updateMode(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreate_whenRecreating_preservesEdits() {
|
||||
when(mBackend.getMode(MODE.getId())).thenReturn(MODE);
|
||||
startFragment(MODE.getId());
|
||||
|
||||
mFragment.setModeName("A better name");
|
||||
mScenario.recreate().onFragment(newFragment -> {
|
||||
assertThat(newFragment).isNotSameInstanceAs(mFragment);
|
||||
newFragment.setBackend(mBackend);
|
||||
mActivity = newFragment.getActivity();
|
||||
mFragment = newFragment;
|
||||
});
|
||||
mFragment.saveMode();
|
||||
|
||||
ArgumentCaptor<ZenMode> captor = ArgumentCaptor.forClass(ZenMode.class);
|
||||
verify(mBackend).updateMode(captor.capture());
|
||||
ZenMode savedMode = captor.getValue();
|
||||
assertThat(savedMode.getName()).isEqualTo("A better name");
|
||||
assertThat(mActivity.isFinishing()).isTrue();
|
||||
}
|
||||
|
||||
private void startFragment(@Nullable String modeId) {
|
||||
Bundle fragmentArgs = null;
|
||||
if (modeId != null) {
|
||||
fragmentArgs = new Bundle();
|
||||
fragmentArgs.putString(EXTRA_AUTOMATIC_ZEN_RULE_ID, modeId);
|
||||
}
|
||||
|
||||
mScenario = FragmentScenario.launch(ZenModeEditNameIconFragment.class, fragmentArgs, 0,
|
||||
Lifecycle.State.INITIALIZED);
|
||||
|
||||
mScenario.onFragment(fragment -> {
|
||||
fragment.setBackend(mBackend); // Before onCreate().
|
||||
mFragment = fragment;
|
||||
});
|
||||
|
||||
mScenario.moveToState(Lifecycle.State.RESUMED).onFragment(fragment -> {
|
||||
mActivity = fragment.requireActivity();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
|
||||
import android.content.Context;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ZenModeEditNamePreferenceControllerTest {
|
||||
|
||||
private ZenModeEditNamePreferenceController mController;
|
||||
private LayoutPreference mPreference;
|
||||
private EditText mEditText;
|
||||
@Mock private Consumer<String> mNameSetter;
|
||||
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
Context context = RuntimeEnvironment.application;
|
||||
PreferenceManager preferenceManager = new PreferenceManager(context);
|
||||
PreferenceScreen preferenceScreen = preferenceManager.inflateFromResource(context,
|
||||
R.xml.modes_edit_name_icon, null);
|
||||
mPreference = preferenceScreen.findPreference("name");
|
||||
|
||||
mController = new ZenModeEditNamePreferenceController(context, "name", mNameSetter);
|
||||
mController.displayPreference(preferenceScreen);
|
||||
mEditText = mPreference.findViewById(android.R.id.edit);
|
||||
assertThat(mEditText).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_showsName() {
|
||||
ZenMode mode = new TestModeBuilder().setName("A fancy name").build();
|
||||
|
||||
mController.updateState(mPreference, mode);
|
||||
|
||||
assertThat(mEditText.getText().toString()).isEqualTo("A fancy name");
|
||||
verifyNoMoreInteractions(mNameSetter);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onEditText_callsNameSetter() {
|
||||
ZenMode mode = new TestModeBuilder().setName("A fancy name").build();
|
||||
mController.updateState(mPreference, mode);
|
||||
EditText editText = mPreference.findViewById(android.R.id.edit);
|
||||
|
||||
editText.setText("An even fancier name");
|
||||
|
||||
verify(mNameSetter).accept("An even fancier name");
|
||||
verifyNoMoreInteractions(mNameSetter);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (C) 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID;
|
||||
|
||||
import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT;
|
||||
import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.fragment.app.testing.EmptyFragmentActivity;
|
||||
import androidx.fragment.app.testing.FragmentScenario;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
import com.android.settingslib.notification.modes.ZenModesBackend;
|
||||
|
||||
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.stubbing.Answer;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ZenModeNewCustomFragmentTest {
|
||||
|
||||
@Rule
|
||||
public ActivityScenarioRule<EmptyFragmentActivity> mActivityScenario =
|
||||
new ActivityScenarioRule<>(EmptyFragmentActivity.class);
|
||||
|
||||
private Activity mActivity;
|
||||
private ZenModeNewCustomFragment mFragment;
|
||||
@Mock
|
||||
private ZenModesBackend mBackend;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mFragment = new ZenModeNewCustomFragment();
|
||||
mFragment.setBackend(mBackend); // before onAttach()
|
||||
|
||||
mActivityScenario.getScenario().onActivity(activity -> {
|
||||
mActivity = activity;
|
||||
activity.getSupportFragmentManager().beginTransaction()
|
||||
.add(mFragment, "tag").commitNow();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveMode_addsCustomManualMode() {
|
||||
mFragment.setModeName("The first name");
|
||||
mFragment.setModeIcon(R.drawable.ic_zen_mode_type_theater);
|
||||
mFragment.setModeName("Actually no, this name");
|
||||
|
||||
mFragment.saveMode();
|
||||
|
||||
verify(mBackend).addCustomManualMode("Actually no, this name",
|
||||
R.drawable.ic_zen_mode_type_theater);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveMode_withoutEdits_addsModeWithDefaultValues() {
|
||||
mFragment.saveMode();
|
||||
|
||||
verify(mBackend).addCustomManualMode("Custom mode", 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveMode_redirectsToModeView() {
|
||||
when(mBackend.addCustomManualMode(any(), anyInt())).then(
|
||||
(Answer<ZenMode>) invocationOnMock -> new TestModeBuilder()
|
||||
.setId("Id of a mode named " + invocationOnMock.getArgument(0))
|
||||
.setName(invocationOnMock.getArgument(0))
|
||||
.setIconResId(invocationOnMock.getArgument(1))
|
||||
.build());
|
||||
|
||||
mFragment.setModeName("something");
|
||||
mFragment.setModeIcon(R.drawable.ic_zen_mode_type_immersive);
|
||||
mFragment.saveMode();
|
||||
|
||||
Intent nextIntent = shadowOf(mActivity).getNextStartedActivity();
|
||||
assertThat(nextIntent.getStringExtra(EXTRA_SHOW_FRAGMENT))
|
||||
.isEqualTo(ZenModeFragment.class.getName());
|
||||
Bundle fragmentArgs = nextIntent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
|
||||
assertThat(fragmentArgs).isNotNull();
|
||||
assertThat(fragmentArgs.getString(EXTRA_AUTOMATIC_ZEN_RULE_ID)).isEqualTo(
|
||||
"Id of a mode named something");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreate_whenRecreating_preservesEdits() {
|
||||
FragmentScenario<ZenModeNewCustomFragment> scenario =
|
||||
FragmentScenario.launch(ZenModeNewCustomFragment.class, /* bundle= */ null, 0,
|
||||
Lifecycle.State.INITIALIZED);
|
||||
scenario.onFragment(first -> {
|
||||
first.setBackend(mBackend);
|
||||
mFragment = first;
|
||||
});
|
||||
scenario.moveToState(Lifecycle.State.RESUMED);
|
||||
|
||||
// Perform some edits in the first fragment.
|
||||
mFragment.setModeName("Don't forget me!");
|
||||
mFragment.setModeIcon(R.drawable.ic_zen_mode_type_immersive);
|
||||
|
||||
// Destroy the first fragment and creates a new one (which should restore state).
|
||||
scenario.recreate().onFragment(second -> {
|
||||
assertThat(second).isNotSameInstanceAs(mFragment);
|
||||
second.setBackend(mBackend);
|
||||
mFragment = second;
|
||||
});
|
||||
|
||||
mFragment.saveMode();
|
||||
verify(mBackend).addCustomManualMode("Don't forget me!",
|
||||
R.drawable.ic_zen_mode_type_immersive);
|
||||
scenario.close();
|
||||
}
|
||||
}
|
||||
@@ -57,6 +57,9 @@ public class ZenModesListFragmentTest {
|
||||
private static final ModeType APP_PROVIDED_MODE_TYPE = new ModeType("Mode", new ColorDrawable(),
|
||||
"Details", new Intent().setComponent(new ComponentName("pkg", "configActivity")));
|
||||
|
||||
private static final ModeType CUSTOM_MANUAL_TYPE = new ModeType("Custom", new ColorDrawable(),
|
||||
null, null); // null creationActivityIntent means custom_manual.
|
||||
|
||||
private static final ImmutableList<ZenMode> EXISTING_MODES = ImmutableList.of(
|
||||
new TestModeBuilder().setId("A").build(),
|
||||
new TestModeBuilder().setId("B").build(),
|
||||
@@ -94,6 +97,16 @@ public class ZenModesListFragmentTest {
|
||||
assertThat(intent.intent).isEqualTo(APP_PROVIDED_MODE_TYPE.creationActivityIntent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onChosenModeTypeForAdd_customManualMode_startsNameAndIconPicker() {
|
||||
mFragment.onChosenModeTypeForAdd(CUSTOM_MANUAL_TYPE);
|
||||
|
||||
Intent nextIntent = shadowOf(mActivity).getNextStartedActivity();
|
||||
assertThat(nextIntent).isNotNull();
|
||||
assertThat(nextIntent.getStringExtra(EXTRA_SHOW_FRAGMENT))
|
||||
.isEqualTo(ZenModeNewCustomFragment.class.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onActivityResult_modeWasCreated_opensIt() {
|
||||
when(mBackend.getModes()).thenReturn(EXISTING_MODES);
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
|
||||
package com.android.settings.notification.modes;
|
||||
|
||||
import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
|
||||
import static android.provider.Settings.Global.ZEN_MODE_OFF;
|
||||
import static android.service.notification.Condition.SOURCE_UNKNOWN;
|
||||
import static android.service.notification.Condition.STATE_TRUE;
|
||||
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_ANYONE;
|
||||
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_ANYONE;
|
||||
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_CONTACTS;
|
||||
@@ -24,13 +28,21 @@ import static android.service.notification.ZenPolicy.VISUAL_EFFECT_LIGHTS;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.app.Flags;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.platform.test.annotations.EnableFlags;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.service.notification.Condition;
|
||||
import android.service.notification.ZenDeviceEffects;
|
||||
import android.service.notification.ZenModeConfig;
|
||||
import android.service.notification.ZenPolicy;
|
||||
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
@@ -46,6 +58,10 @@ public class ZenModesSummaryHelperTest {
|
||||
|
||||
private ZenModeSummaryHelper mSummaryHelper;
|
||||
|
||||
@Rule
|
||||
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(
|
||||
SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
@@ -351,4 +367,87 @@ public class ZenModesSummaryHelperTest {
|
||||
assertThat(mSummaryHelper.getAppsSummary(zenMode, apps)).isEqualTo("FifthApp, FourthApp, "
|
||||
+ "and 4 more can interrupt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_MODES_UI)
|
||||
public void getSoundSummary_off_noRules() {
|
||||
ZenModeConfig config = new ZenModeConfig();
|
||||
|
||||
assertThat(mSummaryHelper.getSoundSummary(ZEN_MODE_OFF, config)).isEqualTo("Off");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_MODES_UI)
|
||||
public void getSoundSummary_off_oneRule() {
|
||||
ZenModeConfig config = new ZenModeConfig();
|
||||
ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule();
|
||||
rule.enabled = true;
|
||||
config.automaticRules.put("key", rule);
|
||||
|
||||
assertThat(mSummaryHelper.getSoundSummary(ZEN_MODE_OFF, config))
|
||||
.isEqualTo("Off / 1 mode can turn on automatically");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_MODES_UI)
|
||||
public void getSoundSummary_off_twoRules() {
|
||||
ZenModeConfig config = new ZenModeConfig();
|
||||
ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule();
|
||||
rule.enabled = true;
|
||||
ZenModeConfig.ZenRule rule2 = new ZenModeConfig.ZenRule();
|
||||
rule2.enabled = true;
|
||||
config.automaticRules.put("key", rule);
|
||||
config.automaticRules.put("key2", rule2);
|
||||
|
||||
assertThat(mSummaryHelper.getSoundSummary(ZEN_MODE_OFF, config))
|
||||
.isEqualTo("Off / 2 modes can turn on automatically");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_MODES_UI)
|
||||
public void getSoundSummary_on_noDescription() {
|
||||
ZenModeConfig config = new ZenModeConfig();
|
||||
config.manualRule.conditionId = Uri.EMPTY;
|
||||
config.manualRule.pkg = "android";
|
||||
config.manualRule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
|
||||
config.manualRule.condition = new Condition(Uri.EMPTY, "", STATE_TRUE, SOURCE_UNKNOWN);
|
||||
assertThat(mSummaryHelper.getSoundSummary(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config))
|
||||
.isEqualTo("On");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_MODES_UI)
|
||||
public void getSoundSummary_on_manualDescription() {
|
||||
ZenModeConfig config = new ZenModeConfig();
|
||||
config.manualRule.conditionId = ZenModeConfig.toCountdownConditionId(
|
||||
System.currentTimeMillis() + 10000, false);
|
||||
config.manualRule.pkg = "android";
|
||||
config.manualRule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
|
||||
config.manualRule.condition = new Condition(Uri.EMPTY, "", STATE_TRUE, SOURCE_UNKNOWN);
|
||||
assertThat(mSummaryHelper.getSoundSummary(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config))
|
||||
.startsWith("On /");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnableFlags(Flags.FLAG_MODES_UI)
|
||||
public void getSoundSummary_on_automatic() {
|
||||
ZenModeConfig config = new ZenModeConfig();
|
||||
ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule();
|
||||
rule.configurationActivity = new ComponentName("a", "a");
|
||||
rule.component = new ComponentName("b", "b");
|
||||
rule.conditionId = new Uri.Builder().scheme("hello").build();
|
||||
rule.condition = new Condition(rule.conditionId, "", STATE_TRUE);
|
||||
rule.enabled = true;
|
||||
rule.creationTime = 123;
|
||||
rule.id = "id";
|
||||
rule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
|
||||
rule.modified = true;
|
||||
rule.name = "name";
|
||||
rule.snoozing = false;
|
||||
rule.pkg = "b";
|
||||
config.automaticRules.put("key", rule);
|
||||
|
||||
assertThat(mSummaryHelper.getSoundSummary(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config))
|
||||
.startsWith("On /");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user