diff options
22 files changed, 230 insertions, 286 deletions
diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java index 1b03f2f328e5..bf9a9b060b6b 100644 --- a/core/java/android/app/backup/FullBackup.java +++ b/core/java/android/app/backup/FullBackup.java @@ -116,7 +116,7 @@ public class FullBackup { ConfigSection.CLOUD_BACKUP, ConfigSection.DEVICE_TRANSFER }) - private @interface ConfigSection { + @interface ConfigSection { String CLOUD_BACKUP = "cloud-backup"; String DEVICE_TRANSFER = "device-transfer"; } @@ -528,7 +528,8 @@ public class FullBackup { return mExcludes; } - private synchronized int getRequiredTransportFlags() + @VisibleForTesting + public synchronized int getRequiredTransportFlags() throws IOException, XmlPullParserException { if (mRequiredTransportFlags == null) { maybeParseBackupSchemeLocked(); @@ -587,11 +588,13 @@ public class FullBackup { if (mDataExtractionRules != 0) { // New config is present. Use it if it has configuration for this operation // type. + boolean isSectionPresent; try (XmlResourceParser parser = getParserForResource(mDataExtractionRules)) { - parseNewBackupSchemeFromXmlLocked(parser, configSection, mExcludes, mIncludes); + isSectionPresent = parseNewBackupSchemeFromXmlLocked(parser, configSection, + mExcludes, mIncludes); } - if (!mExcludes.isEmpty() || !mIncludes.isEmpty()) { - // Found configuration in the new config, we will use it. + if (isSectionPresent) { + // Found the relevant section in the new config, we will use it. mIsUsingNewScheme = true; return; } @@ -630,24 +633,31 @@ public class FullBackup { .getXml(resourceId); } - private void parseNewBackupSchemeFromXmlLocked(XmlPullParser parser, + @VisibleForTesting + public boolean parseNewBackupSchemeFromXmlLocked(XmlPullParser parser, @ConfigSection String configSection, Set<PathWithRequiredFlags> excludes, Map<String, Set<PathWithRequiredFlags>> includes) throws IOException, XmlPullParserException { verifyTopLevelTag(parser, "data-extraction-rules"); + boolean isSectionPresent = false; + int event; while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { if (event != XmlPullParser.START_TAG || !configSection.equals(parser.getName())) { continue; } + isSectionPresent = true; + parseRequiredTransportFlags(parser, configSection); parseRules(parser, excludes, includes, Optional.of(0), configSection); } logParsingResults(excludes, includes); + + return isSectionPresent; } private void parseRequiredTransportFlags(XmlPullParser parser, diff --git a/core/java/android/hardware/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl index d69a9e14b4bf..55711654231e 100644 --- a/core/java/android/hardware/ISensorPrivacyManager.aidl +++ b/core/java/android/hardware/ISensorPrivacyManager.aidl @@ -52,4 +52,6 @@ interface ISensorPrivacyManager { void addUserGlobalIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener); void removeUserGlobalIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener); + + void showSensorUseDialog(int sensor); }
\ No newline at end of file diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java index fa7ce11c5414..3c524b2052f7 100644 --- a/core/java/android/hardware/SensorPrivacyManager.java +++ b/core/java/android/hardware/SensorPrivacyManager.java @@ -33,6 +33,7 @@ import android.os.UserHandle; import android.service.SensorPrivacyIndividualEnabledSensorProto; import android.service.SensorPrivacyToggleSourceProto; import android.util.ArrayMap; +import android.util.Log; import android.util.Pair; import android.util.SparseArray; @@ -48,6 +49,8 @@ import java.util.concurrent.Executor; @SystemService(Context.SENSOR_PRIVACY_SERVICE) public final class SensorPrivacyManager { + private static final String LOG_TAG = SensorPrivacyManager.class.getSimpleName(); + /** * Unique Id of this manager to identify to the service * @hide @@ -505,6 +508,25 @@ public final class SensorPrivacyManager { } /** + * If sensor privacy for the provided sensor is enabled then this call will show the user the + * dialog which is shown when an application attempts to use that sensor. If privacy isn't + * enabled then this does nothing. + * + * This call can only be made by the system uid. + * + * @throws SecurityException when called by someone other than system uid. + * + * @hide + */ + public void showSensorUseDialog(int sensor) { + try { + mService.showSensorUseDialog(sensor); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Received exception while trying to show sensor use dialog", e); + } + } + + /** * A class implementing this interface can register with the {@link * android.hardware.SensorPrivacyManager} to receive notification when the all-sensor privacy * state changes. diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index 41374167cc56..face870ca1b4 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -783,6 +783,9 @@ public class AlwaysOnHotwordDetector extends AbstractHotwordDetector { * This may happen if another detector has been instantiated or the * {@link VoiceInteractionService} hosting this detector has been shut down. */ + // TODO: Remove this RequiresPermission since it isn't actually enforced. Also fix the javadoc + // about permissions enforcement (when it throws vs when it just returns false) for other + // methods in this class. @RequiresPermission(allOf = {RECORD_AUDIO, CAPTURE_AUDIO_HOTWORD}) @Override public boolean stopRecognition() { diff --git a/core/java/android/service/voice/SoftwareHotwordDetector.java b/core/java/android/service/voice/SoftwareHotwordDetector.java index 02294e5720ae..f7a3415259fd 100644 --- a/core/java/android/service/voice/SoftwareHotwordDetector.java +++ b/core/java/android/service/voice/SoftwareHotwordDetector.java @@ -82,6 +82,9 @@ class SoftwareHotwordDetector extends AbstractHotwordDetector { try { mManagerService.startListeningFromMic( mAudioFormat, new BinderCallback(mHandler, mCallback)); + } catch (SecurityException e) { + Slog.e(TAG, "startRecognition failed: " + e); + return false; } catch (RemoteException e) { e.rethrowFromSystemServer(); } diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index 6a0fec790242..f52c9ff210d6 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -520,6 +520,12 @@ public class VoiceInteractionService extends Service { // Ignore. } + try { + mSystemService.shutdownHotwordDetectionService(); + } catch (Exception ex) { + // Ignore. + } + mSoftwareHotwordDetector = null; } diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index f388427acab6..fcca1b39330a 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1949,7 +1949,7 @@ <string name="maximize_button_text" msgid="4258922519914732645">"بزرگ کردن"</string> <string name="close_button_text" msgid="10603510034455258">"بستن"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"پاسخ"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"پاسخ دادن"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ویدیو"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"رد کردن"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"قطع تماس"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 893aedae146d..81be9a7988b0 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -68,7 +68,7 @@ <string name="CnipMmi" msgid="4897531155968151160">"కాలింగ్ నంబర్ అందుబాటులో ఉంది"</string> <string name="CnirMmi" msgid="885292039284503036">"కాలింగ్ నంబర్ పరిమితం చేయబడింది"</string> <string name="ThreeWCMmi" msgid="2436550866139999411">"మూడు మార్గాల కాలింగ్"</string> - <string name="RuacMmi" msgid="1876047385848991110">"అవాంఛిత అంతరాయ కాల్ల తిరస్కరణ"</string> + <string name="RuacMmi" msgid="1876047385848991110">"అవాంఛిత అంతరాయ కాల్స్ల తిరస్కరణ"</string> <string name="CndMmi" msgid="185136449405618437">"కాలింగ్ నంబర్ బట్వాడా"</string> <string name="DndMmi" msgid="8797375819689129800">"అంతరాయం కలిగించవద్దు"</string> <string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"కాలర్ ID డిఫాల్ట్గా పరిమితానికి ఉంటుంది. తర్వాత కాల్: పరిమితం చేయబడింది"</string> @@ -86,7 +86,7 @@ <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"మొబైల్ నెట్వర్క్ అందుబాటులో లేదు"</string> <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ప్రాధాన్య నెట్వర్క్ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి."</string> <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string> - <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi-Fiతో అత్యవసర కాల్లు చేయలేరు"</string> + <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi-Fiతో అత్యవసర కాల్స్ చేయలేరు"</string> <string name="notification_channel_network_alert" msgid="4788053066033851841">"అలర్ట్లు"</string> <string name="notification_channel_call_forward" msgid="8230490317314272406">"కాల్ ఫార్వార్డింగ్"</string> <string name="notification_channel_emergency_callback" msgid="54074839059123159">"అత్యవసర కాల్బ్యాక్ మోడ్"</string> @@ -124,7 +124,7 @@ <string name="roamingTextSearching" msgid="5323235489657753486">"సేవ కోసం శోధిస్తోంది"</string> <string name="wfcRegErrorTitle" msgid="3193072971584858020">"Wi‑Fi కాలింగ్ని సెటప్ చేయడం సాధ్యపడలేదు"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="468830943567116703">"Wi-Fiతో కాల్లను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్కి చెప్పండి. ఆ తర్వాత సెట్టింగ్ల నుండి Wi-Fi కాలింగ్ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: <xliff:g id="CODE">%1$s</xliff:g>)"</item> + <item msgid="468830943567116703">"Wi-Fiతో కాల్స్ను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్కి చెప్పండి. ఆ తర్వాత సెట్టింగ్ల నుండి Wi-Fi కాలింగ్ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="4795145070505729156">"మీ క్యారియర్తో Wi‑Fi కాలింగ్ని నమోదు చేయడంలో సమస్య: <xliff:g id="CODE">%1$s</xliff:g>"</item> @@ -176,10 +176,10 @@ <string name="contentServiceSync" msgid="2341041749565687871">"సమకాలీకరణ"</string> <string name="contentServiceSyncNotificationTitle" msgid="5766411446676388623">"సమకాలీకరించడం సాధ్యపడదు"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4562226280528716090">"చాలా ఎక్కువ <xliff:g id="CONTENT_TYPE">%s</xliff:g> తొలగించడానికి ప్రయత్నించారు."</string> - <string name="low_memory" product="tablet" msgid="5557552311566179924">"టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string> - <string name="low_memory" product="watch" msgid="3479447988234030194">"వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string> + <string name="low_memory" product="tablet" msgid="5557552311566179924">"టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string> + <string name="low_memory" product="watch" msgid="3479447988234030194">"వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV పరికరం నిల్వ నిండింది. కొంత ప్రదేశాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string> - <string name="low_memory" product="default" msgid="2539532364144025569">"ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string> + <string name="low_memory" product="default" msgid="2539532364144025569">"ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string> <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029"> <item quantity="other">ప్రమాణపత్ర అధికారాలు ఇన్స్టాల్ చేయబడ్డాయి</item> <item quantity="one">ప్రమాణపత్ర అధికారం ఇన్స్టాల్ చేయబడింది</item> @@ -311,7 +311,7 @@ <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS సందేశాలను పంపడం మరియు వీక్షించడం"</string> <string name="permgrouplab_storage" msgid="1938416135375282333">"ఫైల్స్, మీడియా"</string> - <string name="permgroupdesc_storage" msgid="6351503740613026600">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్లను యాక్సెస్ చేయడానికి"</string> + <string name="permgroupdesc_storage" msgid="6351503740613026600">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైళ్లను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"మైక్రోఫోన్"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"ఆడియోను రికార్డ్ చేయడానికి"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ఫిజికల్ యాక్టివిటీ"</string> @@ -323,7 +323,7 @@ <string name="permgrouplab_calllog" msgid="7926834372073550288">"కాల్ లాగ్లు"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"ఫోన్ కాల్ లాగ్ని చదవండి మరియు రాయండి"</string> <string name="permgrouplab_phone" msgid="570318944091926620">"ఫోన్"</string> - <string name="permgroupdesc_phone" msgid="270048070781478204">"ఫోన్ కాల్లు చేయడం మరియు నిర్వహించడం"</string> + <string name="permgroupdesc_phone" msgid="270048070781478204">"ఫోన్ కాల్స్ చేయడం మరియు నిర్వహించడం"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"శరీర సెన్సార్లు"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"విండో కంటెంట్ను తిరిగి పొందుతుంది"</string> @@ -352,10 +352,10 @@ <string name="permdesc_install_shortcut" msgid="4476328467240212503">"వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను జోడించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_uninstall_shortcut" msgid="295263654781900390">"సత్వరమార్గాలను అన్ఇన్స్టాల్ చేయడం"</string> <string name="permdesc_uninstall_shortcut" msgid="1924735350988629188">"వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"అవుట్గోయింగ్ కాల్లను దారి మళ్లించడం"</string> + <string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"అవుట్గోయింగ్ కాల్స్ను దారి మళ్లించడం"</string> <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"కాల్ను వేరే నంబర్కు దారి మళ్లించే లేదా మొత్తంగా కాల్ను ఆపివేసే ఎంపిక సహాయంతో అవుట్గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్ను చూడటానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"ఫోన్ కాల్లకు సమాధానమివ్వు"</string> - <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"ఇన్కమింగ్ ఫోన్ కాల్లకు సమాధానమివ్వడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"ఫోన్ కాల్స్కు సమాధానమివ్వు"</string> + <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"ఇన్కమింగ్ ఫోన్ కాల్స్కు సమాధానమివ్వడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_receiveSms" msgid="505961632050451881">"వచన సందేశాలను (SMS) స్వీకరించడం"</string> <string name="permdesc_receiveSms" msgid="1797345626687832285">"SMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. యాప్ మీ డివైజ్కు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం."</string> <string name="permlab_receiveMms" msgid="4000650116674380275">"వచన సందేశాలను (MMS) స్వీకరించడం"</string> @@ -376,15 +376,15 @@ <string name="permdesc_readSms" product="default" msgid="774753371111699782">"ఈ యాప్ మీ ఫోన్లో నిల్వ చేసిన అన్ని SMS (వచన) సందేశాలను చదవగలదు."</string> <string name="permlab_receiveWapPush" msgid="4223747702856929056">"వచన సందేశాలను (WAP) స్వీకరించడం"</string> <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి మీకు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగల లేదా తొలగించగల సామర్థ్యాన్ని కలిగి ఉంటుంది."</string> - <string name="permlab_getTasks" msgid="7460048811831750262">"అమలవుతున్న అనువర్తనాలను పునరుద్ధరించడం"</string> + <string name="permlab_getTasks" msgid="7460048811831750262">"అమలవుతున్న యాప్లను పునరుద్ధరించడం"</string> <string name="permdesc_getTasks" msgid="7388138607018233726">"ప్రస్తుతం మరియు ఇటీవల అమలవుతున్న విధుల గురించి వివరణాత్మక సమాచారాన్ని తిరిగి పొందడానికి యాప్ను అనుమతిస్తుంది. ఇది పరికరంలో ఉపయోగించబడిన యాప్ల గురించి సమాచారాన్ని కనుగొనడానికి యాప్ను అనుమతించవచ్చు."</string> <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"ప్రొఫైల్ మరియు పరికర యజమానులను నిర్వహించడం"</string> - <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి అనువర్తనాలను అనుమతిస్తుంది."</string> + <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి యాప్లను అనుమతిస్తుంది."</string> <string name="permlab_reorderTasks" msgid="7598562301992923804">"అమలవుతోన్న యాప్లను మళ్లీ క్రమం చేయడం"</string> <string name="permdesc_reorderTasks" msgid="8796089937352344183">"విధులను ముందుకు మరియు నేపథ్యానికి తరలించడానికి యాప్ను అనుమతిస్తుంది. యాప్ మీ ప్రమేయం లేకుండానే దీన్ని చేయవచ్చు."</string> <string name="permlab_enableCarMode" msgid="893019409519325311">"కారు మోడ్ను ప్రారంభించడం"</string> <string name="permdesc_enableCarMode" msgid="56419168820473508">"కారు మోడ్ను ప్రారంభించడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"ఇతర అనువర్తనాలను మూసివేయడం"</string> + <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"ఇతర యాప్లను మూసివేయడం"</string> <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"ఇతర యాప్ల నేపథ్య ప్రాసెస్లను ముగించడానికి యాప్ను అనుమతిస్తుంది. దీని వలన ఇతర యాప్లు అమలు కాకుండా ఆపివేయబడవచ్చు."</string> <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"ఈ యాప్ ఇతర యాప్ల పైభాగాన కనిపించగలదు"</string> <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"ఈ యాప్ ఇతర యాప్ల పైభాగాన లేదా స్క్రీన్ యొక్క ఇతర భాగాలపైన కనిపించగలదు. ఇది సాధారణ యాప్ వినియోగానికి అంతరాయం కలిగించవచ్చు మరియు ఆ ఇతర యాప్లు కనిపించే విధానాన్ని మార్చవచ్చు."</string> @@ -421,9 +421,9 @@ <string name="permlab_readCallLog" msgid="1739990210293505948">"కాల్ లాగ్ను చదవడం"</string> <string name="permdesc_readCallLog" msgid="8964770895425873433">"ఈ యాప్ మీ కాల్ చరిత్రను చదవగలదు."</string> <string name="permlab_writeCallLog" msgid="670292975137658895">"కాల్ లాగ్ను వ్రాయడం"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> - <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్లకు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్ను సవరించడానికి యాప్ని అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> - <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> + <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్కు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్ను సవరించడానికి యాప్ని అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> + <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> <string name="permlab_bodySensors" msgid="3411035315357380862">"శరీర సెన్సార్లను (గుండె స్పందన రేటు మానిటర్ల వంటివి) యాక్సెస్ చేయండి"</string> <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"మీ శారీరక పరిస్థితిని అనగా మీ గుండె స్పందన రేటు వంటి వాటిని పర్యవేక్షించే సెన్సార్ల నుండి డేటాను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_readCalendar" msgid="6408654259475396200">"క్యాలెండర్ ఈవెంట్లు మరియు వివరాలను చదవడం"</string> @@ -464,15 +464,15 @@ <string name="permdesc_vibrate" msgid="8733343234582083721">"వైబ్రేటర్ను నియంత్రించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permdesc_vibrator_state" msgid="7050024956594170724">"వైబ్రేటర్ స్థితిని యాక్సెస్ చేసేందుకు యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_callPhone" msgid="1798582257194643320">"నేరుగా కాల్ చేసే ఫోన్ నంబర్లు"</string> - <string name="permdesc_callPhone" msgid="5439809516131609109">"మీ ప్రమేయం లేకుండా ఫోన్ నంబర్లకు కాల్ చేయడానికి యాప్ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్లు రావచ్చు. ఇది అత్యవసర నంబర్లకు కాల్ చేయడానికి యాప్ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్లు మీ నిర్ధారణ లేకుండానే కాల్లు చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు."</string> + <string name="permdesc_callPhone" msgid="5439809516131609109">"మీ ప్రమేయం లేకుండా ఫోన్ నంబర్లకు కాల్ చేయడానికి యాప్ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్స్ రావచ్చు. ఇది అత్యవసర నంబర్లకు కాల్ చేయడానికి యాప్ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్లు మీ నిర్ధారణ లేకుండానే కాల్స్ చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు."</string> <string name="permlab_accessImsCallService" msgid="442192920714863782">"IMS కాల్ సేవ యాక్సెస్ అనుమతి"</string> - <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"మీ ప్రమేయం లేకుండా కాల్లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"మీ ప్రమేయం లేకుండా కాల్స్ చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ఫోన్ స్థితి మరియు గుర్తింపుని చదవడం"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"పరికరం యొక్క ఫోన్ ఫీచర్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్ను కనుగొనడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయి"</string> - <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_callCompanionApp" msgid="3654373653014126884">"సిస్టమ్ ద్వారా కాల్లను చూసి, నియంత్రించండి."</string> - <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"పరికరంలో కొనసాగుతున్న కాల్లను చూడడానికి మరియు నియంత్రించడానికి యాప్ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్ల నంబర్లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది."</string> + <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"కాల్స్ను సిస్టమ్ ద్వారా వెళ్లేలా చేయి"</string> + <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్స్ను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permlab_callCompanionApp" msgid="3654373653014126884">"సిస్టమ్ ద్వారా కాల్స్ను చూసి, నియంత్రించండి."</string> + <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"పరికరంలో కొనసాగుతున్న కాల్స్ను చూడడానికి మరియు నియంత్రించడానికి యాప్ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్స్ల నంబర్లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది."</string> <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"ఆడియో రికార్డ్ పరిమితుల నుండి మినహాయింపు"</string> <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"ఆడియోను రికార్డ్ చేయడానికి యాప్ను పరిమితుల నుండి మినహాయించండి."</string> <string name="permlab_acceptHandover" msgid="2925523073573116523">"మరో యాప్ నుండి కాల్ని కొనసాగించండి"</string> @@ -672,8 +672,8 @@ <string name="permdesc_sdcardRead" msgid="6872973242228240382">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్లను చదవడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_sdcardWrite" msgid="4863021819671416668">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్లను సవరించండి లేదా తొలగించండి"</string> <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్లను రాయడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_use_sip" msgid="8250774565189337477">"SIP కాల్లను చేయడానికి/స్వీకరించడానికి"</string> - <string name="permdesc_use_sip" msgid="3590270893253204451">"SIP కాల్లను చేయడానికి మరియు స్వీకరించడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permlab_use_sip" msgid="8250774565189337477">"SIP కాల్స్ను చేయడానికి/స్వీకరించడానికి"</string> + <string name="permdesc_use_sip" msgid="3590270893253204451">"SIP కాల్స్ను చేయడానికి మరియు స్వీకరించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_register_sim_subscription" msgid="1653054249287576161">"కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడం"</string> <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_register_call_provider" msgid="6135073566140050702">"కొత్త టెలికామ్ కనెక్షన్లను నమోదు చేయడం"</string> @@ -683,7 +683,7 @@ <string name="permlab_bind_incall_service" msgid="5990625112603493016">"ఇన్-కాల్ స్క్రీన్తో పరస్పర చర్య చేయడం"</string> <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం"</string> - <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"కాల్లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"కాల్స్ చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం"</string> <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"చారిత్రక నెట్వర్క్ వినియోగాన్ని చదవడం"</string> @@ -693,29 +693,29 @@ <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"నెట్వర్క్ వినియోగ అకౌంటింగ్ను సవరించడం"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"యాప్లలో నెట్వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని సవరించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ యాప్ల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు."</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"నోటిఫికేషన్లను యాక్సెస్ చేయడం"</string> - <string name="permdesc_accessNotifications" msgid="761730149268789668">"నోటిఫికేషన్లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permdesc_accessNotifications" msgid="761730149268789668">"నోటిఫికేషన్లను, ఇతర యాప్ల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"నోటిఫికేషన్ పరిశీలన సేవకు అనుబంధించడం"</string> - <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."</string> + <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్ల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."</string> <string name="permlab_bindConditionProviderService" msgid="5245421224814878483">"షరతు ప్రదాత సేవకు అనుబంధించడం"</string> - <string name="permdesc_bindConditionProviderService" msgid="6106018791256120258">"షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_bindConditionProviderService" msgid="6106018791256120258">"షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_bindDreamService" msgid="4776175992848982706">"డ్రీమ్ సేవకి అనుబంధించడం"</string> - <string name="permdesc_bindDreamService" msgid="9129615743300572973">"డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_bindDreamService" msgid="9129615743300572973">"డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_invokeCarrierSetup" msgid="5098810760209818140">"క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్ను అభ్యర్థించడం"</string> - <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్ను అభ్యర్థించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."</string> + <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్ను అభ్యర్థించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్ల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."</string> <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడం"</string> - <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు."</string> + <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండకూడదు."</string> <string name="permlab_setInputCalibration" msgid="932069700285223434">"ఇన్పుట్ పరికరం క్రమాంకనాన్ని మార్చండి"</string> - <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_accessDrmCertificates" msgid="6473765454472436597">"DRM ప్రమాణపత్రాలను యాక్సెస్ చేయడం"</string> - <string name="permdesc_accessDrmCertificates" msgid="6983139753493781941">"DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_accessDrmCertificates" msgid="6983139753493781941">"DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_handoverStatus" msgid="7620438488137057281">"Android Beam బదిలీ స్థితిని స్వీకరించడం"</string> <string name="permdesc_handoverStatus" msgid="3842269451732571070">"ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ యాప్ను అనుమతిస్తుంది"</string> <string name="permlab_removeDrmCertificates" msgid="710576248717404416">"DRM ప్రమాణపత్రాలను తీసివేయడం"</string> - <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"క్యారియర్ సందేశ సేవకు అనుబంధించడం"</string> - <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"క్యారియర్ సేవలకు అనుబంధించడం"</string> - <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string> + <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_access_notification_policy" msgid="5524112842876975537">"అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం"</string> <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"</string> @@ -1258,7 +1258,7 @@ <string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g>ని అప్గ్రేడ్ చేస్తోంది…"</string> <string name="android_upgrading_apk" msgid="1339564803894466737">"<xliff:g id="NUMBER_1">%2$d</xliff:g>లో <xliff:g id="NUMBER_0">%1$d</xliff:g> యాప్ను అనుకూలీకరిస్తోంది."</string> <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g>ని సిద్ధం చేస్తోంది."</string> - <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"అనువర్తనాలను ప్రారంభిస్తోంది."</string> + <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"యాప్లను ప్రారంభిస్తోంది."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"బూట్ను ముగిస్తోంది."</string> <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"స్క్రీన్ను ఆఫ్ చేయాలా?"</string> <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"మీ వేలిముద్రను సెటప్ చేస్తున్నప్పుడు, మీరు పవర్ బటన్ను నొక్కారు.\n\nఇది సాధారణంగా మీ స్క్రీన్ను ఆఫ్ చేస్తుంది."</string> @@ -1990,7 +1990,7 @@ <string name="profile_encrypted_detail" msgid="5279730442756849055">"కార్యాలయ ప్రొఫైల్ లాక్ అయింది"</string> <string name="profile_encrypted_message" msgid="1128512616293157802">"కార్యాలయ ప్రొఫైల్ అన్లాక్ చేయుటకు నొక్కండి"</string> <string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>కి కనెక్ట్ చేయబడింది"</string> - <string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"ఫైల్లను వీక్షించడానికి నొక్కండి"</string> + <string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"ఫైళ్లను వీక్షించడానికి నొక్కండి"</string> <string name="pin_target" msgid="8036028973110156895">"పిన్ చేయి"</string> <string name="pin_specific_target" msgid="7824671240625957415">"<xliff:g id="LABEL">%1$s</xliff:g>ను పిన్ చేయండి"</string> <string name="unpin_target" msgid="3963318576590204447">"అన్పిన్ చేయి"</string> @@ -2076,8 +2076,8 @@ <string name="harmful_app_warning_title" msgid="8794823880881113856">"హానికరమైన యాప్ గుర్తించబడింది"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> స్లైస్లను చూపించాలనుకుంటోంది"</string> <string name="screenshot_edit" msgid="7408934887203689207">"ఎడిట్ చేయండి"</string> - <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"కాల్లు మరియు నోటిఫికేషన్లు వైబ్రేట్ అవుతాయి"</string> - <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"కాల్లు మరియు నోటిఫికేషన్లు మ్యూట్ చేయబడతాయి"</string> + <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"కాల్స్ మరియు నోటిఫికేషన్లు వైబ్రేట్ అవుతాయి"</string> + <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"కాల్స్ మరియు నోటిఫికేషన్లు మ్యూట్ చేయబడతాయి"</string> <string name="notification_channel_system_changes" msgid="2462010596920209678">"సిస్టమ్ మార్పులు"</string> <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"అంతరాయం కలిగించవద్దు"</string> <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"కొత్తది: అంతరాయం కలిగించవద్దు నోటిఫికేషన్లను దాస్తోంది"</string> @@ -2099,7 +2099,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"సరే"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ఆఫ్ చేయండి"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"మరింత తెలుసుకోండి"</string> - <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12లో Android అనుకూల నోటిఫికేషన్లను, మెరుగైన నోటిఫికేషన్లు భర్తీ చేశాయి. సూచించిన చర్యలు, రిప్లయిలను ఈ ఫీచర్ చూపించి, మీ నోటిఫికేషన్లను ఆర్గనైజ్ చేస్తుంది.\n\nకాంటాక్ట్ పేర్లు, మెసేజ్లు లాంటి వ్యక్తిగత సమాచారంతో సహా నోటిఫికేషన్ కంటెంట్ను మెరుగైన నోటిఫికేషన్లు యాక్సెస్ చేయవచ్చు. ఫోన్ కాల్లకు సమాధానమివ్వడం, \'అంతరాయం కలిగించవద్దు\' ఆప్షన్ను కంట్రోల్ చేయడం లాంటి నోటిఫికేషన్లను విస్మరించడం లేదా ప్రతిస్పందించడం కూడా ఈ ఫీచర్ చేయగలదు."</string> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12లో Android అనుకూల నోటిఫికేషన్లను, మెరుగైన నోటిఫికేషన్లు భర్తీ చేశాయి. సూచించిన చర్యలు, రిప్లయిలను ఈ ఫీచర్ చూపించి, మీ నోటిఫికేషన్లను ఆర్గనైజ్ చేస్తుంది.\n\nకాంటాక్ట్ పేర్లు, మెసేజ్లు లాంటి వ్యక్తిగత సమాచారంతో సహా నోటిఫికేషన్ కంటెంట్ను మెరుగైన నోటిఫికేషన్లు యాక్సెస్ చేయవచ్చు. ఫోన్ కాల్స్కు సమాధానమివ్వడం, \'అంతరాయం కలిగించవద్దు\' ఆప్షన్ను కంట్రోల్ చేయడం లాంటి నోటిఫికేషన్లను విస్మరించడం లేదా ప్రతిస్పందించడం కూడా ఈ ఫీచర్ చేయగలదు."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string> @@ -2129,7 +2129,7 @@ <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"విమానం మోడ్లో బ్లూటూత్ ఆన్లో ఉంటుంది"</string> <string name="car_loading_profile" msgid="8219978381196748070">"లోడవుతోంది"</string> <plurals name="file_count" formatted="false" msgid="7063513834724389247"> - <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైల్లు</item> + <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైళ్లు</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ఫైల్</item> </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ఎవరికి షేర్ చేయాలనే దానికి సంబంధించి సిఫార్సులేవీ లేవు"</string> diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java index 08edb4e9be97..bc92da928d1e 100644 --- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java +++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java @@ -16,6 +16,8 @@ package android.app.backup; +import static android.app.backup.FullBackup.ConfigSection.CLOUD_BACKUP; + import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; import android.test.AndroidTestCase; @@ -414,6 +416,37 @@ public class FullBackupTest extends AndroidTestCase { assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes); } + public void testParseNewBackupSchemeFromXml_emptyCloudSectionIsRespected() throws Exception { + mXpp.setInput(new StringReader( + "<data-extraction-rules>" + + "<cloud-backup>" + + "</cloud-backup>" + + "</data-extraction-rules>")); + + FullBackup.BackupScheme backupScheme = FullBackup.getBackupSchemeForTest(mContext); + boolean result = backupScheme.parseNewBackupSchemeFromXmlLocked(mXpp, CLOUD_BACKUP, + excludesSet, includeMap); + + assertTrue(result); + } + + public void testParseNewBackupSchemeFromXml_emptyCloudSectionWithEncryptionFlagIsRespected() + throws Exception { + mXpp.setInput(new StringReader( + "<data-extraction-rules>" + + "<cloud-backup disableIfNoEncryptionCapabilities=\"true\">" + + "</cloud-backup>" + + "</data-extraction-rules>")); + + FullBackup.BackupScheme backupScheme = FullBackup.getBackupSchemeForTest(mContext); + boolean result = backupScheme.parseNewBackupSchemeFromXmlLocked(mXpp, CLOUD_BACKUP, + excludesSet, includeMap); + + assertTrue(result); + assertEquals(backupScheme.getRequiredTransportFlags(), + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED); + } + public void testDoubleDotInPath_isIgnored() throws Exception { mXpp.setInput(new StringReader( "<full-backup-content>" + diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index 8951e0def1cb..dba1ab4de61f 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -83,7 +83,7 @@ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టాబ్లెట్ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్లలో మార్చవచ్చు."</string> <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టీవీ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్లలో మార్చవచ్చు."</string> <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ ఫోన్ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్లలో మార్చవచ్చు."</string> - <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"తెలియని యాప్లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు."</string> + <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"తెలియని యాప్లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్ను ఇన్స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు."</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"కొనసాగించు"</string> diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index 989b53e7810d..fc49f079f82d 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"బగ్ రిపోర్ట్స్లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేషన్ డేటా వంటి) డేటాతో పాటు సిస్టమ్కు సంబంధించిన విభిన్న లాగ్ ఫైల్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"బగ్ రిపోర్ట్స్లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేషన్ డేటా వంటి) డేటాతో పాటు సిస్టమ్కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"మళ్లీ చూపవద్దు"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"బగ్ రిపోర్ట్స్"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"బగ్ నివేదిక ఫైల్ను చదవడం సాధ్యపడలేదు"</string> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java index acfd998ff6e4..8e6cf36f8e74 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java @@ -17,14 +17,10 @@ package com.android.systemui.statusbar; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; -import android.view.DisplayCutout; import android.view.View; import android.widget.TextView; @@ -42,22 +38,14 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry. public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { private static final String HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE = "heads_up_status_bar_view_super_parcelable"; - private static final String FIRST_LAYOUT = "first_layout"; private static final String VISIBILITY = "visibility"; private static final String ALPHA = "alpha"; - private int mAbsoluteStartPadding; - private int mEndMargin; + private final Rect mLayoutedIconRect = new Rect(); + private final int[] mTmpPosition = new int[2]; + private final Rect mIconDrawingRect = new Rect(); private View mIconPlaceholder; private TextView mTextView; private NotificationEntry mShowingEntry; - private Rect mLayoutedIconRect = new Rect(); - private int[] mTmpPosition = new int[2]; - private boolean mFirstLayout = true; - private int mMaxWidth; - private int mSysWinInset; - private int mCutOutInset; - private Rect mIconDrawingRect = new Rect(); - private Point mDisplaySize; private Runnable mOnDrawingRectChangedListener; public HeadsUpStatusBarView(Context context) { @@ -75,40 +63,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { public HeadsUpStatusBarView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - Resources res = getResources(); - mAbsoluteStartPadding = res.getDimensionPixelSize(R.dimen.notification_side_paddings) - + res.getDimensionPixelSize( - com.android.internal.R.dimen.notification_content_margin_start); - mEndMargin = res.getDimensionPixelSize( - com.android.internal.R.dimen.notification_content_margin_end); - setPaddingRelative(mAbsoluteStartPadding, 0, mEndMargin, 0); - updateMaxWidth(); - } - - private void updateMaxWidth() { - int maxWidth = getResources().getDimensionPixelSize(R.dimen.qs_panel_width); - if (maxWidth != mMaxWidth) { - // maxWidth doesn't work with fill_parent, let's manually make it at most as big as the - // notification panel - mMaxWidth = maxWidth; - requestLayout(); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (mMaxWidth > 0) { - int newSize = Math.min(MeasureSpec.getSize(widthMeasureSpec), mMaxWidth); - widthMeasureSpec = MeasureSpec.makeMeasureSpec(newSize, - MeasureSpec.getMode(widthMeasureSpec)); - } - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - updateMaxWidth(); } @Override @@ -116,7 +70,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { Bundle bundle = new Bundle(); bundle.putParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE, super.onSaveInstanceState()); - bundle.putBoolean(FIRST_LAYOUT, mFirstLayout); bundle.putInt(VISIBILITY, getVisibility()); bundle.putFloat(ALPHA, getAlpha()); @@ -125,7 +78,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { @Override public void onRestoreInstanceState(Parcelable state) { - if (state == null || !(state instanceof Bundle)) { + if (!(state instanceof Bundle)) { super.onRestoreInstanceState(state); return; } @@ -133,7 +86,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { Bundle bundle = (Bundle) state; Parcelable superState = bundle.getParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE); super.onRestoreInstanceState(superState); - mFirstLayout = bundle.getBoolean(FIRST_LAYOUT, true); if (bundle.containsKey(VISIBILITY)) { setVisibility(bundle.getInt(VISIBILITY)); } @@ -185,70 +137,22 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mIconPlaceholder.getLocationOnScreen(mTmpPosition); - int left = (int) (mTmpPosition[0] - getTranslationX()); + int left = mTmpPosition[0]; int top = mTmpPosition[1]; int right = left + mIconPlaceholder.getWidth(); int bottom = top + mIconPlaceholder.getHeight(); mLayoutedIconRect.set(left, top, right, bottom); updateDrawingRect(); - int targetPadding = mAbsoluteStartPadding + mSysWinInset + mCutOutInset; - boolean isRtl = isLayoutRtl(); - int start = isRtl ? (mDisplaySize.x - right) : left; - if (start != targetPadding) { - int newPadding = targetPadding - start + getPaddingStart(); - setPaddingRelative(newPadding, 0, mEndMargin, 0); - } - if (mFirstLayout) { - // we need to do the padding calculation in the first frame, so the layout specified - // our visibility to be INVISIBLE in the beginning. let's correct that and set it - // to GONE. - setVisibility(GONE); - mFirstLayout = false; - } - } - - /** In order to do UI alignment, this view will be notified by - * {@link com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout}. - * After scroller laid out, the scroller will tell this view about scroller's getX() - * @param translationX how to translate the horizontal position - */ - public void setPanelTranslation(float translationX) { - setTranslationX(translationX); - updateDrawingRect(); } private void updateDrawingRect() { float oldLeft = mIconDrawingRect.left; mIconDrawingRect.set(mLayoutedIconRect); - mIconDrawingRect.offset((int) getTranslationX(), 0); if (oldLeft != mIconDrawingRect.left && mOnDrawingRectChangedListener != null) { mOnDrawingRectChangedListener.run(); } } - @Override - protected boolean fitSystemWindows(Rect insets) { - boolean isRtl = isLayoutRtl(); - mSysWinInset = isRtl ? insets.right : insets.left; - DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout(); - mCutOutInset = (displayCutout != null) - ? (isRtl ? displayCutout.getSafeInsetRight() : displayCutout.getSafeInsetLeft()) - : 0; - - getDisplaySize(); - - // For Double Cut Out mode, the System window navigation bar is at the right - // side of the left cut out. In this condition, mSysWinInset include the left cut - // out width so we set mCutOutInset to be 0. For RTL, the condition is the same. - // The navigation bar is at the left side of the right cut out and include the - // right cut out width. - if (mSysWinInset != 0) { - mCutOutInset = 0; - } - - return super.fitSystemWindows(insets); - } - public NotificationEntry getShowingEntry() { return mShowingEntry; } @@ -264,17 +168,4 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { public void setOnDrawingRectChangedListener(Runnable onDrawingRectChangedListener) { mOnDrawingRectChangedListener = onDrawingRectChangedListener; } - - private void getDisplaySize() { - if (mDisplaySize == null) { - mDisplaySize = new Point(); - } - getDisplay().getRealSize(mDisplaySize); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - getDisplaySize(); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index f4830fbb0028..878fbbf39627 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -18,9 +18,7 @@ package com.android.systemui.statusbar.phone; import android.graphics.Point; import android.graphics.Rect; -import android.view.DisplayCutout; import android.view.View; -import android.view.WindowInsets; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ViewClippingUtil; @@ -61,7 +59,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, private final NotificationPanelViewController mNotificationPanelViewController; private final Consumer<ExpandableNotificationRow> mSetTrackingHeadsUp = this::setTrackingHeadsUp; - private final Runnable mUpdatePanelTranslation = this::updatePanelTranslation; private final BiConsumer<Float, Float> mSetExpandedHeight = this::setAppearFraction; private final KeyguardBypassController mBypassController; private final StatusBarStateController mStatusBarStateController; @@ -75,9 +72,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, float mAppearFraction; private ExpandableNotificationRow mTrackedChild; private boolean mShown; - private final View.OnLayoutChangeListener mStackScrollLayoutChangeListener = - (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) - -> updatePanelTranslation(); private final ViewClippingUtil.ClippingParameters mParentClippingParams = new ViewClippingUtil.ClippingParameters() { @Override @@ -134,10 +128,8 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mStackScrollerController = stackScrollerController; mNotificationPanelViewController = notificationPanelViewController; notificationPanelViewController.addTrackingHeadsUpListener(mSetTrackingHeadsUp); - notificationPanelViewController.setVerticalTranslationListener(mUpdatePanelTranslation); notificationPanelViewController.setHeadsUpAppearanceController(this); mStackScrollerController.addOnExpandedHeightChangedListener(mSetExpandedHeight); - mStackScrollerController.addOnLayoutChangeListener(mStackScrollLayoutChangeListener); mStackScrollerController.setHeadsUpAppearanceController(this); mClockView = clockView; mOperatorNameView = operatorNameView; @@ -174,7 +166,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mNotificationPanelViewController.setVerticalTranslationListener(null); mNotificationPanelViewController.setHeadsUpAppearanceController(null); mStackScrollerController.removeOnExpandedHeightChangedListener(mSetExpandedHeight); - mStackScrollerController.removeOnLayoutChangeListener(mStackScrollLayoutChangeListener); mDarkIconDispatcher.removeDarkReceiver(this); } @@ -189,63 +180,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, updateHeader(entry); } - /** To count the distance from the window right boundary to scroller right boundary. The - * distance formula is the following: - * Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * There are four modes MUST to be considered in Cut Out of RTL. - * No Cut Out: - * Scroller + NB - * NB + Scroller - * => SystemWindow = NavigationBar's width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * Corner Cut Out or Tall Cut Out: - * cut out + Scroller + NB - * NB + Scroller + cut out - * => SystemWindow = NavigationBar's width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * Double Cut Out: - * cut out left + Scroller + (NB + cut out right) - * SystemWindow = NavigationBar's width + cut out right width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * (cut out left + NB) + Scroller + cut out right - * SystemWindow = NavigationBar's width + cut out left width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * @return the translation X value for RTL. In theory, it should be negative. i.e. -Y - */ - private int getRtlTranslation() { - if (mPoint == null) { - mPoint = new Point(); - } - - int realDisplaySize = 0; - if (mStackScrollerController.getDisplay() != null) { - mStackScrollerController.getDisplay().getRealSize(mPoint); - realDisplaySize = mPoint.x; - } - - WindowInsets windowInset = mStackScrollerController.getRootWindowInsets(); - DisplayCutout cutout = (windowInset != null) ? windowInset.getDisplayCutout() : null; - int sysWinLeft = (windowInset != null) ? windowInset.getStableInsetLeft() : 0; - int sysWinRight = (windowInset != null) ? windowInset.getStableInsetRight() : 0; - int cutoutLeft = (cutout != null) ? cutout.getSafeInsetLeft() : 0; - int cutoutRight = (cutout != null) ? cutout.getSafeInsetRight() : 0; - int leftInset = Math.max(sysWinLeft, cutoutLeft); - int rightInset = Math.max(sysWinRight, cutoutRight); - - return leftInset + mStackScrollerController.getRight() + rightInset - realDisplaySize; - } - - public void updatePanelTranslation() { - float newTranslation; - if (mStackScrollerController.isLayoutRtl()) { - newTranslation = getRtlTranslation(); - } else { - newTranslation = mStackScrollerController.getLeft(); - } - newTranslation += mStackScrollerController.getTranslationX(); - mHeadsUpStatusBarView.setPanelTranslation(newTranslation); - } - private void updateTopEntry() { NotificationEntry newEntry = null; if (shouldBeVisible()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 7548d1c435ed..251ecc626387 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -343,8 +343,7 @@ public class UserSwitcherController implements Dumpable { true /* isGuest */, false /* isCurrent */, false /* isAddUser */, false /* isRestricted */, isSwitchToGuestEnabled); - // Don't call checkIfAddUserDisallowedByAdminOnly if - // config_guestUserAutoCreated=true. + checkIfAddUserDisallowedByAdminOnly(guestRecord); records.add(guestRecord); } else if (canCreateGuest) { guestRecord = new UserRecord(null /* info */, null /* picture */, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java index 6e0cbd9ecfa3..bca1227b7d35 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java @@ -202,6 +202,5 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { verify(mPanelView).removeTrackingHeadsUpListener(any()); verify(mPanelView).setHeadsUpAppearanceController(isNull()); verify(mStackScrollerController).removeOnExpandedHeightChangedListener(any()); - verify(mStackScrollerController).removeOnLayoutChangeListener(any()); } } diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java index cd332a68fa88..4946ad442b0a 100644 --- a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java +++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java @@ -125,7 +125,7 @@ public class AppPredictionPerUserService extends // connect with remote AppPredictionService instead for dark launch usesPeopleService = false; } - final boolean serviceExists = resolveService(sessionId, false, + final boolean serviceExists = resolveService(sessionId, true, usesPeopleService, s -> s.onCreatePredictionSession(context, sessionId)); if (serviceExists && !mSessionInfos.containsKey(sessionId)) { final AppPredictionSessionInfo sessionInfo = new AppPredictionSessionInfo( diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index 40e63dac72ea..422e8ae14862 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -413,6 +413,12 @@ public final class SensorPrivacyService extends SystemService { return; } + if (uid == Process.SYSTEM_UID) { + // If the system uid is being blamed for sensor access, the ui must be shown + // explicitly using SensorPrivacyManager#showSensorUseDialog + return; + } + synchronized (mLock) { if (mSuppressReminders.containsKey(new Pair<>(sensor, user))) { Log.d(TAG, @@ -421,11 +427,6 @@ public final class SensorPrivacyService extends SystemService { } } - if (uid == Process.SYSTEM_UID) { - enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor); - return; - } - // TODO: Handle reminders with multiple sensors // - If we have a likely activity that triggered the sensor use overlay a dialog over @@ -1241,6 +1242,18 @@ public final class SensorPrivacyService extends SystemService { } } + @Override + public void showSensorUseDialog(int sensor) { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + throw new SecurityException("Can only be called by the system uid"); + } + if (!isIndividualSensorPrivacyEnabled(mCurrentUser, sensor)) { + return; + } + enqueueSensorUseReminderDialogAsync( + -1, UserHandle.of(mCurrentUser), "android", sensor); + } + private void userSwitching(int from, int to) { boolean micState; boolean camState; diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 7c336d768006..f32aa2295cb8 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -101,7 +101,7 @@ public final class CachedAppOptimizer { // Defaults for phenotype flags. @VisibleForTesting static final Boolean DEFAULT_USE_COMPACTION = false; - @VisibleForTesting static final Boolean DEFAULT_USE_FREEZER = false; + @VisibleForTesting static final Boolean DEFAULT_USE_FREEZER = true; @VisibleForTesting static final int DEFAULT_COMPACT_ACTION_1 = COMPACT_ACTION_FILE; @VisibleForTesting static final int DEFAULT_COMPACT_ACTION_2 = COMPACT_ACTION_FULL; @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_1 = 5_000; @@ -276,7 +276,7 @@ public final class CachedAppOptimizer { DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ; @GuardedBy("mPhenotypeFlagLock") private volatile boolean mUseCompaction = DEFAULT_USE_COMPACTION; - private volatile boolean mUseFreezer = DEFAULT_USE_FREEZER; + private volatile boolean mUseFreezer = false; // set to DEFAULT in init() @GuardedBy("this") private int mFreezerDisableCount = 1; // Freezer is initially disabled, until enabled private final Random mRandom = new Random(); @@ -678,6 +678,8 @@ public final class CachedAppOptimizer { KEY_USE_FREEZER, DEFAULT_USE_FREEZER)) { mUseFreezer = isFreezerSupported(); updateFreezerDebounceTimeout(); + } else { + mUseFreezer = false; } final boolean useFreezer = mUseFreezer; diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 186986e17c14..d66d7ee99f2e 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -52,6 +52,7 @@ import android.view.Display; import android.view.DisplayInfo; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; import com.android.server.LocalServices; @@ -2127,7 +2128,7 @@ public class DisplayModeDirector { } } - private final class SensorObserver implements ProximityActiveListener, + private static final class SensorObserver implements ProximityActiveListener, DisplayManager.DisplayListener { private final String mProximitySensorName = null; private final String mProximitySensorType = Sensor.STRING_TYPE_PROXIMITY; @@ -2135,22 +2136,24 @@ public class DisplayModeDirector { private final BallotBox mBallotBox; private final Context mContext; private final Injector mInjector; + @GuardedBy("mSensorObserverLock") + private final SparseBooleanArray mDozeStateByDisplay = new SparseBooleanArray(); + private final Object mSensorObserverLock = new Object(); private DisplayManager mDisplayManager; private DisplayManagerInternal mDisplayManagerInternal; + @GuardedBy("mSensorObserverLock") private boolean mIsProxActive = false; - private final SparseBooleanArray mDozeStateByDisplay; SensorObserver(Context context, BallotBox ballotBox, Injector injector) { mContext = context; mBallotBox = ballotBox; mInjector = injector; - mDozeStateByDisplay = new SparseBooleanArray(); } @Override public void onProximityActive(boolean isActive) { - synchronized (mLock) { + synchronized (mSensorObserverLock) { if (mIsProxActive != isActive) { mIsProxActive = isActive; recalculateVotesLocked(); @@ -2166,7 +2169,7 @@ public class DisplayModeDirector { LocalServices.getService(SensorManagerInternal.class); sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this); - synchronized (mLock) { + synchronized (mSensorObserverLock) { for (Display d : mDisplayManager.getDisplays()) { mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d)); } @@ -2196,19 +2199,21 @@ public class DisplayModeDirector { void dumpLocked(PrintWriter pw) { pw.println(" SensorObserver"); - pw.println(" mIsProxActive=" + mIsProxActive); - pw.println(" mDozeStateByDisplay:"); - for (int i = 0; i < mDozeStateByDisplay.size(); i++) { - final int id = mDozeStateByDisplay.keyAt(i); - final boolean dozed = mDozeStateByDisplay.valueAt(i); - pw.println(" " + id + " -> " + dozed); + synchronized (mSensorObserverLock) { + pw.println(" mIsProxActive=" + mIsProxActive); + pw.println(" mDozeStateByDisplay:"); + for (int i = 0; i < mDozeStateByDisplay.size(); i++) { + final int id = mDozeStateByDisplay.keyAt(i); + final boolean dozed = mDozeStateByDisplay.valueAt(i); + pw.println(" " + id + " -> " + dozed); + } } } @Override public void onDisplayAdded(int displayId) { boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId)); - synchronized (mLock) { + synchronized (mSensorObserverLock) { mDozeStateByDisplay.put(displayId, isDozeState); recalculateVotesLocked(); } @@ -2217,7 +2222,7 @@ public class DisplayModeDirector { @Override public void onDisplayChanged(int displayId) { boolean wasDozeState = mDozeStateByDisplay.get(displayId); - synchronized (mLock) { + synchronized (mSensorObserverLock) { mDozeStateByDisplay.put(displayId, mInjector.isDozeState(mDisplayManager.getDisplay(displayId))); if (wasDozeState != mDozeStateByDisplay.get(displayId)) { @@ -2228,7 +2233,7 @@ public class DisplayModeDirector { @Override public void onDisplayRemoved(int displayId) { - synchronized (mLock) { + synchronized (mSensorObserverLock) { mDozeStateByDisplay.delete(displayId); recalculateVotesLocked(); } @@ -2519,6 +2524,9 @@ public class DisplayModeDirector { @Override public boolean isDozeState(Display d) { + if (d == null) { + return false; + } return Display.isDozeState(d.getState()); } diff --git a/services/core/java/com/android/server/wm/BlurController.java b/services/core/java/com/android/server/wm/BlurController.java index 03639449c3df..41d9dbf894f4 100644 --- a/services/core/java/com/android/server/wm/BlurController.java +++ b/services/core/java/com/android/server/wm/BlurController.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.os.PowerManager.THERMAL_STATUS_CRITICAL; import static android.view.CrossWindowBlurListeners.CROSS_WINDOW_BLUR_SUPPORTED; import android.content.BroadcastReceiver; @@ -45,6 +46,7 @@ final class BlurController { private final Object mLock = new Object(); private volatile boolean mBlurEnabled; private boolean mInPowerSaveMode; + private boolean mCriticalThermalStatus; private boolean mBlurDisabledSetting; private boolean mTunnelModeEnabled = false; @@ -89,6 +91,12 @@ final class BlurController { }); mBlurDisabledSetting = getBlurDisabledSetting(); + powerManager.addThermalStatusListener((status) -> { + mCriticalThermalStatus = status >= THERMAL_STATUS_CRITICAL; + updateBlurEnabled(); + }); + mCriticalThermalStatus = powerManager.getCurrentThermalStatus() >= THERMAL_STATUS_CRITICAL; + TunnelModeEnabledListener.register(mTunnelModeListener); updateBlurEnabled(); @@ -112,7 +120,7 @@ final class BlurController { private void updateBlurEnabled() { synchronized (mLock) { final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED && !mBlurDisabledSetting - && !mInPowerSaveMode && !mTunnelModeEnabled; + && !mInPowerSaveMode && !mTunnelModeEnabled && !mCriticalThermalStatus; if (mBlurEnabled == newEnabled) { return; } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java index 20a58426f1eb..a883293b13b9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java @@ -173,8 +173,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB); assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_FULL_DELTA_RSS_THROTTLE_KB); - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMaxOomAdj).isEqualTo( @@ -188,6 +186,10 @@ public final class CachedAppOptimizerTest { } assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle) .containsExactlyElementsIn(expected); + + Assume.assumeTrue(mCachedAppOptimizerUnderTest.isFreezerSupported()); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( + CachedAppOptimizer.DEFAULT_USE_FREEZER); } @Test @@ -244,9 +246,8 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ - 10), false); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CachedAppOptimizer.KEY_COMPACT_PROC_STATE_THROTTLE, "1,2,3", false); - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, CachedAppOptimizer.DEFAULT_USE_FREEZER ? "false" : "true", false); @@ -291,7 +292,8 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB + 1); assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle).containsExactly(1, 2, 3); - if (mCachedAppOptimizerUnderTest.isFreezerSupported()) { + Assume.assumeTrue(CachedAppOptimizer.isFreezerSupported()); + if (CachedAppOptimizer.isFreezerSupported()) { if (CachedAppOptimizer.DEFAULT_USE_FREEZER) { assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); } else { @@ -325,15 +327,15 @@ public final class CachedAppOptimizerTest { @Test public void useFreeze_doesNotListenToDeviceConfigChanges() throws InterruptedException { - Assume.assumeTrue(mCachedAppOptimizerUnderTest.isFreezerSupported()); + Assume.assumeTrue(CachedAppOptimizer.isFreezerSupported()); - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); // The freezer DeviceConfig property is read at boot only - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "true", false); mCachedAppOptimizerUnderTest.init(); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isTrue(); mCountDown = new CountDownLatch(1); // No notifications should get to the cached app optimizer. @@ -346,14 +348,13 @@ public final class CachedAppOptimizerTest { // Set the flag the other way without rebooting. It shall not change. mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "false", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isTrue(); - // Now, set the flag to false and restart the cached app optimizer - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "false", false); mCachedAppOptimizerUnderTest.init(); @@ -380,18 +381,17 @@ public final class CachedAppOptimizerTest { @Test public void useFreeze_listensToDeviceConfigChangesBadValues() throws InterruptedException { - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); + Assume.assumeTrue(CachedAppOptimizer.isFreezerSupported()); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); // When we push an invalid flag value... - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "foobar", false); mCachedAppOptimizerUnderTest.init(); - // Then we set the default. - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); + // DeviceConfig treats invalid value as false + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); } @Test diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java index 68b2e6168b5c..c0c3e6f530db 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java @@ -60,7 +60,7 @@ final class SoundTriggerSessionPermissionsDecorator implements @Override public SoundTrigger.ModuleProperties getDspModuleProperties() throws RemoteException { - // No permission needed. + // No permission needed here (the app must have the Assistant Role to retrieve the session). return mDelegate.getDspModuleProperties(); } @@ -71,7 +71,9 @@ final class SoundTriggerSessionPermissionsDecorator implements if (DEBUG) { Slog.d(TAG, "startRecognition"); } - enforcePermissions(); + if (!isHoldingPermissions()) { + return SoundTrigger.STATUS_PERMISSION_DENIED; + } return mDelegate.startRecognition(i, s, iHotwordRecognitionStatusCallback, recognitionConfig, b); } @@ -80,25 +82,28 @@ final class SoundTriggerSessionPermissionsDecorator implements public int stopRecognition(int i, IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback) throws RemoteException { - enforcePermissions(); + // Stopping a model does not require special permissions. Having a handle to the session is + // sufficient. return mDelegate.stopRecognition(i, iHotwordRecognitionStatusCallback); } @Override public int setParameter(int i, int i1, int i2) throws RemoteException { - enforcePermissions(); + if (!isHoldingPermissions()) { + return SoundTrigger.STATUS_PERMISSION_DENIED; + } return mDelegate.setParameter(i, i1, i2); } @Override public int getParameter(int i, int i1) throws RemoteException { - enforcePermissions(); + // No permission needed here (the app must have the Assistant Role to retrieve the session). return mDelegate.getParameter(i, i1); } @Override public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException { - enforcePermissions(); + // No permission needed here (the app must have the Assistant Role to retrieve the session). return mDelegate.queryParameter(i, i1); } @@ -109,9 +114,15 @@ final class SoundTriggerSessionPermissionsDecorator implements } // TODO: Share this code with SoundTriggerMiddlewarePermission. - private void enforcePermissions() { - enforcePermissionForPreflight(mContext, mOriginatorIdentity, RECORD_AUDIO); - enforcePermissionForPreflight(mContext, mOriginatorIdentity, CAPTURE_AUDIO_HOTWORD); + private boolean isHoldingPermissions() { + try { + enforcePermissionForPreflight(mContext, mOriginatorIdentity, RECORD_AUDIO); + enforcePermissionForPreflight(mContext, mOriginatorIdentity, CAPTURE_AUDIO_HOTWORD); + return true; + } catch (SecurityException e) { + Slog.e(TAG, e.toString()); + return false; + } } /** |