From 3b3572a0afb0e22a1b9f3d3c9148e88c73e10b02 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 10 Aug 2019 10:03:37 -0700 Subject: [PATCH 01/11] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I2240ecdc42ce11d4806f7acf8ee8c1847517e0c5 --- res/values-b+sr+Latn/strings.xml | 2 +- res/values-de/strings.xml | 2 +- res/values-es-rUS/strings.xml | 2 +- res/values-hi/strings.xml | 128 +++++++++++++-------------- res/values-ja/strings.xml | 6 +- res/values-mr/strings.xml | 2 +- res/values-sq/strings.xml | 2 +- res/values-sr/strings.xml | 2 +- res/values-ta-television/strings.xml | 4 +- res/values-ta/strings.xml | 2 +- res/values-vi/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 6 +- 12 files changed, 80 insertions(+), 80 deletions(-) diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index c9fad6d42..e07d8ead5 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -176,7 +176,7 @@ "Prikaži sve dozvole (%1$s)" "Pogledajte sve aplikacije sa ovom dozvolom" "Aplikacije sa ovom dozvolom mogu: %1$s" - "Aplikacije sa ovom dozvolom mogu da pristupaju podacima o fizičkim aktivnostima, poput hodanja, vožnje bicikla, vožnje automobila, broja koraka i još mnogo toga" + "Aplikacije sa ovom dozvolom mogu da pristupaju podacima o fizičkim aktivnostima, poput hodanja, vožnje bicikla, vožnje automobila, broja koraka i drugo" "Aplikacije sa ovom dozvolom mogu da pristupaju kalendaru" "Aplikacije sa ovom dozvolom mogu da čitaju i dodaju stavke u evidenciju poziva na telefonu" "Aplikacije sa ovom dozvolom mogu da snimaju slike i video snimke" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 7d2a514e6..1b3462d38 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -53,7 +53,7 @@ "Diese App wurde für eine ältere Version von Android konzipiert. Wenn du keine Berechtigung erteilst, funktioniert die App möglicherweise nicht mehr ordnungsgemäß." "Unbekannte Aktion durchführen" - "%1$d von %2$d Apps berechtigt" + "%1$d von %2$d App/s berechtigt" "System-Apps anzeigen" "System ausblenden" "Keine Apps" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 5a474b516..8c12c75a2 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -41,7 +41,7 @@ "Permitir solo con la app en uso" "Permitir todo el tiempo" "Aplicaciones" - "Permisos de la app" + "Permisos de apps" "Administrador de permisos" "No volver a preguntar" "Sin permisos" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 7f6a3b4fa..390c66547 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -23,7 +23,7 @@ "ऐप्स नहीं मिला" "अस्वीकार करें" "अनुमति न दें और दोबारा न पूछें" - "इस्तेमाल के दौरान एक्सेस बनाए रखें" + "इस्तेमाल के दौरान ऐक्सेस बनाए रखें" "सेव करके रखें और दोबारा न पूछें" "ज़्यादा जानकारी" "फिर भी अस्वीकार करें" @@ -58,16 +58,16 @@ "सिस्टम छिपाएं" "कोई ऐप्स नहीं" "जगह की सेटिंग" - "%1$s इस डिवाइस के लिए जगह की जानकारी उपलब्‍ध कराता है. जगह की पहुंच (एक्सेस) को जगह की सेटिंग से बदला जा सकता है." + "%1$s इस डिवाइस के लिए जगह की जानकारी उपलब्‍ध कराता है. जगह की पहुंच (ऐक्सेस) को जगह की सेटिंग से बदला जा सकता है." "अगर आप इस अनुमति को अस्वीकार करते हैं, तो हो सकता है कि आपके डिवाइस की मूलभूत सुविधाएं जरूरी काम न कर पाएं." "नीति द्वारा लागू" - "नीति के मुताबिक बैकग्राउंड एक्सेस बंद किया गया" - "नीति के मुताबिक बैकग्राउंड एक्सेस चालू किया गया" - "नीति के मुताबिक फ़ोरग्राउंड एक्सेस चालू किया गया" + "नीति के मुताबिक बैकग्राउंड ऐक्सेस बंद किया गया" + "नीति के मुताबिक बैकग्राउंड ऐक्सेस चालू किया गया" + "नीति के मुताबिक फ़ोरग्राउंड ऐक्सेस चालू किया गया" "इसका नियंत्रण एडमिन के पास है" - "एडमिन ने बैकग्राउंड एक्सेस बंद किया है" - "एडमिन ने बैकग्राउंड एक्सेस चालू किया है" - "एडमिन ने फ़ोरग्राउंड एक्सेस चालू किया है" + "एडमिन ने बैकग्राउंड ऐक्सेस बंद किया है" + "एडमिन ने बैकग्राउंड ऐक्सेस चालू किया है" + "एडमिन ने फ़ोरग्राउंड ऐक्सेस चालू किया है" "काम करने के लिए डिवाइस को इस अनुमति की ज़रूरत है" @@ -93,8 +93,8 @@ "ऐप्लिकेशन चरणबद्ध किया जा रहा है…" "अज्ञात" "डैशबोर्ड" - "आखिरी बार एक्सेस: %1$s\nआखिरी बार का एक्सेस जब ऐप्लिकेशन इस्तेमाल किया जा रहा था" - "आखिरी बार एक्सेस: %1$s\nको आखिरी बार बैकग्राउंड में एक्सेस किया गया था" + "आखिरी बार ऐक्सेस: %1$s\nआखिरी बार का ऐक्सेस जब ऐप्लिकेशन इस्तेमाल किया जा रहा था" + "आखिरी बार ऐक्सेस: %1$s\nको आखिरी बार बैकग्राउंड में ऐक्सेस किया गया था" "कोई भी अनुमति" "किसी भी समय" "पिछले सात दिनों में" @@ -103,12 +103,12 @@ "पिछले 15 मिनट में" "आखिरी एक मिनट" "अनुमति का इस्तेमाल नहीं हुआ" - "किसी भी समय सबसे हाल ही में एक्सेस किए गए ऐप्लिकेशन" - "पिछले सात दिनों में सबसे हाल के एक्सेस" - "पिछले 24 घंटों में सबसे हाल में एक्सेस किए गए" - "पिछले एक घंटे में सबसे हाल में एक्सेस किए गए" - "पिछले 15 मिनट में सबसे हाल ही में एक्सेस किए गए ऐप्लिकेशन" - "पिछले एक मिनट में सबसे हाल में एक्सेस किए गए" + "किसी भी समय सबसे हाल ही में ऐक्सेस किए गए ऐप्लिकेशन" + "पिछले सात दिनों में सबसे हाल के ऐक्सेस" + "पिछले 24 घंटों में सबसे हाल में ऐक्सेस किए गए" + "पिछले एक घंटे में सबसे हाल में ऐक्सेस किए गए" + "पिछले 15 मिनट में सबसे हाल ही में ऐक्सेस किए गए ऐप्लिकेशन" + "पिछले एक मिनट में सबसे हाल में ऐक्सेस किए गए" "किसी भी समय इस्तेमाल की गई अनुमति" "पिछले सात दिनों में अनुमति का इस्तेमाल" "पिछले 24 घंटों में इस्तेमाल की गई अनुमतियां" @@ -126,7 +126,7 @@ "अनुमतियों के हिसाब से फ़िल्टर करें" "समय के अनुसार फ़िल्टर करना" "सबसे ज़्यादा ली गईं अनुमतियां" - "सबसे ज़्यादा बार किए गए एक्सेस" + "सबसे ज़्यादा बार किए गए ऐक्सेस" "हाल ही में" "ऐप के इस्तेमाल के मुताबिक क्रम" "समय के मुताबिक क्रम में लगाएं" @@ -137,57 +137,57 @@ %s ऐप्लिकेशन "ऐप्लिकेशन अनुमतियों इस्तेमाल" - "एक्सेस: %1$s बार. कुल अवधि: %2$s. आखिरी बार %3$s पहले इस्तेमाल किया गया." - "एक्सेस: %1$s बार. आखिरी बार %2$s पहले इस्तेमाल किया गया." + "ऐक्सेस: %1$s बार. कुल अवधि: %2$s. आखिरी बार %3$s पहले इस्तेमाल किया गया." + "ऐक्सेस: %1$s बार. आखिरी बार %2$s पहले इस्तेमाल किया गया." "मंज़ूरी दें" "हमेशा मंज़ूरी दें" "सिर्फ़ ऐप्लिकेशन इस्तेमाल करते समय अनुमति दें" "नामंज़ूर करें" "%1$s अनुमति" "इस ऐप्लिकेशन के लिए %1$s इस्तेमाल करने की अनुमति" - "%1$s ने %3$s पहले आपकी %2$s एक्सेस की" - "%1$s ने %2$s पहले आपकी शारीरिक गतिविधि की जानकारी एक्सेस की" - "%1$s ने %2$s पहले आपका कैलेंडर एक्सेस किया" - "%1$s ने %2$s पहले आपके कॉल लॉग एक्सेस किए" - "%1$s ने %2$s पहले आपका कैमरा एक्सेस किया" - "%1$s ने %2$s पहले आपके संपर्क एक्सेस किए" - "%1$s ने %2$s पहले आपकी जगह की जानकारी एक्सेस की" - "%1$s ने %2$s पहले आपका माइक्रोफ़ोन एक्सेस किया" - "%1$s ने %2$s पहले आपका फ़ोन एक्सेस किया" - "%1$s ने %2$s पहले आपके सेंसर एक्सेस किए" - "%1$s ने %2$s पहले आपके मैसेज (एसएमएस) एक्सेस किए" - "%1$s ने %2$s पहले आपके डिवाइस की मेमोरी एक्सेस की" - "%1$s ने आपकी %2$s एक्सेस नहीं की" - "%1$s ने आपकी शारीरिक गतिविधि की जानकारी एक्सेस नहीं की" - "%1$s ने आपका कैलेंडर एक्सेस नहीं किया" - "%1$s ने आपके कॉल लॉग एक्सेस नहीं किए" - "%1$s ने आपका कैमरा एक्सेस नहीं किया" - "%1$s ने आपके संपर्क एक्सेस नहीं किए" - "%1$s ने आपकी जगह की जानकारी एक्सेस नहीं की" - "%1$s ने आपका माइक्रोफ़ोन एक्सेस नहीं किया" - "%1$s ने आपका फ़ोन एक्सेस नहीं किया" - "%1$s ने आपके सेंसर एक्सेस नहीं किए" - "%1$s ने आपके मैसेज (एसएमएस) नहीं एक्सेस किए" - "%1$s ने आपके डिवाइस की मेमोरी एक्सेस नहीं की" + "%1$s ने %3$s पहले आपकी %2$s ऐक्सेस की" + "%1$s ने %2$s पहले आपकी शारीरिक गतिविधि की जानकारी ऐक्सेस की" + "%1$s ने %2$s पहले आपका कैलेंडर ऐक्सेस किया" + "%1$s ने %2$s पहले आपके कॉल लॉग ऐक्सेस किए" + "%1$s ने %2$s पहले आपका कैमरा ऐक्सेस किया" + "%1$s ने %2$s पहले आपके संपर्क ऐक्सेस किए" + "%1$s ने %2$s पहले आपकी जगह की जानकारी ऐक्सेस की" + "%1$s ने %2$s पहले आपका माइक्रोफ़ोन ऐक्सेस किया" + "%1$s ने %2$s पहले आपका फ़ोन ऐक्सेस किया" + "%1$s ने %2$s पहले आपके सेंसर ऐक्सेस किए" + "%1$s ने %2$s पहले आपके मैसेज (एसएमएस) ऐक्सेस किए" + "%1$s ने %2$s पहले आपके डिवाइस की मेमोरी ऐक्सेस की" + "%1$s ने आपकी %2$s ऐक्सेस नहीं की" + "%1$s ने आपकी शारीरिक गतिविधि की जानकारी ऐक्सेस नहीं की" + "%1$s ने आपका कैलेंडर ऐक्सेस नहीं किया" + "%1$s ने आपके कॉल लॉग ऐक्सेस नहीं किए" + "%1$s ने आपका कैमरा ऐक्सेस नहीं किया" + "%1$s ने आपके संपर्क ऐक्सेस नहीं किए" + "%1$s ने आपकी जगह की जानकारी ऐक्सेस नहीं की" + "%1$s ने आपका माइक्रोफ़ोन ऐक्सेस नहीं किया" + "%1$s ने आपका फ़ोन ऐक्सेस नहीं किया" + "%1$s ने आपके सेंसर ऐक्सेस नहीं किए" + "%1$s ने आपके मैसेज (एसएमएस) नहीं ऐक्सेस किए" + "%1$s ने आपके डिवाइस की मेमोरी ऐक्सेस नहीं की" "इस अनुमति को पिछली बार इस्तेमाल किए जाने का डेटा फ़िलहाल मौजूद नहीं है" "सभी %1$s अनुमतियां देखें" "इस अनुमति वाले सभी ऐप्लिकेशन देखें" "इस अनुमति वाली ऐप्लिकेशन %1$s कर सकते हैं" - "इसकी अनुमति वाले ऐप्लिकेशन आपकी शारीरिक गतिविधियों की जानकारी एक्सेस कर सकते हैं जिसमें चलने, साइकिल चलाने, गाड़ी चलाने और कदमों की संख्या जैसी कई जानकारियां शामिल हैं" - "इस अनुमति वाले ऐप्लिकेशन आपके \'कैलेंडर\' को एक्सेस कर सकते हैं" + "इसकी अनुमति वाले ऐप्लिकेशन आपकी शारीरिक गतिविधियों की जानकारी ऐक्सेस कर सकते हैं जिसमें चलने, साइकिल चलाने, गाड़ी चलाने और कदमों की संख्या जैसी कई जानकारियां शामिल हैं" + "इस अनुमति वाले ऐप्लिकेशन आपके \'कैलेंडर\' को ऐक्सेस कर सकते हैं" "ऐसे ऐप्लिकेशन जिनके पास अनुमति है, वे फ़ोन कॉल लॉग को पढ़ सकते हैं और लिख सकते हैं" "इस अनुमति वाले ऐप्लिकेशन फ़ोटो खींच सकते हैं और वीडियो रिकॉर्ड कर सकते हैं" - "इस अनुमति वाले ऐप्लिकेशन आपके संपर्कों को एक्सेस कर सकते हैं" - "इस अनुमति वाले ऐप्लिकेशन डिवाइस की जगह की जानकारी एक्सेस कर सकते हैं" + "इस अनुमति वाले ऐप्लिकेशन आपके संपर्कों को ऐक्सेस कर सकते हैं" + "इस अनुमति वाले ऐप्लिकेशन डिवाइस की जगह की जानकारी ऐक्सेस कर सकते हैं" "इस अनुमति वाले ऐप्लिकेशन ऑडियो रिकॉर्ड कर सकते हैं" "इस अनुमति वाले ऐप्लिकेशन फ़ोन कॉल कर सकते हैं और उन्हें प्रबंधित कर सकते हैं" - "इस अनुमति वाले ऐप्लिकेशन आपके बारे में खास जानकारी देने वाली चीज़ों के बारे में बताने वाले सेंसर डेटा को एक्सेस कर सकते हैं" + "इस अनुमति वाले ऐप्लिकेशन आपके बारे में खास जानकारी देने वाली चीज़ों के बारे में बताने वाले सेंसर डेटा को ऐक्सेस कर सकते हैं" "इस अनुमति वाले ऐप्लिकेशन मैसेज भेज और देख सकते हैं" - "इसकी अनुमति वाले ऐप्लिकेशन आपके डिवाइस के फ़ोटो, मीडिया, और फ़ाइलें एक्सेस कर सकते हैं" - "पिछली बार एक्सेस किया गया: %1$s" - "इस समय मना किया गया / आखिरी बार एक्सेस किया गया: %1$s" - "कभी एक्सेस नहीं किया गया" - "मंज़ूरी नहीं दी गई / कभी एक्सेस नहीं किया गया" + "इसकी अनुमति वाले ऐप्लिकेशन आपके डिवाइस के फ़ोटो, मीडिया, और फ़ाइलें ऐक्सेस कर सकते हैं" + "पिछली बार ऐक्सेस किया गया: %1$s" + "इस समय मना किया गया / आखिरी बार ऐक्सेस किया गया: %1$s" + "कभी ऐक्सेस नहीं किया गया" + "मंज़ूरी नहीं दी गई / कभी ऐक्सेस नहीं किया गया" "अनुमति है" "हमेशा के लिए मंज़ूरी दी गई है" "सिर्फ़ इस्तेमाल में होने पर अनुमति है" @@ -210,8 +210,8 @@ %s सेकंड "अनुमति रिमाइंडर" - "%s अब बैकग्राउंड में आपकी जगह की जानकारी एक्सेस कर सकता है" - "यह ऐप्लिकेशन हमेशा आपकी जगह की जानकारी एक्सेस कर सकता है. बदलने के लिए टैप करें." + "%s अब बैकग्राउंड में आपकी जगह की जानकारी ऐक्सेस कर सकता है" + "यह ऐप्लिकेशन हमेशा आपकी जगह की जानकारी ऐक्सेस कर सकता है. बदलने के लिए टैप करें." "सिर्फ़ ऐप्लिकेशन इस्तेमाल में होने के दौरान" "कोई अनुमति नहीं मिली है" "सभी अनुमतियां मंज़ूर की गई हैं" @@ -219,30 +219,30 @@ "किसी ऐप्लिकेशन को नामंज़ूर नहीं किया गया है" "चुनी गई अनुमति" "सेटिंग" - "%s को आपके डिवाइस पर पूरा एक्सेस मिला है" - "%s सुलभता ऐप्लिकेशन के पास आपके डिवाइस का पूरा एक्सेस है" + "%s को आपके डिवाइस पर पूरा ऐक्सेस मिला है" + "%s सुलभता ऐप्लिकेशन के पास आपके डिवाइस का पूरा ऐक्सेस है" "%s आपकी स्क्रीन, कार्रवाइयां, और इनपुट देख सकता है और आपके लिए काम कर सकता है. साथ ही, यह स्क्रीन के डिसप्ले को नियंत्रित भी कर सकता है." "ये ऐप्लिकेशन आपकी स्क्रीन, कार्रवाइयां और इनपुट देख सकते हैं, कार्रवाई कर सकते हैं और डिसप्ले को नियंत्रित कर सकते हैं." "डिफ़ॉल्ट सहायक ऐप्लिकेशन" "सहायक ऐप" "आप जो स्क्रीन देख रहे हैं, उसकी जानकारी के मुताबिक सहायक ऐप्लिकेशन आपकी मदद कर सकते हैं. कुछ ऐप्लिकेशन पर आपकी पूरी मदद करने के लिए लॉन्चर और बोलकर फ़ोन को निर्देश देना, ये दोनों सेवाएं काम करती हैं." "%1$s को अपना डिफ़ॉल्ट सहायता ऐप्लिकेशन सेट करें?" - "मैसेज, कॉल लॉग का एक्सेस पाएं" + "मैसेज, कॉल लॉग का ऐक्सेस पाएं" "डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन" "ब्राउज़र ऐप्लिकेशन" - "ऐसे ऐप्लिकेशन जो आपको इंटरनेट का एक्सेस देते हैं और टैप करने के लिए डिसप्ले लिंक देते हैं" + "ऐसे ऐप्लिकेशन जो आपको इंटरनेट का ऐक्सेस देते हैं और टैप करने के लिए डिसप्ले लिंक देते हैं" "%1$s को अपने डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन के तौर पर सेट करें?" "अनुमति की ज़रूरत नहीं है" "डिफ़ॉल्ट फ़ोन ऐप्लिकेशन" "फ़ोन ऐप्लिकेशन" "ऐसे ऐप्लिकेशन जिनकी मदद से आप अपने डिवाइस से टेलीफ़ोन कॉल कर सकते हैं और इनकमिंग कॉल का जवाब दे सकते हैं" "%1$s को आपके डिफ़ॉल्ट फ़ोन ऐप्लिकेशन के तौर पर सेट करें?" - "कॉल लॉग का एक्सेस मिलता है, मैसेज भेजें" + "कॉल लॉग का ऐक्सेस मिलता है, मैसेज भेजें" "मैसेज का डिफ़ॉल्ट ऐप्लिकेशन" "मैसेज (एसएमएस) ऐप्लिकेशन" "ऐसे ऐप्लिकेशन जिनकी मदद से आप अपने फ़ोन नंबर का इस्तेमाल मैसेज, फ़ोटो, वीडियो के साथ ही दूसरी चीज़ें भेजने और पाने के लिए कर सकते हैं" "%1$s को अपने डिफ़ॉल्ट मैसेज ऐप्लिकेशन के तौर पर सेट करें?" - "संपर्कों, मैसेज, फ़ोन का एक्सेस मिलता है" + "संपर्कों, मैसेज, फ़ोन का ऐक्सेस मिलता है" "डिफ़ॉल्ट इमरजेंसी ऐप्लिकेशन" "आपातकालीन ऐप्लिकेशन" "ऐसे ऐप्लिकेशन जिनका इस्तेमाल आप अपनी मेडिकल जानकारी रिकॉर्ड कर सकते हैं और इसे आपातकाल में मदद करने वालों को उपलब्ध करा सकते हैं, मौसम में गंभीर गड़बड़ी के बारे में अलर्ट पाने के लिए, मदद की ज़रूरत पड़ने पर दूसरों को सूचित करने लिए कर सकते हैं" @@ -250,7 +250,7 @@ "किसी अनुमति की ज़रूरत नहीं है" "डिफ़ॉल्ट होम ऐप्लिकेशन" "होम ऐप्लिकेशन" - "ऐप्लिकेशन जिन्हें अक्सर लॉन्चर कहा जाता है, वे आपके Android डिवाइस पर होम स्क्रीन की जगह ले लेते हैं और आपको डिवाइस की सामग्रियों और सुविधाओं का एक्सेस देते हैं" + "ऐप्लिकेशन जिन्हें अक्सर लॉन्चर कहा जाता है, वे आपके Android डिवाइस पर होम स्क्रीन की जगह ले लेते हैं और आपको डिवाइस की सामग्रियों और सुविधाओं का ऐक्सेस देते हैं" "%1$s को अपने डिफ़ॉल्ट होम ऐप्लिकेशन के तौर पर सेट करना चाहते हैं?" "अनुमति की ज़रूरत नहीं है" "कॉल रीडायरेक्ट का डिफ़ॉल्ट ऐप" @@ -289,7 +289,7 @@ "कोई ऐप्लिकेशन नहीं" "वर्क प्रोफ़ाइल का इस्तेमाल नहीं किया जा सकता" "ध्यान दें : अगर डिवाइस को रीस्टार्ट करते समय उसकी स्क्रीन लॉक है, तो यह ऐप्लिकेशन तब तक शुरू नहीं होगा, जब तक आप डिवाइस को अनलॉक नहीं करते." - "Assistant आपके सिस्टम पर इस्तेमाल किए जा रहे ऐप्लिकेशन की जानकारी देख पाएगी. इसमें आपकी स्क्रीन पर दिखाई देने वाली या ऐप्लिकेशन की एक्सेस करने लायक जानकारी शामिल होगी." + "Assistant आपके सिस्टम पर इस्तेमाल किए जा रहे ऐप्लिकेशन की जानकारी देख पाएगी. इसमें आपकी स्क्रीन पर दिखाई देने वाली या ऐप्लिकेशन की ऐक्सेस करने लायक जानकारी शामिल होगी." "डीबग करने की प्रक्रिया का डेटा शेयर करें" "डीबग करने की ज़्यादा जानकारी शेयर करना चाहते हैं?" "%1$s डीबग करने की जानकारी अपलोड करना चाहता है." @@ -306,5 +306,5 @@ "आगे दिए गए ऐप्लिकेशन का इस्तेमाल हाइलाइट करें" "Assistant ट्रिगर पहचान दिखाएं" "आवाज़ से डिवाइस का इस्तेमाल करने के लिए, माइक्रोफ़ोन का इस्तेमाल करते समय स्टेटस बार में आइकॉन दिखाएं" - "<b>%1$s</b> को अपने डिवाइस में मौजूद फ़ोटो और मीडिया एक्सेस करने की अनुमति देना चाहते हैं?" + "<b>%1$s</b> को अपने डिवाइस में मौजूद फ़ोटो और मीडिया ऐक्सेस करने की अनुमति देना चाहते हैं?" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index d8ae4e1a7..0d6acb86f 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -146,7 +146,7 @@ "%1$sの権限" "このアプリの%1$sへのアクセス権限" "%1$s%3$s前に%2$sにアクセスしました" - "%1$s%2$s前に運動データにアクセスしました" + "%1$s%2$s前に身体活動にアクセスしました" "%1$s%2$s前にカレンダーにアクセスしました" "%1$s%2$s前に通話履歴にアクセスしました" "%1$s%2$s前にカメラにアクセスしました" @@ -158,7 +158,7 @@ "%1$s%2$s前に SMS にアクセスしました" "%1$s%2$s前にストレージにアクセスしました" "%1$s%2$sにアクセスしていません" - "%1$sは運動データにアクセスしていません" + "%1$sは身体活動にアクセスしていません" "%1$sはカレンダーにアクセスしていません" "%1$sが通話履歴にアクセスしました" "%1$sはカメラにアクセスしていません" @@ -173,7 +173,7 @@ "%1$sの権限をすべて表示" "この権限があるアプリをすべて表示" "この権限があるアプリで可能な操作: %1$s" - "この権限があるアプリは、ウォーキング、自転車、運転、歩数など、運動データにアクセスできます" + "この権限があるアプリは、ウォーキング、自転車、運転、歩数など、身体活動にアクセスできます" "この権限があるアプリはカレンダーにアクセスできます" "この権限があるアプリは通話履歴の読み取りと書き込みを行えます" "この権限があるアプリは写真や動画を撮影できます" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 93a0c7ae1..977dd910f 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -176,7 +176,7 @@ "ही परवानगी असलेली अ‍ॅप्स तुमची शारीरिक अ‍ॅक्टिव्हिटी जसे चालणे, सायकल चालवणे, ड्राइव्ह करणे, किती पावले चाललात ती संख्या आणि आणखी बर्‍याच गोष्टी अ‍ॅक्सेस करू शकतात" "ही परवानगी असलेली अ‍ॅप्स तुमचे कॅलेंडर अ‍ॅक्सेस करू शकतात" "ही परवानगी असलेली अ‍ॅप्स फोन कॉल लॉग रीड आणि राइट करू शकतात" - "ही परवानगी असलेली अ‍ॅप्स फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू शकतात" + "ही परवानगी असलेली अ‍ॅप्स फोटो काढू आणि व्हिडिओ रेकॉर्ड करू शकतात" "ही परवानगी असलेली अ‍ॅप्स तुमचे संपर्क अ‍ॅक्सेस करू शकतात" "ही परवानगी असलेली अ‍ॅप्स या डिव्हाइसचे स्थान अ‍ॅक्सेस करू शकतात" "ही परवानगी असलेली अ‍ॅप्स ऑडिओ रेकॉर्ड करू शकतात" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index dbfbd407c..1bc888834 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -82,7 +82,7 @@ "Mbivendosja e ekranit u zbulua" "Për të ndryshuar këtë cilësim të lejes, në fillim duhet të çaktivizosh mbivendosjen e ekranit nga Cilësimet > Aplikacionet" "Hap cilësimet" - "Teknologjia \"Android\" që vishet" + "Android Wear" "Instalo/çinstalo veprimet që nuk mbështeten në teknologjinë që vishet." "Zgjidh se ku do të lejohet të ketë qasje <b>%1$s</b>" "<b>%1$s</b> është përditësuar. Zgjidh se ku do të lejohet të ketë qasje ky aplikacion." diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index e03405ea9..d88b9c9fe 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -176,7 +176,7 @@ "Прикажи све дозволе (%1$s)" "Погледајте све апликације са овом дозволом" "Апликације са овом дозволом могу: %1$s" - "Апликације са овом дозволом могу да приступају подацима о физичким активностима, попут ходања, вожње бицикла, вожње аутомобила, броја корака и још много тога" + "Апликације са овом дозволом могу да приступају подацима о физичким активностима, попут ходања, вожње бицикла, вожње аутомобила, броја корака и друго" "Апликације са овом дозволом могу да приступају календару" "Апликације са овом дозволом могу да читају и додају ставке у евиденцију позива на телефону" "Апликације са овом дозволом могу да снимају слике и видео снимке" diff --git a/res/values-ta-television/strings.xml b/res/values-ta-television/strings.xml index 786bbe28f..e79ff344a 100644 --- a/res/values-ta-television/strings.xml +++ b/res/values-ta-television/strings.xml @@ -20,8 +20,8 @@ "அமைப்புகள் > பயன்பாடுகள் என்பதில் பிறகு மாற்றலாம்" "%1$s / %2$s" "முறைமைப் பயன்பாடுகளைக் காட்டு" - "பயன்பாட்டு அனுமதிகள்" - "பயன்பாட்டு அனுமதிகள்" + "ஆப்ஸ் அனுமதிகள்" + "ஆப்ஸ் அனுமதிகள்" "%1$s அனுமதிகள்" "கூடுதல் அனுமதிகள்" "%1$s அனுமதிகள்" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index a7866a641..8c31aeaa3 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -41,7 +41,7 @@ "ஆப்ஸை உபயோகிக்கும்போது மட்டும் அனுமதி" "எப்போதும் அனுமதி" "ஆப்ஸ்" - "பயன்பாட்டு அனுமதிகள்" + "ஆப்ஸ் அனுமதிகள்" "அனுமதி நிர்வாகம்" "மீண்டும் கேட்காதே" "அனுமதிகள் இல்லை" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 681bc7bb1..0a6b252f2 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -81,7 +81,7 @@ "Yêu cầu quyền" "Đã phát hiện lớp phủ màn hình" "Để thay đổi cài đặt quyền này, trước tiên bạn phải tắt lớp phủ màn hình từ Cài đặt > Ứng dụng" - "Mở cài đặt" + "Mở phần cài đặt" "Android Wear" "Không hỗ trợ tác vụ Cài đặt/Gỡ cài đặt trên Wear." "Chọn cho phép <b>%1$s</b> truy cập những gì" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 4792dabfb..189feaeb9 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -146,7 +146,7 @@ "%1$s权限" "是否允许这个应用访问%1$s" "%1$s %3$s前访问过您的%2$s" - "%1$s %2$s前访问过您的健身运动" + "%1$s %2$s前获取过您的身体活动数据" "%1$s %2$s前访问过您的日历" "%1$s %2$s前访问过您的通话记录" "%1$s %2$s前访问过您的相机" @@ -158,7 +158,7 @@ "%1$s %2$s前访问过您的短信" "%1$s %2$s前访问过您的存储空间" "%1$s尚未访问您的%2$s" - "%1$s尚未访问您的健身运动" + "%1$s尚未获取您的身体活动数据" "%1$s尚未访问您的日历" "%1$s尚未访问您的通话记录" "%1$s尚未访问您的相机" @@ -173,7 +173,7 @@ "查看%1$s的所有权限" "查看具有此权限的所有应用" "具有此权限的应用可以%1$s" - "具有此权限的应用可以访问您的健身运动数据,例如步行、骑车、开车、步数等数据" + "具有此权限的应用可以获取您的身体活动数据,例如步行、骑车、开车、步数等数据" "具有此权限的应用可以访问您的日历" "具有此权限的应用可以读取和写入手机通话记录" "具有此权限的应用可以拍摄照片和录制视频" -- GitLab From 0e7ae6d3b060ab5a17d028f27401ec3716dfd0f7 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Mon, 19 Aug 2019 09:44:48 -0700 Subject: [PATCH 02/11] Cache PermissionInfos in whitelistAllSystemAppPermissions PermissionInfo-s are not per package. Hence instead of resolving them over and over again, cache already resolved PermissionInfo and reuse them. Before whitelistAllSystemAppPermissions took between 600 and 1100 ms on a crosshatch-eng. Now it takes between 200-350 ms. Test: Booted a few time and measured how long this method took Bug: 139485700 Fixes: 136682954 Change-Id: I83221f9fb2ed00b67957a633d26906f4d8aeb26e --- .../RuntimePermissionsUpgradeController.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java b/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java index cac2ef2cf..ff72b980a 100644 --- a/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java +++ b/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java @@ -25,6 +25,7 @@ import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.permission.PermissionManager; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import androidx.annotation.NonNull; @@ -88,6 +89,9 @@ class RuntimePermissionsUpgradeController { | PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.MATCH_FACTORY_ONLY); + // Cache permissionInfos + final ArrayMap permissionInfos = new ArrayMap<>(); + final int appCount = apps.size(); for (int i = 0; i < appCount; i++) { final PackageInfo app = apps.get(i); @@ -97,12 +101,16 @@ class RuntimePermissionsUpgradeController { } for (String requestedPermission : app.requestedPermissions) { - final PermissionInfo permInfo; - try { - permInfo = context.getPackageManager().getPermissionInfo( - requestedPermission, 0); - } catch (PackageManager.NameNotFoundException e) { - continue; + PermissionInfo permInfo = permissionInfos.get(requestedPermission); + if (permInfo == null) { + try { + permInfo = context.getPackageManager().getPermissionInfo( + requestedPermission, 0); + } catch (PackageManager.NameNotFoundException e) { + continue; + } + + permissionInfos.put(requestedPermission, permInfo); } if ((permInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED -- GitLab From 1719c99a5f31621c270ad10068e90eec48c61812 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Mon, 26 Aug 2019 13:11:44 -0700 Subject: [PATCH 03/11] Don't show Settings as a home app anywhere in UI. FallbackHome inside Settings should not be explicitly set as the home activity by user, which will prevent the device from getting a real home app running. It is already hidden in Default apps settings, but it needs to be hidden in the request role dialog as well. Fixes: 139919985 Test: Manually confirm Setting doesn't appear in request role dialog Test: or Default apps settings. Change-Id: I6f8e935ebc6ff3aed6a54c595a2e5492321432a8 --- .../role/model/HomeRoleBehavior.java | 11 ++++++++--- .../packageinstaller/role/model/Role.java | 17 +++++++++++++++++ .../role/model/RoleBehavior.java | 9 +++++++++ .../packageinstaller/role/ui/RoleLiveData.java | 3 +++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java b/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java index c59575de2..eb808acb0 100644 --- a/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java +++ b/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java @@ -125,13 +125,18 @@ public class HomeRoleBehavior implements RoleBehavior { preference.setOnSecondTargetClickListener(listener); } + @Override + public boolean isApplicationVisibleAsUser(@NonNull Role role, + @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user, + @NonNull Context context) { + // Home is not available for work profile, so we can just use the current user. + return !isSettingsApplication(applicationInfo, context); + } + @Override public void prepareApplicationPreferenceAsUser(@NonNull Role role, @NonNull Preference preference, @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user, @NonNull Context context) { - // Home is not available for work profile, so we can just use the current user. - boolean isSettingsApplication = isSettingsApplication(applicationInfo, context); - preference.setVisible(!isSettingsApplication); boolean missingWorkProfileSupport = isMissingWorkProfileSupport(applicationInfo, context); preference.setEnabled(!missingWorkProfileSupport); preference.setSummary(missingWorkProfileSupport ? context.getString( diff --git a/src/com/android/packageinstaller/role/model/Role.java b/src/com/android/packageinstaller/role/model/Role.java index 58cbf6226..e3332db00 100644 --- a/src/com/android/packageinstaller/role/model/Role.java +++ b/src/com/android/packageinstaller/role/model/Role.java @@ -368,6 +368,23 @@ public class Role { } } + /** + * Check whether a qualifying application should be visible to user. + * + * @param applicationInfo the {@link ApplicationInfo} for the application + * @param user the user for the application + * @param context the {@code Context} to retrieve system services + * + * @return whether the qualifying application should be visible to user + */ + public boolean isApplicationVisibleAsUser(@NonNull ApplicationInfo applicationInfo, + @NonNull UserHandle user, @NonNull Context context) { + if (mBehavior != null) { + return mBehavior.isApplicationVisibleAsUser(this, applicationInfo, user, context); + } + return true; + } + /** * Prepare a {@link Preference} for an application. * diff --git a/src/com/android/packageinstaller/role/model/RoleBehavior.java b/src/com/android/packageinstaller/role/model/RoleBehavior.java index 4a30d00ca..41ffb4559 100644 --- a/src/com/android/packageinstaller/role/model/RoleBehavior.java +++ b/src/com/android/packageinstaller/role/model/RoleBehavior.java @@ -83,6 +83,15 @@ public interface RoleBehavior { @NonNull TwoTargetPreference preference, @NonNull UserHandle user, @NonNull Context context) {} + /** + * @see Role#isApplicationVisibleAsUser(ApplicationInfo, UserHandle, Context) + */ + default boolean isApplicationVisibleAsUser(@NonNull Role role, + @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user, + @NonNull Context context) { + return true; + } + /** * @see Role#prepareApplicationPreferenceAsUser(Preference, ApplicationInfo, UserHandle, * Context) diff --git a/src/com/android/packageinstaller/role/ui/RoleLiveData.java b/src/com/android/packageinstaller/role/ui/RoleLiveData.java index 4b932b6f1..5a7b138bf 100644 --- a/src/com/android/packageinstaller/role/ui/RoleLiveData.java +++ b/src/com/android/packageinstaller/role/ui/RoleLiveData.java @@ -94,6 +94,9 @@ public class RoleLiveData extends AsyncTaskLiveData(qualifyingApplicationInfo, isHolderApplication)); } -- GitLab From 2053fa84e15492670692cb13bbe05748e84b2ebe Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Tue, 20 Aug 2019 16:49:11 -0700 Subject: [PATCH 04/11] updateUserSensitive asynchronously This is known to take 500ms and affects only UI, so can be done async Test: Ensure nothing looks badly broken; presubmit Fixes: 139485700 Change-Id: I3837404ea7d9b1598efa0d35cc999af0e86cc7f2 --- .../permission/service/PermissionControllerServiceImpl.java | 4 ++++ .../role/service/RoleControllerServiceImpl.java | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java b/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java index d846ce092..d0ee1809b 100644 --- a/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java +++ b/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java @@ -34,6 +34,7 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; +import android.os.Process; import android.os.UserHandle; import android.permission.PermissionControllerService; import android.permission.PermissionManager; @@ -569,6 +570,9 @@ public final class PermissionControllerServiceImpl extends PermissionControllerS AsyncTask.execute(() -> { onGrantOrUpgradeDefaultRuntimePermissions(); callback.run(); + + // Async part + Utils.updateUserSensitive(getApplication(), Process.myUserHandle()); }); } diff --git a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java index 1ba0e0ffd..fde630b50 100644 --- a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java +++ b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java @@ -29,7 +29,6 @@ import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; import com.android.packageinstaller.permission.utils.CollectionUtils; -import com.android.packageinstaller.permission.utils.Utils; import com.android.packageinstaller.role.model.Role; import com.android.packageinstaller.role.model.Roles; import com.android.packageinstaller.role.utils.PackageUtils; @@ -169,10 +168,6 @@ public class RoleControllerServiceImpl extends RoleControllerService { } } - // Load data on this thread instead of background. - // TODO: Move out of this thread - Utils.updateUserSensitive(getApplication(), Process.myUserHandle()); - return true; } -- GitLab From e8121111976a293e34b33fbced2424b997848d72 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 3 Sep 2019 00:34:10 -0700 Subject: [PATCH 05/11] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I309d921f7ba7947821a251bb53cd5ed2d7403ad9 --- res/values-be/strings.xml | 2 +- res/values-te/strings.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 0f6853013..0b10db1be 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -178,7 +178,7 @@ "Даныя пра апошні доступ цяпер недаступныя для гэтага дазволу" "Паказаць усе дазволы праграмы \"%1$s\"" "Паказаць усе праграмы з гэтым дазволам" - "Характарыстыка дазволу: %1$s" + "Праграмы з гэтым дазволам могуць выконваць наступныя дзеянні: %1$s" "Праграмы з гэтым дазволам могуць мець доступ да звестак пра вашу фізічную актыўнасць, напрыклад перамяшчэнні пешшу, язду на веласіпедзе, на аўтамабілі, колькасць крокаў і многае іншае" "Праграмы з гэтым дазволам могуць мець доступ да календара" "Праграмы з гэтым дазволам могуць чытаць журнал выклікаў тэлефона і рабіць у яго запісы" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 740789d68..d0edbe79f 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -53,8 +53,8 @@ "ఈ యాప్ పాత Android వెర్షన్ కోసం రూపొందించబడింది. అనుమతిని నిరాకరించినట్లయితే ఇది ఇకపై ఉద్దేశించిన రీతిలో పని చేయకపోవచ్చు." "తెలియని చర్యను చేస్తుంది" - "%2$dలో %1$d యాప్‌లు అనుమతించబడ్డాయి" - "సిస్టమ్‌ను చూపు" + "%2$d యాప్‌లలో %1$d యాప్‌లు అనుమతించబడ్డాయి" + "సిస్టమ్ ప్రాసెస్‌లను చూపు" "సిస్టమ్‌ను దాచు" "యాప్‌లు లేవు" "స్థాన సెట్టింగ్‌లు" @@ -77,7 +77,7 @@ "తిరస్కరించు" "లోడ్ అవుతోంది..." "అన్ని అనుమతులు" - "ఇతర అనువర్తన సామర్థ్యాలు" + "యాప్‌నకు మంజూరైన ఇతర అనుమతులు" "అనుమతి అభ్యర్థన" "స్క్రీన్ అతివ్యాప్తి గుర్తించబడింది" "ఈ అనుమతి సెట్టింగ్‌ను మార్చడానికి, మీరు ముందుగా సెట్టింగ్‌లు > అనువర్తనాల నుండి స్క్రీన్ అతివ్యాప్తిని ఆఫ్ చేయాలి" @@ -225,7 +225,7 @@ "ఈ యాప్‌లు మీ స్క్రీన్, చర్యలు, ఇన్‌పుట్‌లను చూడగలవు, చర్యలను అమలు చేయగలవు, అలాగే ప్రదర్శనను నియంత్రించగలవు." "డిఫాల్ట్ సహాయక యాప్" "సహాయక యాప్" - "సహాయక యాప్‌లు మీరు వీక్షిస్తున్న స్క్రీన్‌పై ఉన్న సమాచారం ఆధారంగా మీకు సహాయపడగలవు. కొన్ని యాప్‌లు మీకు సమగ్రమైన సహాయాన్ని అందించడానికి లాంచర్, వాయిస్ ఇన్‌పుట్ సేవలు రెండింటికీ మద్దతిస్తాయి." + "మీరు చూస్తోన్న స్క్రీన్‌పై ఉన్న సమాచారం ఆధారంగా, సహాయక యాప్‌లు మీకు సహాయపడగలవు. మీకు సమగ్రమైన సహాయాన్ని అందించడానికి, కొన్ని యాప్‌లు లాంచర్, వాయిస్ ఇన్‌పుట్ సేవలు రెండింటికీ మద్దతిస్తాయి." "%1$sను మీ డిఫాల్ట్ సహాయక యాప్‌గా సెట్ చేయాలా?" "SMS, కాల్ లాగ్‌లకు యాక్సెస్ పొందుతుంది" "డిఫాల్ట్ బ్రౌజర్ యాప్" -- GitLab From 076bb687968186c65bb429b5257d72598a1d594c Mon Sep 17 00:00:00 2001 From: Stanislav Zholnin Date: Wed, 4 Sep 2019 02:04:02 +0100 Subject: [PATCH 06/11] Fix the bug where backgroung permissions changes were not logged. Fix: 140501898 Test: make statsd_testdrive && ./out/host/linux-x86/bin/statsd_testdrive -p com.google.android.permissioncontroller 215 Change-Id: I8d2f5e87ac98c6e81c6afdb531dd61d2dc76ccea --- .../permission/ui/handheld/AppPermissionFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java index 214d72027..548545b5f 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java @@ -354,7 +354,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { return permissionSnapshot; } - permissions = mGroup.getPermissions(); + permissions = permissionGroup.getPermissions(); numPermissions = permissions.size(); for (int i = 0; i < numPermissions; i++) { -- GitLab From 36f401ded229f78db2e21006059af83f7c3cb2cd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 14 Sep 2019 05:42:06 -0700 Subject: [PATCH 07/11] Import translations. DO NOT MERGE Change-Id: I22ed63fa6dd2d84b4e5226bc4c1e1afe7dc060d2 Auto-generated-cl: translation import --- res/values-ca/strings.xml | 6 +++--- res/values-ta/strings.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 2cf650d3e..4cde13951 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -97,20 +97,20 @@ "Últim accés: %1$s\nÚltim accés en segon pla" "Qualsevol permís" "En qualsevol moment" - "Últims 7 dies" + "7 darrers dies" "Últimes 24 hores" "Última hora" "Últims 15 minuts" "Últim minut" "Cap ús de permisos" "Accés més recents en qualsevol moment" - "Accés més recents durant els 7 últims dies" + "Accés més recents durant els 7 darrers dies" "Accés més recent durant les últimes 24 hores" "Accés més recent durant l\'última hora" "Accés més recents durant els últims 15 minuts" "Accés més recents durant l\'últim minut" "Ús de permisos en qualsevol moment" - "Ús de permisos durant els últims 7 dies" + "Ús de permisos durant els 7 darrers dies" "Ús de permisos durant les últimes 24 hores" "Ús de permisos durant l\'última hora" "Ús de permisos durant els últims 15 minuts" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 8c31aeaa3..f8d982c7b 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -80,7 +80,7 @@ "ஆப்ஸின் பிற திறன்கள்" "அனுமதி கோரிக்கை" "திரையின் மேலே செயல்படும் பயன்பாடுகள் கண்டறியப்பட்டன" - "இந்த அனுமதியை மாற்ற, அமைப்புகள் > பயன்பாடுகள் என்பதற்குச் சென்று, திரையின் மேலே செயல்படும் பயன்பாடுகளை முதலில் முடக்கவும்" + "இந்த அனுமதியை மாற்ற, அமைப்புகள் > பயன்பாடுகள் என்பதற்குச் சென்று, திரையின் மேலே செயல்படும் ஆப்ஸை முதலில் முடக்கவும்" "அமைப்புகளைத் திற" "Android Wear" "Wear இல் நிறுவுதல்/நிறுவல் நீக்குதலுக்கு ஆதரவில்லை." -- GitLab From 570755eacdf4ff9241f56b1b4ad9456e194cce50 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Thu, 19 Sep 2019 12:38:42 -0700 Subject: [PATCH 08/11] [DO NOT MERGE] Move updateUserSenstive trigger to onGrantDefaultRoles We need to recalculate the user sensitivity every time a package is installed or changes. The logic to recalculate was moved to only during boot. Move it back to where it was before, but leave it async. Test: forcefully installed GooglePermissionsController to override out-of-date mainline module. Then verified that with code before this change user-sensitive was not updated for newly installed apps. With this change user-sensitive is updated Bug: 141311767 Change-Id: I6c100764850870e2e5d1ffe5fcd20b5cf2f94ed1 --- .../permission/service/PermissionControllerServiceImpl.java | 4 ---- .../role/service/RoleControllerServiceImpl.java | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java b/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java index d0ee1809b..d846ce092 100644 --- a/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java +++ b/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java @@ -34,7 +34,6 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; -import android.os.Process; import android.os.UserHandle; import android.permission.PermissionControllerService; import android.permission.PermissionManager; @@ -570,9 +569,6 @@ public final class PermissionControllerServiceImpl extends PermissionControllerS AsyncTask.execute(() -> { onGrantOrUpgradeDefaultRuntimePermissions(); callback.run(); - - // Async part - Utils.updateUserSensitive(getApplication(), Process.myUserHandle()); }); } diff --git a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java index fde630b50..bee43205a 100644 --- a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java +++ b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java @@ -19,6 +19,7 @@ package com.android.packageinstaller.role.service; import android.app.role.RoleControllerService; import android.app.role.RoleManager; import android.content.pm.ApplicationInfo; +import android.os.AsyncTask; import android.os.Process; import android.os.UserHandle; import android.util.ArrayMap; @@ -29,6 +30,7 @@ import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; import com.android.packageinstaller.permission.utils.CollectionUtils; +import com.android.packageinstaller.permission.utils.Utils; import com.android.packageinstaller.role.model.Role; import com.android.packageinstaller.role.model.Roles; import com.android.packageinstaller.role.utils.PackageUtils; @@ -168,6 +170,9 @@ public class RoleControllerServiceImpl extends RoleControllerService { } } + AsyncTask.execute( + () -> Utils.updateUserSensitive(getApplication(), Process.myUserHandle())); + return true; } -- GitLab From 0573d628b3ee3dc73f49920271a4d27f6c07e1d9 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Fri, 13 Sep 2019 15:09:54 -0700 Subject: [PATCH 09/11] [DO NOT MERGE] Grant all access_media_location permission Test: Manual testing: All combinations of - App targetSdk = 28 and 29 (and 22 for extra credit) - App having the tag for ACCESS_MEDIA_LOCATION or not - Upgrade from P->Q-QPR and from vanilla Q->Q-QPR Further upgrade of targetSdk from 28->29 while on Q-QPR ==> All permission behavior should make sense. Sometimes there are weird, but expected behaviors. Hence we need to collect the results and then look at the unexpected ones. See SplitPermissionTest for some tests I added for the location-background permission which was split from the fine/coarse-location permissions Bug: 140961754 Change-Id: I11f0b77d86d0c07b9bcd41eee337f36bacf0dabd --- .../RuntimePermissionsUpgradeController.java | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java b/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java index ff72b980a..438487ece 100644 --- a/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java +++ b/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java @@ -33,6 +33,7 @@ import androidx.annotation.NonNull; import com.android.packageinstaller.PermissionControllerStatsLog; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.Permission; +import com.android.packageinstaller.permission.utils.ArrayUtils; import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; @@ -45,7 +46,7 @@ class RuntimePermissionsUpgradeController { private static final String LOG_TAG = RuntimePermissionsUpgradeController.class.getSimpleName(); // The latest version of the runtime permissions database - private static final int LATEST_VERSION = 7; + private static final int LATEST_VERSION = 8; private RuntimePermissionsUpgradeController() { /* do nothing - hide constructor */ @@ -280,16 +281,55 @@ class RuntimePermissionsUpgradeController { currentVersion = 7; } + if (currentVersion == 7) { + Log.i(LOG_TAG, "Expanding read storage to access media location"); + + for (int i = 0; i < appCount; i++) { + final PackageInfo pkgInfo = apps.get(i); + + if (!ArrayUtils.contains(pkgInfo.requestedPermissions, + Manifest.permission.ACCESS_MEDIA_LOCATION)) { + continue; + } + + if (context.checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, 0, + pkgInfo.applicationInfo.uid) != PackageManager.PERMISSION_GRANTED) { + continue; + } + + final AppPermissionGroup group = AppPermissionGroup.create(context, pkgInfo, + Manifest.permission.ACCESS_MEDIA_LOCATION, false); + final Permission perm = group.getPermission( + Manifest.permission.ACCESS_MEDIA_LOCATION); + + if (!perm.isUserSet() && !perm.isSystemFixed() && !perm.isPolicyFixed() + && !perm.isGrantedIncludingAppOp()) { + group.grantRuntimePermissions(false, + new String[]{Manifest.permission.ACCESS_MEDIA_LOCATION}); + + logRuntimePermissionUpgradeResult(group, + pkgInfo.applicationInfo.uid, pkgInfo.packageName, + Manifest.permission.ACCESS_MEDIA_LOCATION); + } + } + + currentVersion = 8; + } + // XXX: Add new upgrade steps above this point. return currentVersion; } private static void logRuntimePermissionUpgradeResult(AppPermissionGroup permissionGroup, - int uid, String packageName) { + int uid, String packageName, String... filterPermissions) { ArrayList permissions = permissionGroup.getPermissions(); int numPermissions = permissions.size(); for (int i = 0; i < numPermissions; i++) { + if (filterPermissions != null && !ArrayUtils.contains(filterPermissions, permissions)) { + continue; + } + Permission permission = permissions.get(i); PermissionControllerStatsLog.write(RUNTIME_PERMISSIONS_UPGRADE_RESULT, permission.getName(), uid, packageName); -- GitLab From 1189512b64f1992b69634d715ac62a280ac55314 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 27 Sep 2019 17:57:46 -0700 Subject: [PATCH 10/11] Import translations. DO NOT MERGE Change-Id: Ib5fa114958e95e681fd5c23a09a8927829c72272 Auto-generated-cl: translation import --- res/values-ca/strings.xml | 2 +- res/values-eu/strings.xml | 2 +- res/values-kn/strings.xml | 2 +- res/values-mr/strings.xml | 2 +- res/values-my/strings.xml | 4 ++-- res/values-pt-rBR/strings.xml | 2 +- res/values-pt/strings.xml | 2 +- res/values-sl/strings.xml | 2 +- res/values-ta-television/strings.xml | 2 +- res/values-ta/strings.xml | 4 ++-- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 4cde13951..bca09ff2b 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -225,7 +225,7 @@ "Aquestes aplicacions poden veure la pantalla, les accions i el text que s\'introdueix, dur a terme accions i controlar la pantalla." "Aplicació d\'assistència predeterminada" "Aplicació d\'assistència" - "Les aplicacions d\'assistència et poden ajudar en funció de la informació que es mostri a la pantalla. Algunes aplicacions admeten tant els serveis de menú d\'aplicacions com els d\'entrada de veu per oferir-te una assistència integrada." + "Les aplicacions d\'assistència et poden ajudar en funció de la informació que es mostri a la pantalla. Algunes aplicacions admeten tant el menú d\'aplicacions com els serveis d\'entrada de veu per oferir-te una assistència integrada." "Vols establir %1$s com a aplicació d\'assistència predeterminada?" "Tindrà accés als SMS i al registre de trucades" "Aplicació de navegador predeterminada" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 450c29341..b70662341 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -98,7 +98,7 @@ "Edozein baimen" "Edonoiz" "Azken 7 egunetan" - "Azken 24 orduetan" + "Azken 24 orduetakoak" "Azken orduan" "Azken 15 minutuetan" "Azken minutuan" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 9f3b56196..50b438563 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -224,7 +224,7 @@ "%s ಸೇವೆಯು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್, ಕ್ರಿಯೆಗಳು ಮತ್ತು ಇನ್‌ಪುಟ್‌ಗಳು, ಕೆಲಸ ನಿರ್ವಹಣೆ ಕ್ರಿಯೆಗಳು ಮತ್ತು ಡಿಸ್‌ಪ್ಲೇ ನಿಯಂತ್ರಣವನ್ನು ವೀಕ್ಷಿಸಬಹುದು." "ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನಿಮ್ಮ ಪರದೆ, ಕ್ರಿಯೆಗಳು ಮತ್ತು ಇನ್‌ಪುಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು, ಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು, ಮತ್ತು ಡಿಸ್‌ಪ್ಲೇ ಅನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು." "ಡೀಫಾಲ್ಟ್ ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್" - "ಸಹಾಯ ಅಪ್ಲಿಕೇಶನ್" + "ಸಹಾಯಕ ಆ್ಯಪ್" "ನೀವು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸ್ಕ್ರೀನ್‌ನ ಮಾಹಿತಿಯನ್ನು ಆಧರಿಸಿ ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್‌ಗಳು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಬಹುದು. ಕೆಲವು ಆ್ಯಪ್‌ಗಳು ನಿಮಗೆ ಸಂಪೂರ್ಣ ಸಹಾಯವನ್ನು ಒದಗಿಸಲು ಲಾಂಚರ್ ಮತ್ತು ಧ್ವನಿ ಇನ್‌ಪುಟ್ ಸೇವೆಗಳೆರಡನ್ನೂ ಬೆಂಬಲಿಸುತ್ತವೆ." "%1$s ಆ್ಯಪ್ ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್ ಆಗಿ ಹೊಂದಿಸುವುದೇ?" "SMS, ಕರೆ ಲಾಗ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆದುಕೊಳ್ಳುತ್ತದೆ" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 977dd910f..76fe778a6 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -98,7 +98,7 @@ "कोणतीही परवानगी" "कधीही" "शेवटचे सात दिवस" - "गेल्या २४ तासात" + "गेल्या २४ तासांत" "शेवटचा एक तास" "शेवटची १५ मिनिटे" "शेवटचा एक मिनिट" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index d8205bec5..6227c4335 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -21,7 +21,7 @@ "ခွင့်ပြုချက်များ" "မလုပ်တော့" "အက်ပ်အားမတွေ့ပါ" - "ငြင်းပယ်သည်" + "ငြင်းပယ်ရန်" "ငြင်းပယ်သည်၊ ထပ်မမေးပါနှင့်" "အသုံးပြုနေစဉ် ဝင်သုံးခွင့်ကို သိမ်းထားပါ" "သိမ်းပါ၊ ထပ်မမေးပါနှင့်" @@ -225,7 +225,7 @@ "ဤအက်ပ်များက သင်၏ မျက်နှာပြင်၊ လုပ်ဆောင်ချက်များ၊ ထည့်သွင်းမှုများကို ကြည့်နိုင်ပြီး လုပ်ဆောင်ချက်များကို ဆောင်ရွက်နိုင်သည့်အပြင် မျက်နှာပြင်ပြသမှုကိုလည်း ထိန်းချုပ်နိုင်သည်။" "မူရင်း အကူအညီအက်ပ်" "အကူအညီ အက်ပ်" - "အကူအညီအက်ပ်များသည် သင်ကြည့်နေသည့် မျက်နှာပြင်မှ အချက်အလက်ကို အခြေခံ၍ ပံ့ပိုးပေးနိုင်ပါသည်။ ဘက်စုံ အထောက်အကူပေးနိုင်ရန်အတွက် အချို့အက်ပ်များသည် စဖွင့်စနစ်နှင့် အသံဖြင့်ထည့်သွင်းဝန်ဆောင်မှု နှစ်ခုလုံးကို ပံ့ပိုးပါသည်။" + "အကူအညီအက်ပ်သည် သင်ကြည့်နေသည့် မျက်နှာပြင်မှ အချက်အလက်ကို အခြေခံ၍ ကူညီနိုင်ပါသည်။ ဘက်စုံ အထောက်အကူပေးနိုင်ရန်အတွက် အချို့အက်ပ်များသည် launcher နှင့် အသံဖြင့်ထည့်သွင်းခြင်းတို့ကို ပံ့ပိုးပါသည်။" "%1$s ကို သင့်မူရင်း အကူအညီအက်ပ်အဖြစ် သတ်မှတ်လိုပါသလား။" "SMS နှင့် ခေါ်ဆိုမှတ်တမ်းကို ဝင်သုံးခွင့် ရယူသည်" "မူရင်း ဘရောင်ဇာအက်ပ်" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index a1f115c9d..8bc18f7ba 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -225,7 +225,7 @@ "Esses apps podem ver sua tela, ações e entradas, além de realizar ações e controlar a exibição." "App assistivo padrão" "App assistivo" - "Apps assistivos podem ajudar com base nas informações da tela que você vê no momento. Alguns apps são compatíveis com a tela de início e com serviços de entrada de texto por voz para oferecer assistência integrada." + "Apps assistivos podem ajudar com base nas informações que você vê na tela. Alguns apps oferecem tecnologia assistiva integrada, porque são compatíveis com a tela de início e com serviços de entrada de texto por voz." "Definir %1$s como seu app assistivo padrão?" "Recebe acesso a SMS e registro de chamadas" "App padrão de navegador" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index a1f115c9d..8bc18f7ba 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -225,7 +225,7 @@ "Esses apps podem ver sua tela, ações e entradas, além de realizar ações e controlar a exibição." "App assistivo padrão" "App assistivo" - "Apps assistivos podem ajudar com base nas informações da tela que você vê no momento. Alguns apps são compatíveis com a tela de início e com serviços de entrada de texto por voz para oferecer assistência integrada." + "Apps assistivos podem ajudar com base nas informações que você vê na tela. Alguns apps oferecem tecnologia assistiva integrada, porque são compatíveis com a tela de início e com serviços de entrada de texto por voz." "Definir %1$s como seu app assistivo padrão?" "Recebe acesso a SMS e registro de chamadas" "App padrão de navegador" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index c30d35d98..89b6dc2a4 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -239,7 +239,7 @@ "Te aplikacije si lahko ogledujejo zaslon, dejanja in vnose, izvajajo dejanja in upravljajo prikaz." "Privzeta aplikacija za pomoč" "Aplikacija za pomoč" - "Aplikacije za pomoč vam pomagajo na podlagi podatkov na zaslonu, ki si ga ogledujete. Nekatere aplikacije podpirajo storitve zaganjalnika in glasovnega vnosa pri zagotavljanju integrirane pomoči." + "Aplikacije za pomoč vam lahko pomagajo na podlagi podatkov na zaslonu, ki si ga ogledujete. Nekatere aplikacije podpirajo storitve zaganjalnika in glasovnega vnosa in vam tako zagotavljajo celovito pomoč." "Želite aplikacijo %1$s nastaviti kot privzeto aplikacijo za pomoč?" "Dobi dostop do sporočil SMS in dnevnika klicev" "Privzeti brskalnik" diff --git a/res/values-ta-television/strings.xml b/res/values-ta-television/strings.xml index e79ff344a..d467a86a1 100644 --- a/res/values-ta-television/strings.xml +++ b/res/values-ta-television/strings.xml @@ -17,7 +17,7 @@ "நிராகரி, மீண்டும் கேட்காதே" - "அமைப்புகள் > பயன்பாடுகள் என்பதில் பிறகு மாற்றலாம்" + "அமைப்புகள் > ஆப்ஸ் என்பதில் பிறகு மாற்றலாம்" "%1$s / %2$s" "முறைமைப் பயன்பாடுகளைக் காட்டு" "ஆப்ஸ் அனுமதிகள்" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index f8d982c7b..3411f2e5e 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -79,8 +79,8 @@ "எல்லா அனுமதிகளும்" "ஆப்ஸின் பிற திறன்கள்" "அனுமதி கோரிக்கை" - "திரையின் மேலே செயல்படும் பயன்பாடுகள் கண்டறியப்பட்டன" - "இந்த அனுமதியை மாற்ற, அமைப்புகள் > பயன்பாடுகள் என்பதற்குச் சென்று, திரையின் மேலே செயல்படும் ஆப்ஸை முதலில் முடக்கவும்" + "திரையின் மேலே செயல்படும் ஆப்ஸ் கண்டறியப்பட்டன" + "இந்த அனுமதியை மாற்ற, அமைப்புகள் > ஆப்ஸ் என்பதற்குச் சென்று, திரையின் மேலே செயல்படும் ஆப்ஸை முதலில் முடக்கவும்" "அமைப்புகளைத் திற" "Android Wear" "Wear இல் நிறுவுதல்/நிறுவல் நீக்குதலுக்கு ஆதரவில்லை." -- GitLab From 45d233b0f17f45619767d66e56a376701efda99c Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Thu, 26 Sep 2019 22:05:20 -0700 Subject: [PATCH 11/11] Update PermissionChecker usages to avoid unnecessary attribution. We had accidental usages of the PermissionChecker for cases where no private data was provided to the app but the checkPermission API on the latter also did blame data access on the app. The PermissionChecker was designed to handle IPC calls and not for generic API checks. To avoid future accidental incorrect PermissionChecker usages this change renames the existing APIs of the latter to clearly indicate that they should be used for data delivery and also adds sibling methods for doing the same permission checks for preflight purposes. Also the documentation is improved to furhter assist developers. In addition, this change fixes accidental permission checker usages that blame when they should not by using the new preflight flavor of the permission check APIs. Test: atest com.android.settingslib.location.RecentLocationAppsTest atest CtsPermissionTestCases added: LocationAccessCheckTest#notificationOnlyForAccessesSinceFeatureWasEnabled added: LocationAccessCheckTest#noNotificationIfFeatureDisabled added: LocationAccessCheckTest#noNotificationIfBlamerNotSystemOrLocationProvider added: LocationAccessCheckTest#testOpeningLocationSettingsDoesNotTriggerAccess bug:141028068 Merged-In: I902a0ab049783a222ac2acdfac93ecd49f34dece Change-Id: I902a0ab049783a222ac2acdfac93ecd49f34dece (cherry picked from commit 625b69e00869d041b3114346965cd72a5d5c3c6a) --- .../android/packageinstaller/Constants.java | 7 +++ .../service/LocationAccessCheck.java | 62 +++++++++++++++++-- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/com/android/packageinstaller/Constants.java b/src/com/android/packageinstaller/Constants.java index fa25bebc4..38a2e205d 100644 --- a/src/com/android/packageinstaller/Constants.java +++ b/src/com/android/packageinstaller/Constants.java @@ -73,6 +73,13 @@ public class Constants { */ public static final String PREFERENCES_FILE = "preferences"; + /** + * Key in the generic shared preferences that stores when the location access feature + * was enabled, specifically when it was picked up by the code managing the feature. + */ + public static final String KEY_LOCATION_ACCESS_CHECK_ENABLED_TIME = + "location_access_check_enabled_time"; + /** * Key in the generic shared preferences that stores when the last notification was shown by * {@link com.android.packageinstaller.permission.service.LocationAccessCheck} diff --git a/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java b/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java index 727808bc3..5d6425a3d 100644 --- a/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java +++ b/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java @@ -18,7 +18,7 @@ package com.android.packageinstaller.permission.service; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.app.AppOpsManager.OPSTR_FINE_LOCATION; -import static android.app.NotificationManager.IMPORTANCE_HIGH; +import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.PendingIntent.FLAG_ONE_SHOT; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import static android.app.PendingIntent.getBroadcast; @@ -42,6 +42,7 @@ import static android.provider.Settings.Secure.LOCATION_ACCESS_CHECK_INTERVAL_MI import static com.android.packageinstaller.Constants.EXTRA_SESSION_ID; import static com.android.packageinstaller.Constants.INVALID_SESSION_ID; import static com.android.packageinstaller.Constants.KEY_LAST_LOCATION_ACCESS_NOTIFICATION_SHOWN; +import static com.android.packageinstaller.Constants.KEY_LOCATION_ACCESS_CHECK_ENABLED_TIME; import static com.android.packageinstaller.Constants.LOCATION_ACCESS_CHECK_ALREADY_NOTIFIED_FILE; import static com.android.packageinstaller.Constants.LOCATION_ACCESS_CHECK_JOB_ID; import static com.android.packageinstaller.Constants.LOCATION_ACCESS_CHECK_NOTIFICATION_ID; @@ -57,7 +58,6 @@ import static com.android.packageinstaller.permission.utils.Utils.getParcelableE import static com.android.packageinstaller.permission.utils.Utils.getParentUserContext; import static com.android.packageinstaller.permission.utils.Utils.getStringExtraSafe; import static com.android.packageinstaller.permission.utils.Utils.getSystemServiceSafe; -import static com.android.packageinstaller.permission.utils.Utils.isLocationAccessCheckEnabled; import static java.lang.System.currentTimeMillis; import static java.util.concurrent.TimeUnit.DAYS; @@ -103,6 +103,7 @@ import androidx.core.util.Preconditions; import com.android.packageinstaller.PermissionControllerStatsLog; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.ui.AppPermissionActivity; +import com.android.packageinstaller.permission.utils.Utils; import com.android.permissioncontroller.R; import java.io.BufferedReader; @@ -297,7 +298,7 @@ public class LocationAccessCheck { NotificationChannel permissionReminderChannel = new NotificationChannel( PERMISSION_REMINDER_CHANNEL_ID, mContext.getString(R.string.permission_reminders), - IMPORTANCE_HIGH); + IMPORTANCE_LOW); notificationManager.createNotificationChannel(permissionReminderChannel); } @@ -338,7 +339,7 @@ public class LocationAccessCheck { @WorkerThread private void addLocationNotificationIfNeeded(@NonNull JobParameters params, @NonNull LocationAccessCheckJobService service) { - if (!isLocationAccessCheckEnabled()) { + if (!checkLocationAccessCheckEnabledAndUpdateEnabledTime()) { service.jobFinished(params, false); return; } @@ -480,9 +481,25 @@ public class LocationAccessCheck { for (int opNum = 0; opNum < numOps; opNum++) { OpEntry entry = packageOps.getOps().get(opNum); - if (entry.getLastAccessBackgroundTime(AppOpsManager.OP_FLAGS_ALL_TRUSTED) > 0) { - pkgsWithLocationAccess.add(userPkg); + // To protect against OEM apps that accidentally blame app ops on other packages + // since they can hold the privileged UPDATE_APP_OPS_STATS permission for location + // access in the background we trust only the OS and the location providers. Note + // that this mitigation only handles usage of AppOpsManager#noteProxyOp and not + // direct usage of AppOpsManager#noteOp, i.e. handles bad blaming and not bad + // attribution. + String proxyPackageName = entry.getProxyPackageName(); + if (proxyPackageName != null && !proxyPackageName.equals(OS_PKG) + && !lm.isProviderPackage(proxyPackageName)) { + continue; + } + // We show only bg accesses since the location access check feature was enabled + // to handle cases where the feature is remotely toggled since we don't want to + // notify for accesses before the feature was turned on. + long featureEnabledTime = getLocationAccessCheckEnabledTime(); + if (featureEnabledTime >= 0 && entry.getLastAccessBackgroundTime( + AppOpsManager.OP_FLAGS_ALL_TRUSTED) > featureEnabledTime) { + pkgsWithLocationAccess.add(userPkg); break; } } @@ -497,6 +514,39 @@ public class LocationAccessCheck { return pkgsWithLocationAccess; } + /** + * Checks whether the location access check feature is enabled and updates the + * time when the feature was first enabled. If the feature is enabled and no + * enabled time persisted we persist the current time as the enabled time. If + * the feature is disabled and an enabled time is persisted we delete the + * persisted time. + * + * @return Whether the location access feature is enabled. + */ + private boolean checkLocationAccessCheckEnabledAndUpdateEnabledTime() { + final long enabledTime = getLocationAccessCheckEnabledTime(); + if (Utils.isLocationAccessCheckEnabled()) { + if (enabledTime <= 0) { + mSharedPrefs.edit().putLong(KEY_LOCATION_ACCESS_CHECK_ENABLED_TIME, + currentTimeMillis()).commit(); + } + return true; + } else { + if (enabledTime > 0) { + mSharedPrefs.edit().remove(KEY_LOCATION_ACCESS_CHECK_ENABLED_TIME) + .commit(); + } + return false; + } + } + + /** + * @return The time the location access check was enabled, or 0 if not enabled. + */ + private long getLocationAccessCheckEnabledTime() { + return mSharedPrefs.getLong(KEY_LOCATION_ACCESS_CHECK_ENABLED_TIME, 0); + } + /** * Create a notification reminding the user that a package used the location. From this * notification the user can directly go to the screen that allows to change the permission. -- GitLab